溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Java網(wǎng)頁(yè)數(shù)據(jù)采集器如何進(jìn)行數(shù)據(jù)存儲(chǔ)

發(fā)布時(shí)間:2021-10-29 09:53:17 來(lái)源:億速云 閱讀:141 作者:柒染 欄目:編程語(yǔ)言

Java網(wǎng)頁(yè)數(shù)據(jù)采集器如何進(jìn)行數(shù)據(jù)存儲(chǔ),針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

簡(jiǎn)介:

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

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

為了方便我們今后來(lái)調(diào)用收集到的數(shù)據(jù),我們要講講如何做數(shù)據(jù)存儲(chǔ)(MySql數(shù)據(jù)庫(kù)).

數(shù)據(jù)采集頁(yè)面 2011-2012賽季英超球隊(duì)?wèi)?zhàn)績(jī)

關(guān)于Java操作MySql

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

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

***次使用MySql? 請(qǐng)看java連接MYSQL

如何在java項(xiàng)目中導(dǎo)入jar包?

請(qǐng)看這個(gè)Eclipse下如何導(dǎo)入jar包

關(guān)于MySql數(shù)據(jù)庫(kù)

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

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

好了 需要準(zhǔn)備的事宜都完成了 我們開(kāi)始寫(xiě)代碼

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

//創(chuàng)建數(shù)據(jù)庫(kù)  htmldatacollection  CREATE DATABASE htmldatacollection;   //在創(chuàng)建表之前 我們需要使用數(shù)據(jù)庫(kù)htmldatacollection  use htmldatacollection;      //在數(shù)據(jù)庫(kù)里 創(chuàng)建一個(gè)表 Premiership 用于存儲(chǔ)我們收集到的數(shù)據(jù)  //這里為了方便 所有字段 全部是字符串格式CREATE TABLE Premiership(Date varchar(15),  HomeTeam varchar(20),  AwayTeam varchar(20),  Result varchar(20)   )

創(chuàng)建好后 我們來(lái)看看數(shù)據(jù)庫(kù)結(jié)構(gòu)

Java網(wǎng)頁(yè)數(shù)據(jù)采集器如何進(jìn)行數(shù)據(jù)存儲(chǔ)

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

這里簡(jiǎn)單介紹下各個(gè)類(lèi)以及類(lèi)所包含的方法

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

import java.io.BufferedReader;  import java.io.IOException;  import java.io.InputStreamReader;  import java.net.URL;  public class DataStorage {      public void dataStore() {          // 首先用一個(gè)字符串 來(lái)裝載網(wǎng)頁(yè)鏈接          String strUrl= "http://www.footballresults.org/league.php?all=1&league=EngPrem";          String sqlLeagues = "";          try {              // 創(chuàng)建一個(gè)url對(duì)象來(lái)指向 該網(wǎng)站鏈接 括號(hào)里()裝載的是該網(wǎng)站鏈接的路徑              // 更多可以看看 http://wenku.baidu.com/view/8186caf4f61fb7360b4c6547.html              URL url = new URL(strUrl);              // InputStreamReader 是一個(gè)輸入流讀取器 用于將讀取的字節(jié)轉(zhuǎn)換成字符              // 更多可以看看 http://blog.sina.com.cn/s/blog_44a05959010004il.html               InputStreamReader isr = new InputStreamReader(url.openStream(),                      "utf-8"); // 統(tǒng)一使用utf-8 編碼模式               // 使用 BufferedReader 來(lái)讀取 InputStreamReader 轉(zhuǎn)換成的字符              BufferedReader br = new BufferedReader(isr);               String strRead = ""; // new 一個(gè)字符串來(lái)裝載 BufferedReader 讀取到的內(nèi)容              // 定義3個(gè)正則 用于獲取我們需要的數(shù)據(jù)               String regularDate = "(\\d{1,2}\\.\\d{1,2}\\.\\d{4})";               String regularTwoTeam = ">[^<>]*</a>";               String regularResult = ">(\\d{1,2}-\\d{1,2})</TD>";               //創(chuàng)建 GroupMethod類(lèi)的對(duì)象 gMethod 方便后期調(diào)用其類(lèi)里的 regularGroup方法              GroupMethod gMethod = new GroupMethod();               //創(chuàng)建DataStructure數(shù)據(jù)結(jié)構(gòu) 類(lèi)的對(duì)象   用于數(shù)據(jù)下面的數(shù)據(jù)存儲(chǔ)              DataStructure ds = new DataStructure();               //創(chuàng)建MySql類(lèi)的對(duì)象 用于執(zhí)行MySql語(yǔ)句               MySql ms = new MySql();              int i = 0; // 定義一個(gè)i來(lái)記錄循環(huán)次數(shù) 即收集到的球隊(duì)比賽結(jié)果數(shù)              int index = 0; // 定義一個(gè)索引 用于獲取分離 2個(gè)球隊(duì)的數(shù)據(jù) 因?yàn)?個(gè)球隊(duì)正則是相同的               // 開(kāi)始讀取數(shù)據(jù) 如果讀到的數(shù)據(jù)不為空 則往里面讀               while ((strRead = br.readLine()) != null) {                   /**                   * 用于捕獲日期數(shù)據(jù)                   */                   String strGet = gMethod.regularGroup(regularDate, strRead);                   // 如果捕獲到了符合條件的 日期數(shù)據(jù) 則打印出來(lái)                   if (!strGet.equals("")) {                       //System.out.println("Date:" + strGet);                       //將收集到的日期存在數(shù)據(jù)結(jié)構(gòu)里                       ds.date = strGet;                       // 這里索引+1 是用于獲取后期的球隊(duì)數(shù)據(jù)                       ++index; // 因?yàn)樵趆tml頁(yè)面里 源代碼里 球隊(duì)數(shù)據(jù)是在剛好在日期之后                   }                   /**                    * 用于獲取2個(gè)球隊(duì)的數(shù)據(jù)                    */                   strGet = gMethod.regularGroup(regularTwoTeam, strRead);                  if (!strGet.equals("") && index == 1) { // 索引為1的是主隊(duì)數(shù)據(jù)                       // 通過(guò)subtring方法 分離出 主隊(duì)數(shù)據(jù)                       strGet = strGet.substring(1, strGet.indexOf("</a>"));                       //System.out.println("HomeTeam:" + strGet); // 打印出主隊(duì)                       //將收集到的主隊(duì)名稱(chēng) 存到 數(shù)據(jù)結(jié)構(gòu)里                       ds.homeTeam = strGet;                       index++; // 索引+1之后 為2了                    // 通過(guò)subtring方法 分離出 客隊(duì)                   } else if (!strGet.equals("") && index == 2) { // 這里索引為2的是客隊(duì)數(shù)據(jù)                       strGet = strGet.substring(1, strGet.indexOf("</a>"));                       //System.out.println("AwayTeam:" + strGet); // 打印出客隊(duì)                      //將收集到的客隊(duì)名稱(chēng) 存到數(shù)據(jù)結(jié)構(gòu)里                       ds.awayTeam = strGet;                       index = 0;  //收集完客隊(duì)名稱(chēng)后 需要將索引還原 用于收集下一條數(shù)據(jù)的主隊(duì)名稱(chēng)                   }                   /**                   * 用于獲取比賽結(jié)果                    */                   strGet = gMethod.regularGroup(regularResult, strRead);                   if (!strGet.equals("")) {                       // 這里同樣用到了substring方法 來(lái)剔除'<' 和 "</TD>" 標(biāo)簽 來(lái)獲取我們想要的比賽結(jié)果                       strGet = strGet.substring(1, strGet.indexOf("</TD>"));                       //System.out.println("Result:" + strGet);                       ds.result = strGet; //將收集到的比賽結(jié)果存到數(shù)據(jù)結(jié)構(gòu)里                       //System.out.println();                        //MySql插入語(yǔ)句                       sqlLeagues = "INSERT INTO Premiership values(\""                               + ds.date + "\"," + "\"" + ds.homeTeam                               + "\"," + "\"" + ds.awayTeam + "\","+ "\"" + ds.result + "\")";                       //調(diào)用MySql類(lèi)的datatoMySql()方法 來(lái)執(zhí)行 MySql插入語(yǔ)句                       ms.datatoMySql(sqlLeagues);                       i++; //每插入完一條記錄 i+1;                       System.out.println("第"+i+"條數(shù)據(jù)插入成功");                  }              }               // 當(dāng)讀完數(shù)據(jù)后 記得關(guān)閉 BufferReader               br.close();               //System.out.println("共收集到" + i + "條比賽記錄");// 打印出循環(huán)次數(shù)              //當(dāng)數(shù)據(jù)存儲(chǔ)完成后 打印出 收集球隊(duì)記錄數(shù)               System.out.println("數(shù)據(jù)存儲(chǔ)完畢,共插入數(shù)據(jù)庫(kù)"+i+"條記錄");          } catch (IOException e) {              // 如果出錯(cuò) 拋出異常              e.printStackTrace();          }      }  }

DataStructure類(lèi) 簡(jiǎn)單數(shù)據(jù)結(jié)構(gòu) 里面包含了相應(yīng)的字段 用于將收集的數(shù)據(jù)臨時(shí)性存儲(chǔ)

//創(chuàng)建一個(gè)數(shù)據(jù)結(jié)構(gòu)類(lèi)來(lái) 裝載收集到的數(shù)據(jù)  public class DataStructure {       //定義數(shù)據(jù)字段       public String homeTeam;       public String awayTeam;       public String date;       public String result;  }

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

import java.util.regex.Matcher;  import java.util.regex.Pattern;  public class GroupMethod {      // 傳入2個(gè)字符串參數(shù) 一個(gè)是pattern(我們使用的正則) 另一個(gè)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();// 返回捕獲的數(shù)據(jù)          } else {              return ""; // 否則返回一個(gè)空值          }      }  }

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

import java.sql.Connection;  import java.sql.DriverManager;  import java.sql.SQLException;   import java.sql.Statement;  /**    * @MySql類(lèi)用于實(shí)施MySql查詢(xún)語(yǔ)句   */ 9 public class MySql {      //定義MySql驅(qū)動(dòng),數(shù)據(jù)庫(kù)地址,數(shù)據(jù)庫(kù)用戶(hù)名 密碼, 執(zhí)行語(yǔ)句和數(shù)據(jù)庫(kù)連接      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;      //創(chuàng)建一個(gè)插入數(shù)據(jù)的方法      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();              }              //創(chuàng)建連接              conn = DriverManager.getConnection(url, user, password);              //創(chuàng)建一個(gè) Statement 對(duì)象來(lái)將 SQL 語(yǔ)句發(fā)送到數(shù)據(jù)庫(kù)              stmt = conn.createStatement();          } catch (SQLException e) {              e.printStackTrace();          }          try {              //執(zhí)行SQL 插入語(yǔ)句              stmt.executeUpdate(insertSQl);          } catch (SQLException e) {              e.printStackTrace();          }          try {              //執(zhí)行完 停止執(zhí)行語(yǔ)句              stmt.close();              //執(zhí)行完關(guān)閉數(shù)據(jù)庫(kù)連接              conn.close();          } catch (SQLException e) {              e.printStackTrace();          }      }  }

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

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

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

數(shù)據(jù)采集頁(yè)面 2011-2012賽季英超球隊(duì)?wèi)?zhàn)績(jī)

Html頁(yè)面截圖-初始階段

Java網(wǎng)頁(yè)數(shù)據(jù)采集器如何進(jìn)行數(shù)據(jù)存儲(chǔ)

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

Java網(wǎng)頁(yè)數(shù)據(jù)采集器如何進(jìn)行數(shù)據(jù)存儲(chǔ)

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

Java網(wǎng)頁(yè)數(shù)據(jù)采集器如何進(jìn)行數(shù)據(jù)存儲(chǔ)

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

Java網(wǎng)頁(yè)數(shù)據(jù)采集器如何進(jìn)行數(shù)據(jù)存儲(chǔ)

一共收集到 189條記錄

Java網(wǎng)頁(yè)數(shù)據(jù)采集器如何進(jìn)行數(shù)據(jù)存儲(chǔ)

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

Java網(wǎng)頁(yè)數(shù)據(jù)采集器如何進(jìn)行數(shù)據(jù)存儲(chǔ)

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

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

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

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

關(guān)于Java網(wǎng)頁(yè)數(shù)據(jù)采集器如何進(jìn)行數(shù)據(jù)存儲(chǔ)問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI