成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java網頁數據采集器實例教程:數據存儲

開發 后端
為了方便我們今后來調用收集到的數據,如何做數據存儲(MySql數據庫)是必須要了解的。所以下文我們針對數據存儲做了詳解的教程。

簡介:

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

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

本期概述:

上期我們講到了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里直接執行即可)

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

創建好后 我們來看看數據庫結構

數據庫弄好了 我們開始實施java代碼

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

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

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

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

  1. //創建一個數據結構類來 裝載收集到的數據  
  2. public class DataStructure {  
  3.      //定義數據字段  
  4.      public String homeTeam;  
  5.      public String awayTeam;  
  6.      public String date;  
  7.      public String result;  

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

  1. import java.util.regex.Matcher;  
  2. import java.util.regex.Pattern;  
  3. public class GroupMethod {  
  4.     // 傳入2個字符串參數 一個是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();// 返回捕獲的數據  
  10.         } else {  
  11.             return ""// 否則返回一個空值  
  12.         }  
  13.     }  

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

  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驅動,數據庫地址,數據庫用戶名 密碼, 執行語句和數據庫連接  
  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.     //創建一個插入數據的方法  
  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.             //創建連接  
  25.             conn = DriverManager.getConnection(url, user, password);  
  26.             //創建一個 Statement 對象來將 SQL 語句發送到數據庫  
  27.             stmt = conn.createStatement();  
  28.         } catch (SQLException e) {  
  29.             e.printStackTrace();  
  30.         }  
  31.         try {  
  32.             //執行SQL 插入語句  
  33.             stmt.executeUpdate(insertSQl);  
  34.         } catch (SQLException e) {  
  35.             e.printStackTrace();  
  36.         }  
  37.         try {  
  38.             //執行完 停止執行語句  
  39.             stmt.close();  
  40.             //執行完關閉數據庫連接  
  41.             conn.close();  
  42.         } catch (SQLException e) {  
  43.             e.printStackTrace();  
  44.         }  
  45.     }  

Main 主函數 用于數據輸出

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

好了 下面我們來執行下 看看結果

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

Html頁面截圖-初始階段

MySql數據庫截圖-初始階段

Html頁面截圖-結束階段

MySql數據庫截圖-結束階段

一共收集到 189條記錄

MySql數據庫顯示 189 行數據

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

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

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

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

附上源代碼下載 htmlDataStorage.zip

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

【編輯推薦】

  1. J2EE總結:Java命名與目錄接口JNDI
  2. Java中運用數組的四種排序方法
  3. Java實現實用的ZIP壓縮與解壓
  4. Java防止SQL注入的幾個途徑
  5. 使用Java 2D繪制黑白太極圖案
責任編輯:林師授 來源: SoFlash的博客
相關推薦

2009-09-18 11:44:05

Scala實例教程Kestrel

2009-09-08 14:18:35

NFS服務器

2021-12-09 15:30:12

采集器開源-iLogtail

2011-02-18 16:07:46

微軟 SQL Serv

2019-01-24 15:30:09

TensorFlow機器學習

2014-08-26 11:46:46

QtAndroid實例教程

2020-10-12 08:19:43

Python爬蟲網頁數據

2010-08-17 11:02:45

DIV CSS實例教程

2019-06-17 15:25:17

expandunexpandLinux

2010-08-25 17:08:18

實例教程

2009-11-18 15:39:43

PHP函數

2011-07-25 16:03:47

XCode 編譯

2013-01-04 16:17:33

Android開發圖像特效圖像處理

2013-01-14 17:05:55

UCUI設計菜單欄

2020-10-26 15:09:35

Python爬蟲網頁數據

2009-07-30 14:18:02

ASP.NET實例教程

2009-06-23 14:08:00

Java Socket

2011-03-17 17:30:06

NginxiptablesDDOS

2020-10-25 08:06:08

Scrapy

2013-07-25 14:44:48

sqlite實例教程iOS開發學習sqlite打造詞典
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 97国产精品 | 精品不卡 | 亚洲精品福利在线 | 亚洲日韩视频 | 99小视频| 久久99国产精一区二区三区 | 国产精品久久久久久久久久久免费看 | 国产羞羞视频在线观看 | 波多野结衣av中文字幕 | 91高清视频| 91麻豆久久久 | 九九伊人sl水蜜桃色推荐 | 国产日韩一区二区三免费高清 | 日本不卡一区二区三区 | 日韩中文字幕 | 国产999精品久久久久久 | 成人免费大片黄在线播放 | 中国大陆高清aⅴ毛片 | 国内精品免费久久久久软件老师 | av官网在线 | 国产成人jvid在线播放 | 日韩久草 | 97国产在线观看 | 日本福利在线观看 | 国产黄色av网站 | 网站黄色av | 欧美一级大片免费观看 | 婷婷色网 | 九九久久国产 | 亚洲一区二区在线播放 | 91电影在线播放 | 热99在线| 亚洲高清一区二区三区 | 视频三区 | 日本精品久久久久久久 | 视频一区在线 | 亚洲视频一区二区三区 | 日韩免费高清视频 | 亚洲成人av在线 | www.亚洲一区二区三区 | 99re超碰|