如何使用Java製作網絡爬蟲?

互聯網上有很多有用的信息。我們如何自動獲取這些信息?-是的,網絡爬蟲。

如何使用Java製作網絡爬蟲?

這篇文章展示瞭如何使用Java製作簡單的Web爬網程序原型。製作Web搜尋器並不像聽起來那樣困難。只需按照指南進行操作,您將在1小時或更短的時間內迅速到達該地點,然後享受它可以為您提供的大量信息。由於這只是一個原型,因此您需要花費更多時間來根據需要自定義它。

以下是本教程的先決條件:

· 基本Java程式設計

· 關於SQL和MySQL數據庫的一些知識。

如果您不想使用數據庫,則可以使用文件來跟蹤爬網歷史記錄。

1.目標


在本教程中,目標如下:

給定學校根URL,例如" mit.edu",返回包含該學校字符串" research"的所有頁面

典型的搜尋器按以下步驟工作:

1. 解析根網頁(" mit.edu"),並從該頁面獲取所有鏈接。要訪問每個URL並解析HTML頁面,我將使用JSoup,它是用Java編寫的便捷的網頁解析器。

2. 使用從步驟1檢索到的URL,並解析這些URL

3. 執行上述步驟時,我們需要跟蹤之前已處理過的頁面,因此每個網頁僅被處理一次。這就是我們需要數據庫的原因。

2.設置MySQL數據庫

如果您使用的是Ubuntu,則可以按照本指南安裝Apache,MySQL,PHP和phpMyAdmin。

如果使用Windows,則只需使用WampServer。您可以簡單地從wampserver.com下載它,並在一分鐘內安裝它,可以繼續進行下一步。

我將使用phpMyAdmin來操作MySQL數據庫。它只是使用MySQL的GUI界面。如果您使用任何其他工具或不使用GUI工具,那都很好。

3.創建一個數據庫和一個表

創建一個名為" Crawler"的數據庫,並創建一個名為" Record"的表,如下所示:

<code>CREATE TABLE IF NOT EXISTS `Record` (/<code>
<code>  `RecordID` INT(11) NOT NULL AUTO_INCREMENT,/<code>
<code>  `URL` text NOT NULL,/<code>
<code>  PRIMARY KEY (`RecordID`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;/<code>

4.開始使用Java進行爬網

1)下載JSoup核心庫。

2)現在,在Jsoup中創建一個名為" Crawler"的項目,並將您下載的JSoup和mysql-connector jar文件添加到Java Build Path。(右鍵單擊項目->選擇"構建路徑"->"配置構建路徑"->單擊"庫"選項卡->單擊"添加外部JAR")

3)創建一個名為" DB"的類,該類用於處理數據庫操作。

<code>import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;/<code>
<code>public class DB {/<code>
<code>
<code>\tpublic Connection conn = null;/<code>
<code>
<code>\tpublic DB() {/<code>
<code>\t\ttry {/<code>
<code>\t\t\tClass.forName("com.mysql.jdbc.Driver");/<code>
<code>\t\t\tString url = "jdbc:mysql://localhost:3306/Crawler";/<code>
<code>\t\t\tconn = DriverManager.getConnection(url, "root", "admin213");/<code>
<code>\t\t\tSystem.out.println("conn built");/<code>
<code>\t\t} catch (SQLException e) {/<code>
<code>\t\t\te.printStackTrace();/<code>
<code>\t\t} catch (ClassNotFoundException e) {/<code>
<code>\t\t\te.printStackTrace();/<code>
<code>\t\t}/<code>
<code>\t}/<code>
<code>
<code>\tpublic ResultSet runSql(String sql) throws SQLException {/<code> 
<code>\t\tStatement sta = conn.createStatement();/<code>
<code>\t\treturn sta.executeQuery(sql);/<code>
<code>\t}/<code>
<code>
<code>\tpublic boolean runSql2(String sql) throws SQLException {/<code>
<code>\t\tStatement sta = conn.createStatement();/<code>
<code>\t\treturn sta.execute(sql);/<code>
<code>\t}/<code>
<code>
<code>\t@Override/<code>
<code>\tprotected void finalize() throws Throwable {/<code>
<code>\t\tif (conn != null || !conn.isClosed()) {/<code>
<code>\t\t\tconn.close();/<code>
<code>\t\t}/<code>
<code>\t}}/<code>

4)創建一個名稱為" Main"的類,它將作為我們的搜尋器。

<code>import java.io.IOException;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.nodes.Element;import org.jsoup.select.Elements;/<code>
<code>
<code>public class Main {/<code>
<code>\tpublic static DB db = new DB();/<code>
<code>
<code>\tpublic static void main(String[] args) throws SQLException, IOException {/<code>
<code>\t\tdb.runSql2("TRUNCATE Record;");/<code>
<code>\t\tprocessPage("http://www.mit.edu");/<code> 
<code>\t}/<code>
<code>
<code>\tpublic static void processPage(String URL) throws SQLException, IOException{/<code>
<code>\t\t//check if the given URL is already in database/<code>
<code>\t\tString sql = "select * from Record where URL = '"+URL+"'";/<code>
<code>\t\tResultSet rs = db.runSql(sql);/<code>
<code>\t\tif(rs.next()){/<code>
<code>
<code>\t\t}else{/<code>
<code>\t\t\t//store the URL to database to avoid parsing again/<code>
<code>\t\t\tsql = "INSERT INTO  `Crawler`.`Record` " + "(`URL`) VALUES " + "(?);";/<code>
<code>\t\t\tPreparedStatement stmt = db.conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);/<code>
<code>\t\t\tstmt.setString(1, URL);/<code>
<code>\t\t\tstmt.execute();/<code>
<code>
<code>\t\t\t//get useful information/<code>
<code>\t\t\tDocument doc = Jsoup.connect("http://www.mit.edu/").get();/<code>
<code>
<code>\t\t\tif(doc.text().contains("research")){/<code>
<code>\t\t\t\tSystem.out.println(URL);/<code>
<code>\t\t\t}/<code>
<code>
<code>\t\t\t//get all links and recursively call the processPage method/<code>
<code>\t\t\tElements questions = doc.select("a[href]");/<code>
<code>\t\t\tfor(Element link: questions){/<code> 
<code>\t\t\t\tif(link.attr("href").contains("mit.edu"))/<code>
<code>\t\t\t\t\tprocessPage(link.attr("abs:href"));/<code>
<code>\t\t\t}/<code>
<code>\t\t}/<code>
<code>\t}}/<code>


最後,開發這麼多年我也總結了一套學習Java的資料與面試題,如果你在技術上面想提升自己的話,可以關注我,私信發送領取資料或者在評論區留下自己的聯繫方式,有時間記得幫我點下轉發讓跟多的人看到哦。

如何使用Java製作網絡爬蟲?

如何使用Java製作網絡爬蟲?


分享到:


相關文章: