更新時(shí)間:2022-03-25 11:37:49 來源:動(dòng)力節(jié)點(diǎn) 瀏覽1530次
互聯(lián)網(wǎng)上有很多有用的信息。我們?nèi)绾尾拍茏詣?dòng)獲取這些信息?- 是的,Java網(wǎng)絡(luò)爬蟲。
這篇文章展示了如何使用 Java 制作一個(gè)簡(jiǎn)單的 Web 爬蟲原型。制作一個(gè)網(wǎng)絡(luò)爬蟲并不像聽起來那么困難。只需按照指南,您將在 1 小時(shí)或更短的時(shí)間內(nèi)快速到達(dá)那里,然后享受它可以為您獲取的大量信息。由于這只是一個(gè)原型,您需要花更多的時(shí)間來定制它以滿足您的需求。
以下是本教程的先決條件:
基本的Java編程
一點(diǎn)關(guān)于 SQL 和 MySQL數(shù)據(jù)庫概念。
如果不想使用數(shù)據(jù)庫,可以使用文件來跟蹤爬取歷史。
在本教程中,目標(biāo)如下:
給定一個(gè)學(xué)校根 URL,例如“mit.edu”,返回該學(xué)校包含字符串“research”的所有頁面
典型的爬蟲按以下步驟工作:
解析根網(wǎng)頁(“mit.edu”),并從該頁面獲取所有鏈接。為了訪問每個(gè) URL 并解析 HTML 頁面,我將使用JSoup,它是一個(gè)用 Java 編寫的方便的網(wǎng)頁解析器。
使用從步驟 1 中檢索到的 URL,并解析這些 URL
在做上述步驟的時(shí)候,我們需要跟蹤之前處理過哪個(gè)頁面,這樣每個(gè)網(wǎng)頁只被處理一次。這就是我們需要數(shù)據(jù)庫的原因。
如果您使用的是 Ubuntu,您可以按照本指南安裝 Apache、MySQL、PHP 和 phpMyAdmin。
如果您使用的是 Windows,則可以簡(jiǎn)單地使用 WampServer。您可以從 wampserver.com 簡(jiǎn)單地下載它并在一分鐘內(nèi)安裝它,然后就可以進(jìn)行下一步了。
我將使用 phpMyAdmin 來操作 MySQL 數(shù)據(jù)庫。它只是一個(gè)使用 MySQL 的 GUI 界面。如果您使用任何其他工具或不使用 GUI 工具,那完全沒問題。
創(chuàng)建一個(gè)名為“Crawler”的數(shù)據(jù)庫并創(chuàng)建一個(gè)名為“Record”的表,如下所示:
<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">如果不存在 `Record` (`RecordID` int(11) NOT NULL AUTO_INCREMENT, `URL` text NOT NULL, PRIMARY KEY (`RecordID`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;</font></font>
(1)從 http://jsoup.org/download 下載 JSoup 核心庫。
從 http://dev.mysql.com/downloads/connector/j/ 下載 mysql-connector-java-xxxbin.jar
(2)現(xiàn)在在您的 Eclipse 中創(chuàng)建一個(gè)名為“Crawler”的項(xiàng)目,并將您下載的 JSoup 和 mysql-connector jar 文件添加到 Java Build Path。(右鍵單擊項(xiàng)目-->選擇“構(gòu)建路徑”->“配置構(gòu)建路徑”->單擊“庫”選項(xiàng)卡->單擊“添加外部 JAR”)
(3)創(chuàng)建一個(gè)名為“DB”的類,用于處理數(shù)據(jù)庫操作。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DB {
public Connection conn = null;
public DB() {
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/Crawler";
conn = DriverManager.getConnection(url, "root", "admin213");
System.out.println("conn built");
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public ResultSet runSql(String sql) throws SQLException {
Statement sta = conn.createStatement();
return sta.executeQuery(sql);
}
public boolean runSql2(String sql) throws SQLException {
Statement sta = conn.createStatement();
return sta.execute(sql);
}
@Override
protected void finalize() throws Throwable {
if (conn != null || !conn.isClosed()) {
conn.close();
}
}
}
(4)創(chuàng)建一個(gè)名為“Main”的類,這將是我們的爬蟲。
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;
public class Main {
public static DB db = new DB();
public static void main(String[] args) throws SQLException, IOException {
db.runSql2("TRUNCATE Record;");
processPage("http://www.mit.edu"http://www.mit.edu");
}
public static void processPage(String URL) throws SQLException, IOException{
//check if the given URL is already in database
String sql = "select * from Record where URL = '"+URL+"'";
ResultSet rs = db.runSql(sql);
if(rs.next()){
}else{
//store the URL to database to avoid parsing again
sql = "INSERT INTO `Crawler`.`Record` " + "(`URL`) VALUES " + "(?);";
PreparedStatement stmt = db.conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
stmt.setString(1, URL);
stmt.execute();
//get useful information
Document doc = Jsoup.connect("http://www.mit.edu/"http://www.mit.edu/").get();
if(doc.text().contains("research")){
System.out.println(URL);
}
//get all links and recursively call the processPage method
Elements questions = doc.select("a[href]");
for(Element link: questions){
if(link.attr("href").contains("mit.edu"))
processPage(link.attr("abs:href"));
}
}
}
}
現(xiàn)在您有了自己的Java網(wǎng)絡(luò)爬蟲。當(dāng)然,您需要過濾掉一些您不想抓取的鏈接。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743