中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java網頁數據采集器如何進行數據存儲

發布時間:2021-10-29 09:53:17 來源:億速云 閱讀:148 作者:柒染 欄目:編程語言

Java網頁數據采集器如何進行數據存儲,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

簡介:

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

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

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

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

Java網頁數據采集器如何進行數據存儲

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

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

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

import java.io.BufferedReader;  import java.io.IOException;  import java.io.InputStreamReader;  import java.net.URL;  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類 簡單數據結構 里面包含了相應的字段 用于將收集的數據臨時性存儲

//創建一個數據結構類來 裝載收集到的數據  public class DataStructure {       //定義數據字段       public String homeTeam;       public String awayTeam;       public String date;       public String result;  }

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

import java.util.regex.Matcher;  import java.util.regex.Pattern;  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數據庫中

import java.sql.Connection;  import java.sql.DriverManager;  import java.sql.SQLException;   import java.sql.Statement;  /**    * @MySql類用于實施MySql查詢語句   */ 9 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 主函數 用于數據輸出

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

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

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

Html頁面截圖-初始階段

Java網頁數據采集器如何進行數據存儲

MySql數據庫截圖-初始階段

Java網頁數據采集器如何進行數據存儲

Html頁面截圖-結束階段

Java網頁數據采集器如何進行數據存儲

MySql數據庫截圖-結束階段

Java網頁數據采集器如何進行數據存儲

一共收集到 189條記錄

Java網頁數據采集器如何進行數據存儲

MySql數據庫顯示 189 行數據

Java網頁數據采集器如何進行數據存儲

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

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

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

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

關于Java網頁數據采集器如何進行數據存儲問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

白水县| 天津市| 同德县| 额尔古纳市| 巴塘县| 贺州市| 溆浦县| 平阴县| 合肥市| 格尔木市| 康马县| 新蔡县| 巴里| 大城县| 普格县| 颍上县| 石首市| 奇台县| 新民市| 黄山市| 德清县| 平和县| 舞钢市| 永春县| 吴江市| 柳江县| 鹤壁市| 南康市| 彰化市| 凤凰县| 鸡泽县| 潼关县| 樟树市| 东乌珠穆沁旗| 永清县| 布拖县| 克山县| 喀什市| 达州市| 平陆县| 赫章县|