Java網頁數據采集器[中篇-數據存儲]


本期概述

上期我們學習了html頁面的數據采集,為了方便我們今后來調用收集到的數據,首先我們需要學習下如何將這些采集到的數據存儲起來(MySql數據庫).

數據采集頁面 2011-2012賽季英超球隊戰績

 

關於Java操作MySql

在使用java 操作MySql數據庫之前 我們需要在項目文件中導入 一個jar包(mysql-connector-java-5.1.18-bin)

可以在MySql官網下載 Connector/J 5.1.18

第一次使用MySql?   請看 java連接MYSQL      

如何在java項目中導入jar包?

請看這個 Eclipse下如何導入jar包

關於MySql數據庫 

如果是初學者 想使用MySql數據庫的話 可以去這里 XAMPP中文官網  下載 XAMPP 套裝.

XAMPP(Apache+MySQL+PHP+PERL)是一個功能強大的建 XAMPP 軟件站集成軟件包, 而且一鍵式安裝, 無需修改配置文件,非常好用.  

 

好了, 需要准備的事宜都完成了,我們開始寫代碼.

打開MySql數據庫,創建數據庫 和表 (拷貝如下代碼 到mysql里直接執行即可).

創建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代碼, 這里簡單介紹下各個類以及類所包含的方法.

DataStorage類 以及包含的 dataStore()方法 用於數據收集和存儲  

DataStorage類
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
/**
* DataStorage類 用於數據的收集和存儲
*
@author SoFlash - 博客園 http://www.cnblogs.com/longwu
*/
public class DataStorage {

public void dataStore() {
// 首先用一個字符串 來裝載網頁鏈接
String strUrl = "http://www.footballresults.org/league.php?all=1&league=EngPrem";

String sqlLeagues = "";
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 = ""; // new 一個字符串來裝載 BufferedReader 讀取到的內容

// 定義3個正則 用於獲取我們需要的數據
String regularDate = "(\\d{1,2}\\.\\d{1,2}\\.\\d{4})";
String regularTwoTeam = ">[^<>]*</a>";
String regularResult = ">(\\d{1,2}-\\d{1,2})</TD>";

//創建 GroupMethod類的對象 gMethod 方便后期調用其類里的 regularGroup方法
GroupMethod gMethod = new GroupMethod();
//創建DataStructure數據結構 類的對象 用於數據下面的數據存儲
DataStructure ds = new DataStructure();
//創建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("")) {
//System.out.println("Date:" + strGet);
//將收集到的日期存在數據結構里
ds.date = strGet;
// 這里索引+1 是用於獲取后期的球隊數據
++index; // 因為在html頁面里 源代碼里 球隊數據是在剛好在日期之后
}
/**
* 用於獲取2個球隊的數據
*/
strGet = gMethod.regularGroup(regularTwoTeam, strRead);
if (!strGet.equals("") && index == 1) { // 索引為1的是主隊數據
// 通過subtring方法 分離出 主隊數據
strGet = strGet.substring(1, strGet.indexOf("</a>"));
//System.out.println("HomeTeam:" + strGet); // 打印出主隊
//將收集到的主隊名稱 存到 數據結構里
ds.homeTeam = strGet;
index++; // 索引+1之后 為2了
// 通過subtring方法 分離出 客隊
} else if (!strGet.equals("") && index == 2) { // 這里索引為2的是客隊數據
strGet = strGet.substring(1, strGet.indexOf("</a>"));
//System.out.println("AwayTeam:" + strGet); // 打印出客隊
//將收集到的客隊名稱 存到數據結構里
ds.awayTeam = strGet;
index = 0; //收集完客隊名稱后 需要將索引還原 用於收集下一條數據的主隊名稱
}
/**
* 用於獲取比賽結果
*/
strGet = gMethod.regularGroup(regularResult, strRead);
if (!strGet.equals("")) {
// 這里同樣用到了substring方法 來剔除'<' 和 "</TD>" 標簽 來獲取我們想要的比賽結果
strGet = strGet.substring(1, strGet.indexOf("</TD>"));
//System.out.println("Result:" + strGet);
ds.result = strGet; //將收集到的比賽結果存到數據結構里
//System.out.println();

//MySql插入語句
sqlLeagues = "INSERT INTO Premiership values(\""
+ ds.date + "\"," + "\"" + ds.homeTeam
+ "\"," + "\"" + ds.awayTeam + "\","+ "\"" + ds.result + "\")";
//調用MySql類的datatoMySql()方法 來執行 MySql插入語句
ms.datatoMySql(sqlLeagues);
i++; //每插入完一條記錄 i+1;
System.out.println("第"+i+"條數據插入成功");
}
}
// 當讀完數據后 記得關閉 BufferReader
br.close();
//System.out.println("共收集到" + i + "條比賽記錄");// 打印出循環次數
//當數據存儲完成后 打印出 收集球隊記錄數
System.out.println("數據存儲完畢,共插入數據庫"+i+"條記錄");
} catch (IOException e) {
// 如果出錯 拋出異常
e.printStackTrace();
}
}
}

 

 DataStructure類  簡單數據結構 里面包含了相應的字段  用於將收集的數據臨時性存儲

DataStructure 類
/**
* DataStructure 類 一個簡單的數據結構
*
@author SoFlash - 博客園 http://www.cnblogs.com/longwu
*/
public class DataStructure {
//定義數據字段
public String homeTeam;
public String awayTeam;
public String date;
public String result;
}

 

GroupMethod類 以及包含的  regularGroup()方法 用於正則匹配html 源代碼上的數據

GroupMethod 類
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* GroupMethod 類 用於匹配和抓取 html頁面的數據
*
@author SoFlash - 博客園 http://www.cnblogs.com/longwu
*/
public class GroupMethod {
// 傳入2個字符串參數 一個是pattern(我們使用的正則) 另一個matcher是html源代碼
public String regularGroup(String pattern, String matcher) {
Pattern p = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(matcher);
if (m.find()) { // 如果讀到
return m.group();// 返回捕獲的數據
} else {
return ""; // 否則返回一個空字符串
}
}
}

 

MySql類 以及包含的 datatoMySql() 方法 用於執行SQL插入語句 將臨時存儲在數據結構里的數據 插入到MySql數據庫中

MySql類
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
* MySql類用於實施MySql數據庫操作
*
@author SoFlash - 博客園 http://www.cnblogs.com/longwu
*/
public class MySql {

//定義MySql驅動,數據庫地址,數據庫用戶名 密碼, 執行語句和數據庫連接
public String driver = "com.mysql.jdbc.Driver";
public String url = "jdbc:mysql://127.0.0.1:3306/htmldatacollection";
public String user = "root";
public String password = "root";
public Statement stmt = null;
public Connection conn = null;

//創建一個插入數據的方法
public void datatoMySql(String insertSQl) {

try {
try {
Class.forName(driver).newInstance();
} catch (Exception e) {
System.out.println("Unable to find the local driver");
e.printStackTrace();
}
//創建連接
conn = DriverManager.getConnection(url, user, password);
//創建一個 Statement 對象來將 SQL 語句發送到數據庫
stmt = conn.createStatement();
} catch (SQLException e) {
e.printStackTrace();
}
try {
//執行SQL 插入語句
stmt.executeUpdate(insertSQl);
} catch (SQLException e) {
e.printStackTrace();
}
try {
//執行完 停止執行語句
stmt.close();
//執行完關閉數據庫連接
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}

 

Main 主函數 用於數據輸出

Main 主函數
/**
* Main 主函數 用於數據輸出
*
@author SoFlash - 博客園 http://www.cnblogs.com/longwu
*/
public class Main {
public static void main(String[] args) {
//在主函數里調用DataStorage類里的dataStore()方法
DataStorage ds = new DataStorage();
ds.dataStore();
}
}


運行查看
好了,下面我們來執行下 看看結果.

數據采集頁面 2011-2012賽季英超球隊戰績

Html頁面截圖-初始階段

 

MySql數據庫截圖-初始階段

 

Html頁面截圖-結束階段

 

MySql數據庫截圖-結束階段

一共收集到 189條記錄

MySql數據庫顯示 189 行數據

這樣,我們2011-2012英超聯盟賽季的比賽戰績就全部收集並存到MySql數據庫里了.  :)

附上源代碼下載   htmlDataStorage.zip

相關推薦 [點此查看目錄]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM