Java網頁數據採集器[下篇-數據查詢]【轉載】

本期概述php

上一期咱們學習瞭如何將html採集到的數據存儲到MySql數據庫中,這期咱們來學習下如何在存儲的數據中查詢咱們實際想看到的數據.html

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

若是是初學者 如下可能對你有幫助mysql

  • Java如何操做MySql?

     在使用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裏建立數據庫,請看Java網頁數據採集器實例教程[中篇-數據存儲].

 

數據庫準備好了,咱們開始寫java程序代碼;

這期,咱們主要在MySql 類裏增長了一個數據查看的方法 queryMySql(),並增長了一個 DataQuery類, 包含了一些比賽結果的查詢方法.

 

主程序代碼

這裏簡單介紹下各個類以及包含的方法

DataCollectionAndStorage類 和裏面的dataCollectAndStore() 方法 用於Html數據採集和存儲

DataCollectionAndStorage類

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
/**
 * DataCollectionAndStorage類 用於數據的收集和存儲
 * @author SoFlash - 博客園  http://www.cnblogs.com/longwu
 */
public class DataCollectionAndStorage {
   /**
    * dataCollectAndStore()方法  用於Html數據收集和存儲
    */
    public void dataCollectAndStore() {
        // 首先用一個字符串 來裝載網頁連接
        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();
        }
    }
}

 

DataQuery類 裏面有4個方法

  1. initialDataBase() 用於清空數據庫裏的全部比賽數據 
  2. getAllTeams()    用於獲取當前數據庫裏全部球隊的名字
  3. querySpecifiedTeam()   用於查詢具體球隊的比賽狀況 (能夠查看你喜歡的球隊比賽結果)
  4. queryByDate()  用於查詢具體日期的比賽 (查詢某一天的比賽結果)
DataQuery 類

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
/**
 * DataQuery 類  用於查詢數據庫裏的信息 包含了不一樣的方法
 * @author SoFlash - 博客園  http://www.cnblogs.com/longwu
 */
public class DataQuery {
    /**
     * 用於清空數據庫裏比賽結果
     */
    public void initialDataBase() {
        String initialSql = "delete from premiership";
        MySql ms = new MySql();
        try {
            //MySql類裏 提供了一個 刪除數據的 方法 executeUpdate()
            ms.datatoMySql(initialSql);
            System.out.println("數據庫清空成功!");
        } catch (Exception e) {
            System.out.println("數據庫清空失敗!");
        }
    }

    /**
     * 用於 獲取當前數據庫裏一共有多少球隊 方便後期查看本身喜歡的球隊比賽成績
     * @return 全部的參與過比賽的球隊名
     */
    public Vector<String> getAllTeams() {
        //使用一個向量來 存取 從數據庫中讀到的值
        Vector<String> vecAllTeams = new Vector<String>();
        String allteamsSql = "select HomeTeam,AwayTeam from premiership group by HomeTeam;";
        ResultSet rs = null; 
        MySql ms = new MySql();
        //調用 MySql類裏 查看數據的方法
        rs = ms.queryMySql(allteamsSql);
        try {
            //若是 ResultSet數據集裏的數據不爲空  則獲取相應的 數據 添加到 向量vecAllTeams裏
            while (rs.next()) {
                if (!vecAllTeams.contains(rs.getString("HomeTeam")))
                    vecAllTeams.add(rs.getString("HomeTeam"));
                else if (!vecAllTeams.contains(rs.getString("AwayTeam")))
                    vecAllTeams.add(rs.getString("AwayTeam"));
            }

        } catch (SQLException e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
        //返回 取到的全部結果
        return vecAllTeams;

    }

    /**
     * 查看具體的球隊比賽結果
     * @param league
     * @return 具體球隊的全部比賽結果
     */
    public Vector<String> querySpecifiedTeam(String league) {
        //建立一個向量 來裝載 從數據庫中 讀到的數據
        Vector<String> lsMatches = new Vector<String>();
        String specifiedTeamSql = "select * from premiership where HomeTeam ='"
                + league + "' or AwayTeam ='" + league + "'";
        MySql ms = new MySql();
        ResultSet rs = null;
        rs = ms.queryMySql(specifiedTeamSql);
        try {
            while (rs.next()) {
                lsMatches.add(rs.getString("Date"));
                lsMatches.add(rs.getString("HomeTeam"));
                lsMatches.add(rs.getString("AwayTeam"));
                lsMatches.add(rs.getString("Result"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return lsMatches;

    }
   /**
    * 查看 某一天的 比賽結果  
    * @param date
    * @return 某一天的全部比賽結果
    */
    public List<String> queryByDate(String date) {
        //使用一個 list泛型來裝載 比賽結果
        List<String> lsMatchesOnDate = new ArrayList<String>();
        String sqlDate = "SELECT * FROM premiership WHERE Date ='" + date + "'";
        //建立一個ResultSet數據集  用來 獲取查詢到的結果集
        ResultSet rs = null;
        MySql ms = new MySql();
        //調用 MySql 類裏的 查看數據庫數據的方法
        rs = ms.queryMySql(sqlDate);
        try {
            //若是 ResultSet數據集 不爲空 
            while (rs.next()) {
                //則 從ResultSet數據集 中取出 相應的 字段值 添加到 list泛型裏
                lsMatchesOnDate.add(rs.getString("Date"));
                lsMatchesOnDate.add(rs.getString("HomeTeam"));
                lsMatchesOnDate.add(rs.getString("AwayTeam"));
                lsMatchesOnDate.add(rs.getString("Result"));
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
        //最後 返回 取到的全部比賽數據結果
        return lsMatchesOnDate;
    }
}

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類 裏面含有2個方法

  • datatoMySql() 方法 用於向數據庫裏插入數據 
  • queryMySql() 方法 用於查看數據庫裏存儲的數據
MySql 類

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
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;

    /**
     * 建立一個插入數據的方法  executeUpdate()
     * @param insertSQl
     */
    public void datatoMySql(String insertSQl) {

        try {
            try {
                Class.forName(driver).newInstance();
            } catch (Exception e) {
                System.out.println("沒法找到驅動器");
                e.printStackTrace();
            }
            // 建立鏈接
            conn = DriverManager.getConnection(url, user, password);
            // 建立一個 Statement 對象來將 SQL 語句發送到數據庫
            stmt = conn.createStatement();
            // 執行SQL 插入語句
            stmt.executeUpdate(insertSQl);
            // 執行完 中止執行語句
            stmt.close();
            // 執行完關閉數據庫鏈接
            conn.close();
        } catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }

    /**
     * 建立一個用於select查看數據的方法 executeQuery();
     * @param strSelect
     * @return ResultSet
     */
    public ResultSet queryMySql(String strSelect) {
        // 建立一個數據集 用於獲取查詢到的行數據
        ResultSet rs = null;
        try {
            Class.forName(driver).newInstance();
        } catch (Exception e) {
            System.out.println("沒法找到驅動器!");
            e.printStackTrace();
        }

        try {
            // 建立鏈接
            conn = DriverManager.getConnection(url, user, password);
            // 建立一個 Statement 對象來將 SQL 語句發送到數據庫
            stmt = conn.createStatement();
            // 執行查詢語句   獲取ResultSet對象
            rs = stmt.executeQuery(strSelect);
        } catch (SQLException e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
        //返回結果集
        return rs;
    }
}

Main 主函數 用於數據輸出

 

Main 主函數

import java.util.List;
import java.util.Scanner;
import java.util.Vector;
/**
 * Main 主函數 用於數據的輸出
 * @author SoFlash - 博客園  http://www.cnblogs.com/longwu
 */
public class Main {
    public static void main(String[] args) {
        DataCollectionAndStorage dcs = new DataCollectionAndStorage();
        DataQuery dQuery = new DataQuery();

        while (true) {
            System.out.println("清空數據庫-請按1");
            System.out.println("收集英超比賽數據-請按2");
            System.out.println("查看英超全部球隊-請按3");
            System.out.println("查看具體球隊比賽結果-請按4");
            System.out.println("查看某一天的比賽-請按5");
            // Scanner 文本掃描器 用於讀取 用戶的輸入 
            Scanner sc = new Scanner(System.in);
            int intInput = sc.nextInt();
            if (intInput == 1) {
                dQuery.initialDataBase();
                System.out
                        .println("---------------------------------------------");
            } else if (intInput == 2) {
                dcs.dataCollectAndStore();
                System.out
                        .println("---------------------------------------------");
            } else if (intInput == 3) {
                //獲取 查詢到的全部球隊名稱
                Vector<String> vecAllTeams = dQuery.getAllTeams();
                if (vecAllTeams.size() != 0) {
                    System.out.println("參加過比賽的球隊以下:");
                    System.out
                            .print("-----------------------------------------------");
                    System.out
                            .print("-----------------------------------------------\r\n");
                    for (int i = 0; i < vecAllTeams.size(); i++) {
                        if (i % 7 == 0 && i != 0) {
                            System.out.println("\r\n");
                        }
                        System.out.print(vecAllTeams.get(i) + "\t");
                    }
                } else
                    System.out.print("數據庫目前沒有數據,請按2收集數據!");
                System.out
                        .print("\r\n---------------------------------------------");
                System.out
                        .println("-----------------------------------------------\r\n");
            } else if (intInput == 4) {
                System.out.println("請輸入你要查看的球隊");
                Scanner scLeague = new Scanner(System.in);
                String strLeague = scLeague.next();
                //獲取 具體球隊的比賽結果
                Vector<String> lsResult = dQuery.querySpecifiedTeam(strLeague);
                if (lsResult.size() != 0) {
                    System.out.println("日期\t\t\t主隊\t\t客隊\t\t比分");
                    for (int i = 0; i < lsResult.size(); i++) {
                        if (i % 4 == 0 && i != 0)
                            System.out.println();
                        System.out.print(lsResult.get(i) + "\t\t");
                    }
                } else
                    System.out.println("沒有相關球隊的記錄或數據庫沒有數據!");
                System.out
                        .println("\r\n---------------------------------------------------");
            } else if (intInput == 5) {
                System.out.println("請輸入你要查看的比賽日期  例子格式[14.01.2012]");
                Scanner scDate = new Scanner(System.in);
                String strDate = scDate.next();
                //獲取具體日期下的 全部比賽
                List<String> lsResulOnDate = dQuery.queryByDate(strDate);
                if (lsResulOnDate.size() != 0) {
                    System.out.println("日期\t\t\t主隊\t\t客隊\t\t比分");
                    for (int i = 0; i < lsResulOnDate.size(); i++) {
                        if (i % 4 == 0 && i != 0)
                            System.out.println();
                        System.out.print(lsResulOnDate.get(i) + "\t\t");
                    }
                } else
                    System.out.println("該天沒有比賽 或 數據庫沒有數據!");
                System.out
                        .println("\r\n---------------------------------------------------");
            }
        }

    }
}

 

 

 

運行程序

 

 輸入1 清空數據

 

輸入2 開始收集數據 並存入數據庫 - 初始階段

 

開始收集數據 並存入數據庫  - 結束階段

 

輸入3 查看全部參與過比賽的球隊

 

輸入4  再輸入要查看的具體球隊 這裏查看的是 Swansea

 

輸入5  再輸入查看具體的日期 這裏是 02.01.2012

 

 

 輸入1 咱們測試下清空數據的效果 這裏顯示清空成功

 

輸入3 查看下是否 真正在數據庫中成功清空數據   結果顯示 數據庫目前沒有數據

這樣,咱們的數據查詢功能也作好了

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

相關文章
相關標籤/搜索