用 Java 拿下 HTML 分分鐘寫個小爬蟲
阿新 • • 發佈:2020-09-02
> 本文適合有 Java 基礎知識的人群
![](https://img2020.cnblogs.com/blog/759200/202009/759200-20200901132548961-938462130.png)
本文作者:HelloGitHub-秦人
HelloGitHub 推出的[《講解開源專案》](https://github.com/HelloGitHub-Team/Article)系列,今天給大家帶來一款開源 Java 版一款網頁元素解析框架——jsoup,通過程式自動獲取網頁資料。 > 專案原始碼地址:https://github.com/jhy/jsoup ## 一、專案介紹 jsoup 是一款 Java 的 HTML 解析器。可直接解析某個 URL 地址的 HTML 文字內容。它提供了一套很省力的 API,可通過 DOM、CSS 以及類似於 jQuery 選擇器的操作方法來取出和操作資料。 **jsoup 主要功能:** 1. 從一個 URL、檔案或字串中解析 HTML。 2. 使用 DOM 或 CSS 選擇器來查詢、取出資料。 3. 可操作 HTML 元素、屬性、文字。 ## 二、使用框架 ### 2.1 準備工作 - 掌握 HTML 語法 - Chrome 瀏覽器除錯技巧 - 掌握開發工具 idea 的基本操作 ### 2.2 學習原始碼 將專案匯入 idea 開發工具,會自動下載 maven 專案需要的依賴。原始碼的專案結構如下: ![](https://img2020.cnblogs.com/blog/759200/202009/759200-20200901132557457-138154238.png) **快速學習原始碼**是每個程式設計師必備的技能,我總結了以下幾點: 1. 閱讀專案 `ReadMe` 檔案,可以快速知道專案是做什麼的。 2. 概覽專案 `pom.xml` 檔案,瞭解專案引用了哪些依賴。 3. 檢視專案結構、原始碼目錄、測試用例目錄,好的專案結構清晰,層次明確。 4. 執行測試用例,快速體驗專案。 ### 2.3 下載專案 ``` git clone https://github.com/jhy/jsoup ``` ### 2.4 執行專案測試程式碼 通過上面的方法,我們很快可知 `example` 目錄是測試程式碼,那我們直接來執行。注:有些測試程式碼需要稍微改造一下才可以執行。 例如,jsoup 的 Wikipedia 測試程式碼: ```java public class Wikipedia { public static void main(String[] args) throws IOException { Document doc = Jsoup.connect("http://en.wikipedia.org/").get(); log(doc.title()); Elements newsHeadlines = doc.select("#mp-itn b a"); for (Element headline : newsHeadlines) { log("%s\n\t%s", headline.attr("title"), headline.absUrl("href")); } } private static void log(String msg, String... vals) { System.out.println(String.format(msg, vals)); } } ``` 說明:上面程式碼是獲取頁面(http://en.wikipedia.org/)包含(#mp-itn b a)選擇器的所有元素,並列印這些元素的 `title` , `herf` 屬性。 `維基百科` 國內無法訪問,所以上面這段程式碼執行會報錯。 改造後可執行的程式碼如下: ```java public static void main(String[] args) throws IOException { Document doc = Jsoup.connect("https://www.baidu.com/").get(); Elements newsHeadlines = doc.select("a[href]"); for (Element headline : newsHeadlines) { System.out.println("href: " +headline.absUrl("href") ); } } ``` ## 三、工作原理 Jsoup 的工作原理,首先需要指定一個 URL,框架傳送 HTTP 請求,然後獲取響應頁面內容,然後通過各種選擇器獲取頁面資料。整個工作流程如下圖: ![](https://img2020.cnblogs.com/blog/759200/202009/759200-20200901132607662-794371287.png) 以上面為例: ### 3.1 發請求 ```java Document doc = Jsoup.connect("https://www.baidu.com/").get(); ``` 這行程式碼就是傳送 HTTP 請求,並獲取頁面響應資料。 ### 3.2 資料篩選 ```java Elements newsHeadlines = doc.select("a[href]"); ``` 定義選擇器,獲取匹配選擇器的資料。 ### 3.3 資料處理 ```java for (Element headline : newsHeadlines) { System.out.println("href: " +headline.absUrl("href") ); } ``` 這裡對資料只做了一個簡單的資料列印,當然這些資料可寫入檔案或資料的。 ## 四、實戰 獲取**豆瓣讀書** -> **新書速遞**中每本新書的基本資訊。包括:書名、書圖片連結、作者、內容簡介(詳情頁面)、作者簡介(詳情頁面)、噹噹網書的價格(詳情頁面),最後將獲取的資料儲存到 Excel 檔案。 目標連結:`https://book.douban.com/latest?icn=index-latestbook-all` ### 4.1 專案 pom.xml 檔案 專案引入 jsoup、lombok、easyexcel 三個庫。 ```xml ``` ### 4.2 解析頁面資料 ```java public class BookInfoUtils { public sta