Java網頁數據採集器[中篇-數據存儲]【轉載】

本期概述php

上期咱們學習了html頁面的數據採集,爲了方便咱們從此來調用收集到的數據,首先咱們須要學習下如何將這些採集到的數據存儲起來(MySql數據庫).html

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

 

關於Java操做MySqlmysql

在使用java 操做MySql數據庫以前 咱們須要在項目文件中導入 一個jar包(mysql-connector-java-5.1.18-bin)sql

能夠在MySql官網下載 Connector/J 5.1.18 數據庫

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

如何在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數據庫裏了.

原文地址:http://www.cnblogs.com/longwu/archive/2012/01/03/2310588.html

相關文章
相關標籤/搜索