日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Java網(wǎng)頁數(shù)據(jù)采集器實例教程:數(shù)據(jù)存儲

簡介:

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:域名申請、網(wǎng)頁空間、營銷軟件、網(wǎng)站建設、棗陽網(wǎng)站維護、網(wǎng)站推廣。

作為全球運用最廣泛的語言,Java 憑借它的高效性,可移植性(跨平臺),代碼的健壯性以及可強大的可擴展性,深受廣大應用程序開發(fā)者的喜愛. 作為一門強大的開發(fā)語言,正則表達式在其中的應用當然是必不可少的,而且正則表達式的掌握能力也是那些高級程序員的開發(fā)功底之體現(xiàn),做一名合格的網(wǎng)站開發(fā)的程序員(尤其是做前端開發(fā)),正則表達式是必備的。

最近,由于一些需要,用到了java和正則,做了個的足球網(wǎng)站的數(shù)據(jù)采集程序,由于是***次做關于java的html頁面數(shù)據(jù)采集,必然在網(wǎng)上查找了很多資料,但是發(fā)現(xiàn)運用如此廣泛的java在使用正則做html采集方面的(中文)文章是少之又少,都是簡單的談了下java正則的概念,沒有真正用在實際網(wǎng)頁html采集,所以實例教程更是***(雖然java有它自己的Html Parser,而且十分強大),但個人覺得作為如此深入人心的正則表達式,理應有其相關的java實例教程,而且應該很多很全.于是在完成java版的html數(shù)據(jù)采集程序之后,本人便打算寫個關于正則表達式在java上的html頁面采集,以便有相關興趣的讀者更好的學習.

本期概述:

上期我們講到了html頁面的數(shù)據(jù)采集,為了方便我們今后來調(diào)用收集到的數(shù)據(jù),這期我們要講講如何做數(shù)據(jù)存儲(MySql數(shù)據(jù)庫).

數(shù)據(jù)采集頁面 2011-2012賽季英超球隊戰(zhàn)績

關于Java操作MySql

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

可以在MySql官網(wǎng)下載 Connector/J 5.1.18

***次使用MySql? 請看java連接MYSQL

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

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

關于MySql數(shù)據(jù)庫

如果是初學者 想使用MySql數(shù)據(jù)庫的話 可以去這里XAMPP中文官網(wǎng) 下載 XAMPP 套裝

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

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

打開MySql數(shù)據(jù)庫 創(chuàng)建數(shù)據(jù)庫 和表 (拷貝如下代碼 到mysql里直接執(zhí)行即可)

 
 
 
 
  1. //創(chuàng)建數(shù)據(jù)庫  htmldatacollection  
  2. CREATE DATABASE htmldatacollection;   
  3. //在創(chuàng)建表之前 我們需要使用數(shù)據(jù)庫htmldatacollection  
  4. use htmldatacollection;      
  5. //在數(shù)據(jù)庫里 創(chuàng)建一個表 Premiership 用于存儲我們收集到的數(shù)據(jù)  
  6. //這里為了方便 所有字段 全部是字符串格式
  7. CREATE TABLE Premiership(Date varchar(15),  
  8. HomeTeam varchar(20),  
  9. AwayTeam varchar(20),  
  10. Result varchar(20)   
  11. )  

創(chuàng)建好后 我們來看看數(shù)據(jù)庫結(jié)構

數(shù)據(jù)庫弄好了 我們開始實施java代碼

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

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

 
 
 
 
  1. import java.io.BufferedReader;  
  2. import java.io.IOException;  
  3. import java.io.InputStreamReader;  
  4. import java.net.URL;  
  5. public class DataStorage {  
  6.     public void dataStore() {  
  7.         // 首先用一個字符串 來裝載網(wǎng)頁鏈接  
  8.         String strUrl= "http://www.footballresults.org/league.php?all=1&league=EngPrem";  
  9.         String sqlLeagues = "";  
  10.         try {  
  11.             // 創(chuàng)建一個url對象來指向 該網(wǎng)站鏈接 括號里()裝載的是該網(wǎng)站鏈接的路徑  
  12.             // 更多可以看看 http://wenku.baidu.com/view/8186caf4f61fb7360b4c6547.html  
  13.             URL url = new URL(strUrl);  
  14.             // InputStreamReader 是一個輸入流讀取器 用于將讀取的字節(jié)轉(zhuǎn)換成字符  
  15.             // 更多可以看看 http://blog.sina.com.cn/s/blog_44a05959010004il.html   
  16.             InputStreamReader isr = new InputStreamReader(url.openStream(),  
  17.                     "utf-8"); // 統(tǒng)一使用utf-8 編碼模式   
  18.             // 使用 BufferedReader 來讀取 InputStreamReader 轉(zhuǎn)換成的字符  
  19.             BufferedReader br = new BufferedReader(isr);   
  20.             String strRead = ""; // new 一個字符串來裝載 BufferedReader 讀取到的內(nèi)容  
  21.             // 定義3個正則 用于獲取我們需要的數(shù)據(jù)   
  22.             String regularDate = "(\\d{1,2}\\.\\d{1,2}\\.\\d{4})";   
  23.             String regularTwoTeam = ">[^<>]*";   
  24.             String regularResult = ">(\\d{1,2}-\\d{1,2})";   
  25.             //創(chuàng)建 GroupMethod類的對象 gMethod 方便后期調(diào)用其類里的 regularGroup方法  
  26.             GroupMethod gMethod = new GroupMethod();   
  27.             //創(chuàng)建DataStructure數(shù)據(jù)結(jié)構 類的對象   用于數(shù)據(jù)下面的數(shù)據(jù)存儲  
  28.             DataStructure ds = new DataStructure();   
  29.             //創(chuàng)建MySql類的對象 用于執(zhí)行MySql語句   
  30.             MySql ms = new MySql();  
  31.             int i = 0; // 定義一個i來記錄循環(huán)次數(shù) 即收集到的球隊比賽結(jié)果數(shù)  
  32.             int index = 0; // 定義一個索引 用于獲取分離 2個球隊的數(shù)據(jù) 因為2個球隊正則是相同的   
  33.             // 開始讀取數(shù)據(jù) 如果讀到的數(shù)據(jù)不為空 則往里面讀   
  34.             while ((strRead = br.readLine()) != null) {   
  35.                 /**  
  36.                  * 用于捕獲日期數(shù)據(jù)  
  37.                  */   
  38.                 String strGet = gMethod.regularGroup(regularDate, strRead);   
  39.                 // 如果捕獲到了符合條件的 日期數(shù)據(jù) 則打印出來   
  40.                 if (!strGet.equals("")) {   
  41.                     //System.out.println("Date:" + strGet);   
  42.                     //將收集到的日期存在數(shù)據(jù)結(jié)構里   
  43.                     ds.date = strGet;   
  44.                     // 這里索引+1 是用于獲取后期的球隊數(shù)據(jù)   
  45.                     ++index; // 因為在html頁面里 源代碼里 球隊數(shù)據(jù)是在剛好在日期之后   
  46.                 }   
  47.                 /**   
  48.                  * 用于獲取2個球隊的數(shù)據(jù)   
  49.                  */   
  50.                 strGet = gMethod.regularGroup(regularTwoTeam, strRead);  
  51.                 if (!strGet.equals("") && index == 1) { // 索引為1的是主隊數(shù)據(jù)   
  52.                     // 通過subtring方法 分離出 主隊數(shù)據(jù)   
  53.                     strGet = strGet.substring(1, strGet.indexOf(""));   
  54.                     //System.out.println("HomeTeam:" + strGet); // 打印出主隊   
  55.                     //將收集到的主隊名稱 存到 數(shù)據(jù)結(jié)構里   
  56.                     ds.homeTeam = strGet;   
  57.                     index++; // 索引+1之后 為2了   
  58.                  // 通過subtring方法 分離出 客隊   
  59.                 } else if (!strGet.equals("") && index == 2) { // 這里索引為2的是客隊數(shù)據(jù)   
  60.                     strGet = strGet.substring(1, strGet.indexOf(""));   
  61.                     //System.out.println("AwayTeam:" + strGet); // 打印出客隊  
  62.                     //將收集到的客隊名稱 存到數(shù)據(jù)結(jié)構里   
  63.                     ds.awayTeam = strGet;   
  64.                     index = 0;  //收集完客隊名稱后 需要將索引還原 用于收集下一條數(shù)據(jù)的主隊名稱   
  65.                 }   
  66.                 /**  
  67.                  * 用于獲取比賽結(jié)果   
  68.                  */   
  69.                 strGet = gMethod.regularGroup(regularResult, strRead);   
  70.                 if (!strGet.equals("")) {   
  71.                     // 這里同樣用到了substring方法 來剔除'<' 和 "" 標簽 來獲取我們想要的比賽結(jié)果   
  72.                     strGet = strGet.substring(1, strGet.indexOf(""));   
  73.                     //System.out.println("Result:" + strGet);   
  74.                     ds.result = strGet; //將收集到的比賽結(jié)果存到數(shù)據(jù)結(jié)構里   
  75.                     //System.out.println();    
  76.                     //MySql插入語句   
  77.                     sqlLeagues = "INSERT INTO Premiership values(\""   
  78.                             + ds.date + "\"," + "\"" + ds.homeTeam   
  79.                             + "\"," + "\"" + ds.awayTeam + "\","+ "\"" + ds.result + "\")";   
  80.                     //調(diào)用MySql類的datatoMySql()方法 來執(zhí)行 MySql插入語句   
  81.                     ms.datatoMySql(sqlLeagues);   
  82.                     i++; //每插入完一條記錄 i+1;   
  83.                     System.out.println("第"+i+"條數(shù)據(jù)插入成功");  
  84.                 }  
  85.             }   
  86.             // 當讀完數(shù)據(jù)后 記得關閉 BufferReader   
  87.             br.close();   
  88.             //System.out.println("共收集到" + i + "條比賽記錄");// 打印出循環(huán)次數(shù)  
  89.             //當數(shù)據(jù)存儲完成后 打印出 收集球隊記錄數(shù)   
  90.             System.out.println("數(shù)據(jù)存儲完畢,共插入數(shù)據(jù)庫"+i+"條記錄");  
  91.         } catch (IOException e) {  
  92.             // 如果出錯 拋出異常  
  93.             e.printStackTrace();  
  94.         }  
  95.     }  

DataStructure類 簡單數(shù)據(jù)結(jié)構 里面包含了相應的字段 用于將收集的數(shù)據(jù)臨時性存儲

 
 
 
 
  1. //創(chuàng)建一個數(shù)據(jù)結(jié)構類來 裝載收集到的數(shù)據(jù)  
  2. public class DataStructure {  
  3.      //定義數(shù)據(jù)字段  
  4.      public String homeTeam;  
  5.      public String awayTeam;  
  6.      public String date;  
  7.      public String result;  

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

 
 
 
 
  1. import java.util.regex.Matcher;  
  2. import java.util.regex.Pattern;  
  3. public class GroupMethod {  
  4.     // 傳入2個字符串參數(shù) 一個是pattern(我們使用的正則) 另一個matcher是html源代碼  
  5.     public String regularGroup(String pattern, String matcher) {  
  6.         Pattern p = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE);  
  7.         Matcher m = p.matcher(matcher);  
  8.         if (m.find()) { // 如果讀到  
  9.             return m.group();// 返回捕獲的數(shù)據(jù)  
  10.         } else {  
  11.             return ""; // 否則返回一個空值  
  12.         }  
  13.     }  

MySql類 以及包含的 datatoMySql() 方法 用于執(zhí)行SQL插入語句 將臨時存儲在數(shù)據(jù)結(jié)構里的數(shù)據(jù) 插入到MySql數(shù)據(jù)庫中

 
 
 
 
  1. import java.sql.Connection;  
  2. import java.sql.DriverManager;  
  3. import java.sql.SQLException;   
  4. import java.sql.Statement;  
  5. /**   
  6.  * @MySql類用于實施MySql查詢語句  
  7.  */ 9 public class MySql {  
  8.     //定義MySql驅(qū)動,數(shù)據(jù)庫地址,數(shù)據(jù)庫用戶名 密碼, 執(zhí)行語句和數(shù)據(jù)庫連接  
  9.     public String driver = "com.mysql.jdbc.Driver";  
  10.     public String url = "jdbc:mysql://127.0.0.1:3306/htmldatacollection";  
  11.     public String user = "root";  
  12.     public String password = "root";  
  13.     public Statement stmt = null;  
  14.     public Connection conn = null;  
  15.     //創(chuàng)建一個插入數(shù)據(jù)的方法  
  16.     public void datatoMySql(String insertSQl) {  
  17.         try {  
  18.             try {  
  19.                 Class.forName(driver).newInstance();  
  20.             } catch (Exception e) {  
  21.                 System.out.println("Unable to find the local driver");  
  22.                 e.printStackTrace();  
  23.             }  
  24.             //創(chuàng)建連接  
  25.             conn = DriverManager.getConnection(url, user, password);  
  26.             //創(chuàng)建一個 Statement 對象來將 SQL 語句發(fā)送到數(shù)據(jù)庫  
  27.             stmt = conn.createStatement();  
  28.         } catch (SQLException e) {  
  29.             e.printStackTrace();  
  30.         }  
  31.         try {  
  32.             //執(zhí)行SQL 插入語句  
  33.             stmt.executeUpdate(insertSQl);  
  34.         } catch (SQLException e) {  
  35.             e.printStackTrace();  
  36.         }  
  37.         try {  
  38.             //執(zhí)行完 停止執(zhí)行語句  
  39.             stmt.close();  
  40.             //執(zhí)行完關閉數(shù)據(jù)庫連接  
  41.             conn.close();  
  42.         } catch (SQLException e) {  
  43.             e.printStackTrace();  
  44.         }  
  45.     }  

Main 主函數(shù) 用于數(shù)據(jù)輸出

 
 
 
 
  1. public class Main {  
  2.     public static void main(String[] args) {  
  3.          //在主函數(shù)里調(diào)用DataStorage類里的dataStore()方法  
  4.         DataStorage ds = new DataStorage();  
  5.         ds.dataStore();  
  6.     }  

好了 下面我們來執(zhí)行下 看看結(jié)果

數(shù)據(jù)采集頁面 2011-2012賽季英超球隊戰(zhàn)績

Html頁面截圖-初始階段

MySql數(shù)據(jù)庫截圖-初始階段

Html頁面截圖-結(jié)束階段

MySql數(shù)據(jù)庫截圖-結(jié)束階段

一共收集到 189條記錄

MySql數(shù)據(jù)庫顯示 189 行數(shù)據(jù)

這樣 我們2011-2012英超聯(lián)盟賽季的比賽戰(zhàn)績就全部收集并存到MySql數(shù)據(jù)庫里了 ????

當然這里只是抓取并存儲了一個頁面的內(nèi)容,如果感興趣 想抓去更多的頁面內(nèi)容 你可以分析下該鏈接后的聯(lián)盟名 例如 league=EngPrem 通過改變league名來獲取所有聯(lián) 盟的比賽數(shù)據(jù) 你可以寫個 枚舉接口 把所有球隊的名字放進去. 然后在DataStorage類里 實施該接口 將 枚舉 轉(zhuǎn)換成 球隊數(shù)組

然后來附加到 "http://www.footballresults.org/league.php?all=1&league=" 鏈接后面 來補齊鏈接 循環(huán)讀取各個聯(lián)盟比賽頁面的內(nèi)容

同樣 還有更智能的方法 你可以寫個方法 從http://www.footballresults.org/allleagues.php 頁面 獲取所有球隊的名字 同樣循環(huán)補齊鏈接 讀取各聯(lián)盟頁面內(nèi)容

附上源代碼下載 htmlDataStorage.zip


當前名稱:Java網(wǎng)頁數(shù)據(jù)采集器實例教程:數(shù)據(jù)存儲
文章位置:http://m.5511xx.com/article/dpoeicd.html