java在网页填写集数据,java网页数据采集(中篇-数据存储)
上期我們學習了html頁面的數據采集,為了方便我們今后來調用收集到的數據,首先我們需要學習下如何將這些采集到的數據存儲起來(MySql數據庫).
打開MySql數據庫,創建數據庫 和表 (拷貝如下代碼 到mysql里(如果沒有界面管理工具,就在DOS窗口里輸入創建數據庫的語句)直接執行即可).
創建MySql數據庫
#創建數據庫 htmldatacollection
CREATE DATABASE htmldatacollection;
#在創建表之前 我們需要使用數據庫htmldatacollection
use htmldatacollection;
#在數據庫里 創建一個表 Premiership 用于存儲我們收集到的數據
#這里為了方便 所有字段 全部是字符串格式
CREATE TABLE Premiership(
Date varchar(15),
HomeTeam varchar(20),
AwayTeam varchar(20),
Result varchar(20)
)
主程序代碼數據庫弄好了,我們開始實施java代碼,?這里簡單介紹下各個類以及類所包含的方法
DataStructure類? 簡單數據結構 里面包含了相應的字段? 用于將收集的數據臨時性存儲
package org.footballresults;
public class DataStructer {
public String hometeam ;
public String awayteam ;
public String date ;
public String result ;
}
GroupMethod類 以及包含的? regularGroup()方法 用于正則匹配html 源代碼上的數據
package org.footballresults;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class GroupMethod {
/**
* @param args
*/
// 傳入2個字符串參數 一個是pattern(我們使用的正則) 另一個matcher是html源代碼
public String regularGroup(String pattern, String matcher) {
// ……………………CASE_INSENSITIVE啟用不區分大小寫的匹配
// compile函數將給定的正則表達式編譯到具有給定的標志的模式p中
Pattern p = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE);
// 創建匹配給定輸入與此模式的匹配器m,其返回類型是 Matcher類型
//
Matcher m = p.matcher(matcher);
if (m.find()) { // 如果讀到
// group方法返回匹配操作所匹配的子序列等價于substring()方法
return matcher.substring(m.start(), m.end());// m.group();// 返回捕獲的數據
} else {
return ""; // 否則返回一個空值
}
}
}
MySql類 以及包含的 datatoMySql() 方法 用于執行SQL插入語句 將臨時存儲在數據結構里的數據 插入到MySql數據庫中
package org.footballresults;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
//MySql類用于實現數據庫的操作
public class MySql {
// 定義MySql驅動,數據庫地址,數據庫用戶名 密碼 執行語句 數據庫連接
public String driver = "com.mysql.jdbc.Driver";
public String url = "jdbc:mysql://127.0.1:3306/htmldatacollection";
public String user = "root";
public String password = "1";
public Statement stml = null;
public Connection conn = null;
// 插入數據
public void datatomysql(String sqlleague) {
try {
Class.forName(driver).newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
System.out.println("沒有找到數據庫驅動");
e.printStackTrace();
}
// 創建連接
try {
conn = DriverManager.getConnection(url, user, password);
if (conn == null)
System.out.println("數據庫連接失敗");
// 創建一個statement對象將sql語句發送到數據庫
stml = conn.createStatement();
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println("數據庫連接失敗");
e.printStackTrace();
}
// 執行sql插入語句
try {
stml.executeUpdate(sqlleague);
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println("數據導入失敗");
e.printStackTrace();
}
try {
// 結束插入語句
stml.close();
// 關閉數據庫連接
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 輸出數據
public void output() {
}
}
Main 主函數 用于數據輸出
package org.footballresults;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
/**
* Main主函數 用于數據采集
*
* @author SoFlash - 博客園 http://www.cnblogs.com/longwu
*/
public class Main {
public static void main(String[] args) {
// 首先用一個字符串 來裝載網頁鏈接
String strUrl = "http://www.footballresults.org/league.php?all=1&league=EngPrem";
String sqlleague = "";
try {
// 創建一個url對象來指向 該網站鏈接 括號里()裝載的是該網站鏈接的路徑
// 更多可以看看 http://wenku.baidu.com/view/8186caf4f61fb7360b4c6547.html
URL url = new URL(strUrl);
// InputStreamReader 是一個輸入流讀取器 用于將讀取的字節轉換成字符
// 更多可以看看 http://blog.sina.com.cn/s/blog_44a05959010004il.html
InputStreamReader isr = new InputStreamReader(url.openStream(),
"utf-8"); // 統一使用utf-8 編碼模式
// 使用 BufferedReader 來讀取 InputStreamReader 轉換成的字符
BufferedReader br = new BufferedReader(isr);
String strRead = ""; // 新增一個空字符串strRead來裝載 BufferedReader 讀取到的內容
// 定義3個正則 用于匹配我們需要的數據
String regularDate = "(\\d{1,2}\\.\\d{1,2}\\.\\d{4})";
String regularTwoTeam = ">[^<>]*";
String regularResult = ">(\\d{1,2}-\\d{1,2})";
// 創建一個GroupMethod類的對象 ,進行正則匹配
GroupMethod gMethod = new GroupMethod();
// 創建數據結構對象,存儲下面的數據
DataStructer ds = new DataStructer();
// 創建mysql類的對象 用于執行mysql語句;
MySql ms = new MySql();
int i = 0; // 定義一個i來記錄循環次數 即收集到的球隊比賽結果數
int index = 0; // 定義一個索引 用于獲取分離 2個球隊的數據 因為2個球隊正則是相同的
// 開始讀取數據 如果讀到的數據不為空 則往里面讀
while ((strRead = br.readLine()) != null) {
/**
* 用于捕獲日期數據
*/
String strGet = gMethod.regularGroup(regularDate, strRead);
// 如果捕獲到了符合條件的 日期數據 則打印出來
if (!strGet.equals("")) {
ds.date = strGet;
// System.out.println("Date:" + strGet);
// 這里索引+1 是用于獲取后期的球隊數據
++index; // 因為在html頁面里 源代碼里 球隊數據是在剛好在日期之后
}
/**
* 用于獲取2個球隊的數據
*/
strGet = gMethod.regularGroup(regularTwoTeam, strRead);
if (!strGet.equals("") && index == 1) { // 索引為1的是主隊數據
// 通過subtring方法 分離出 主隊數據
strGet = strGet.substring(1, strGet.indexOf(""));
ds.hometeam = strGet;
// System.out.println("HomeTeam:" + strGet); // 打印出主隊
index++; // 索引+1之后 為2了
// 通過subtring方法 分離出 客隊
} else if (!strGet.equals("") && index == 2) { // 這里索引為2的是客隊數據
strGet = strGet.substring(1, strGet.indexOf(""));
ds.awayteam = strGet;
// System.out.println("AwayTeam:" + strGet); // 打印出客隊
index = 0;
}
/**
* 用于獲取比賽結果
*/
strGet = gMethod.regularGroup(regularResult, strRead);
if (!strGet.equals("")) {
// 這里同樣用到了substring方法 來剔除'" 標簽 來獲取我們想要的比賽結果
strGet = strGet.substring(1, strGet.indexOf(""));
ds.result = strGet;
// System.out.println("Result:" + strGet);
// System.out.println();
// MySql插入語句
sqlleague = "INSERT INTO tt values(\"" + ds.date + "\","
+ "\"" + ds.hometeam + "\"," + "\"" + ds.awayteam
+ "\"," + "\"" + ds.result + "\")";
// 調用函數,將數據存入到數據庫中
ms.datatomysql(sqlleague);
i++;
System.out.println("第" + i + "條數據插入成功");
}
}
// 當讀完數據后 記得關閉 BufferReader
br.close();
// System.out.println("共收集到" + i + "條比賽記錄");// 打印出循環次數
System.out.println("數據存入完畢,共導入數據庫" + i + "記錄");
} catch (IOException e) {
// 如果出錯 拋出異常
e.printStackTrace();
}
}
}
運行查看好了,下面我們來執行下 看看結果.
這樣,我們2011-2012英超聯盟賽季的比賽戰績就全部收集并存到MySql數據庫里了. ?:)
總結
以上是生活随笔為你收集整理的java在网页填写集数据,java网页数据采集(中篇-数据存储)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nginx怎么轮询两台php,Nginx
- 下一篇: PHP密码复杂性验证,JS检查密码强度