用Java 拿下 HTML,分分鐘寫個小爬蟲!

2020-12-24 CSDN

作者 | HelloGitHub-秦人

HelloGitHub 推出的《講解開源項目》系列,今天給大家帶來一款開源 Java 版一款網頁元素解析框架——jsoup,通過程序自動獲取網頁數據。

項目源碼地址:https://github.com/jhy/jsoup

項目介紹

jsoup 是一款 Java 的 HTML 解析器。可直接解析某個 URL 地址的 HTML 文本內容。它提供了一套很省力的 API,可通過 DOM、CSS 以及類似於 jQuery 選擇器的操作方法來取出和操作數據。

jsoup 主要功能:

從一個 URL、文件或字符串中解析 HTML。使用 DOM 或 CSS 選擇器來查找、取出數據。可操作 HTML 元素、屬性、文本。

使用框架

2.1 準備工作

掌握 HTML 語法Chrome 瀏覽器調試技巧掌握開發工具 idea 的基本操作2.2 學習源碼

將項目導入 idea 開發工具,會自動下載 maven 項目需要的依賴。源碼的項目結構如下:

快速學習源碼是每個程式設計師必備的技能,我總結了以下幾點:

閱讀項目 ReadMe 文件,可以快速知道項目是做什麼的。概覽項目 pom.xml 文件,了解項目引用了哪些依賴。查看項目結構、源碼目錄、測試用例目錄,好的項目結構清晰,層次明確。運行測試用例,快速體驗項目。2.3 下載項目

git clone https://github.com/jhy/jsoup

2.4 運行項目測試代碼

通過上面的方法,我們很快可知 example 目錄是測試代碼,那我們直接來運行。註:有些測試代碼需要稍微改造一下才可以運行。

例如,jsoup 的 Wikipedia 測試代碼:

publicclassWikipedia {publicstaticvoidmain(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")); } }privatestaticvoidlog(String msg, String... vals) { System.out.println(String.format(msg, vals)); }}

說明:上面代碼是獲取頁面(http://en.wikipedia.org/)包含(#mp-itn b a)選擇器的所有元素,並列印這些元素的 title , herf 屬性。維基百科 國內無法訪問,所以上面這段代碼運行會報錯。

改造後可運行的代碼如下:

publicstaticvoidmain(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 請求,然後獲取響應頁面內容,然後通過各種選擇器獲取頁面數據。整個工作流程如下圖:

以上面為例:

3.1 發請求

Document doc = Jsoup.connect("https://www.baidu.com/").get();

這行代碼就是發送 HTTP 請求,並獲取頁面響應數據。

3.2 數據篩選

Elements newsHeadlines = doc.select("a[href]");

定義選擇器,獲取匹配選擇器的數據。

3.3 數據處理

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 version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>JsoupTest</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.target>1.8</maven.compiler.target><maven.compiler.source>1.8</maven.compiler.source></properties><dependencies><dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.13.1</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.12</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version></dependency></dependencies></project>

4.2 解析頁面數據

publicclassBookInfoUtils {publicstatic List<BookEntity> getBookInfoList(String url) throws IOException {List<BookEntity> bookEntities=new ArrayList<>(); Document doc = Jsoup.connect(url).get(); Elements liDiv = doc.select("#content > div > div.article > ul > li");for (Element li : liDiv) { Elements urls = li.select("a[href]"); Elements imgUrl = li.select("a > img"); Elements bookName = li.select(" div > h2 > a"); Elements starsCount = li.select(" div > p.rating > span.font-small.color-lightgray"); Elements author = li.select("div > p.color-gray"); Elements description = li.select(" div > p.detail"); String bookDetailUrl = urls.get(0).attr("href"); BookDetailInfo detailInfo = getDetailInfo(bookDetailUrl); BookEntity bookEntity = BookEntity.builder() .detailPageUrl(bookDetailUrl) .bookImgUrl(imgUrl.attr("src")) .bookName(bookName.html()) .starsCount(starsCount.html()) .author(author.text()) .bookDetailInfo(detailInfo) .description(description.html()) .build();// System.out.println(bookEntity); bookEntities.add(bookEntity); }return bookEntities; }/** * * @param detailUrl * @return * @throws IOException */publicstatic BookDetailInfo getDetailInfo(String detailUrl)throws IOException{ Document doc = Jsoup.connect(detailUrl).get(); Elements content = doc.select("body"); Elements price = content.select("#buyinfo-printed > ul.bs.current-version-list > li:nth-child(2) > div.cell.price-btn-wrapper > div.cell.impression_track_mod_buyinfo > div.cell.price-wrapper > a > span"); Elements author = content.select("#info > span:nth-child(1) > a"); BookDetailInfo bookDetailInfo = BookDetailInfo.builder() .author(author.html()) .authorUrl(author.attr("href")) .price(price.html()) .build();return bookDetailInfo; }}

這裡的重點是要獲取網頁對應元素的選擇器。

例如:獲取 li.select("div > p.color-gray") 中 div > p.color-gray 是怎麼知道的。

使用 chrome 的小夥伴應該都猜到了。打開 chrome 瀏覽器 Debug 模式,Ctrl + Shift +C 選擇一個元素,然後在 html 右鍵選擇 Copy ->Copy selector,這樣就可以獲取當前元素的選擇器。如下圖:

4.3 存儲數據到 Excel

為了數據更好查看,我將通過 jsoup 抓取的數據存儲的 Excel 文件,這裡我使用的 easyexcel 快速生成 Excel 文件。

Excel 表頭信息

@Data@BuilderpublicclassColumnData{@ExcelProperty("書名稱")private String bookName;@ExcelProperty("評分")private String starsCount;@ExcelProperty("作者")private String author;@ExcelProperty("封面圖片")private String bookImgUrl;@ExcelProperty("簡介")private String description;@ExcelProperty("單價")private String price;}

生成 Excel 文件

publicclassEasyExcelUtils{publicstatic void simpleWrite(List<BookEntity> bookEntityList) { String fileName = "D:\\devEnv\\JsoupTest\\bookList" + System.currentTimeMillis() + ".xlsx"; EasyExcel.write(fileName, ColumnData.class).sheet("書本詳情").doWrite(data(bookEntityList)); System.out.println("excel文件生成完畢..."); }privatestaticList<ColumnData> data(List<BookEntity> bookEntityList) {List<ColumnData> list = new ArrayList<>(); bookEntityList.forEach(b -> { ColumnData data = ColumnData.builder() .bookName(b.getBookName()) .starsCount(b.getStarsCount()) .author(b.getBookDetailInfo().getAuthor()) .bookImgUrl(b.getBookImgUrl()) .description(b.getDescription()) .price(b.getBookDetailInfo().getPrice()) .build();list.add(data); });returnlist; }}

4.4 最終展示效果

最終的效果如下圖:

以上就是從想法到實踐,我們就在實戰中使用了 jsoup 的基本操作。

完整代碼地址:https://github.com/hellowHuaairen/JsoupTest

最後

Java HTML Parser 庫:jsoup,把它當成簡單的爬蟲用起來還是很方便的吧?

為什麼會講爬蟲?大數據,人工智慧時代玩的就是數據,數據很重要。作為懂點技術的我們,也需要掌握一種獲取網絡數據的技能。當然也有一些工具 Fiddler、webscraper 等也可以抓取你想要的數據。

教程至此,你應該也能對 jsoup 有一些感覺了吧。編程是不是也特別有意思呢?參考我上面的實戰案例,有好多網站可以實踐一下啦~

相關焦點

  • 寫網絡爬蟲程序的難度是怎麼分等級的
    寫網絡爬蟲程序的難度是怎麼分等級的 猿人學 發表於 2020-02-05 11:49:55 寫爬蟲,是一個非常考驗綜合實力的活兒。
  • Java爬蟲實現爬取招聘網站信息
    Java也能爬蟲?你不要騙我!首先糾正一個常見的誤區:爬蟲只能由Python來做。提到爬蟲,大多數人可能會想到Python,並把它們混為一談。實則不然,其實很多程式語言都能夠寫爬蟲,只不過用Python的人比較多而已。今天要給大家介紹的是用Java來寫一個爬蟲,實現獲取招聘網站信息的功能。那麼,到底什麼是爬蟲呢?
  • requests-html:最簡單的爬蟲框架,看完你就會了
    很多朋友都聽說過Python的大名,而Python也擁有眾多的爬蟲框架,其中最簡單的莫過於requests-html了。它和著名的網絡請求庫requests是同一個作者,著重於XML數據提取,可以說是最簡單的爬蟲框架了。安裝requests-html安裝這個類庫非常簡單,直接通過pip就可以安裝了。
  • 程式設計師:Java爬蟲使用Selenium+Autoit自動化爬取複雜頁面
    前言最近玩爬蟲的時候,遇到一個國外的圖片網站,具體哪個就不說了,這個站很有意思,即使拿到了圖片的連結,用httpclient下載都不行,不是User-Agent的原因,不知道圖片伺服器的後端有什麼校驗,沒辦法了,只能用Selenium上了,js逆向成本太高了(其實是我不擅長0.0)這個站用的
  • Python爬蟲入門教程:超級簡單的Python爬蟲教程
    這是一篇詳細介紹 Python 爬蟲入門的教程,從實戰出發,適合初學者。讀者只需在閱讀過程緊跟文章思路,理清相應的實現代碼,30 分鐘即可學會編寫簡單的 Python 爬蟲。如果用人體來比喻,HTML 是人的骨架,並且定義了人的嘴巴、眼睛、耳朵等要長在哪裡。CSS 是人的外觀細節,如嘴巴長什麼樣子,眼睛是雙眼皮還是單眼皮,是大眼睛還是小眼睛,皮膚是黑色的還是白色的等。JScript 表示人的技能,例如跳舞、唱歌或者演奏樂器等。
  • 簡單直觀的python爬蟲程序,從flask建立web程序到爬取過程
    有很多時候,要說清楚一個爬蟲程序對於新手來說有點抽象,不是那麼好理解,有一個好的辦法,爬蟲爬取的都是web網站的資源,那麼就可以用輕量級web框架flask來搭建一個web網站,然後寫一個爬蟲腳本來爬取這樣就可以比較容易的理解其工作原理。
  • python開發爬蟲有門檻嗎?
    01用python開發爬蟲你需要擁有前端知識爬蟲是什麼?爬蟲其實是一個抓取網際網路信息的一個功能or一個軟體。怎麼樣獲取特定信息,這就需要你了解前端,知道怎麼分析html結構,會用F12打開瀏覽器調試工具,找到你要的內容。比如
  • 當代「爬蟲」現狀
    一、「爬蟲」是什麼 大東:小白,身為計算機學科的學生,「網絡爬蟲」你應該不陌生吧? 小白:那當然了,寫的最多的就是「爬蟲」程序了。 大東:既然你這麼熟悉,能給我講講什麼是「爬蟲」麼?
  • 動力節點Java學院2021年Java學習路線圖最新出爐啦
    熱門、主流框架有如下幾個,也是我們重點所學:Spring框架,佔據統治地位,其生態系統涉及各個方面解決方案;MyBatis框架,使用ORM思想對資料庫進行操作。第七階段:框架項目://www.bjpowernode.com/javavideo/110.htmlJavase進階http://www.bjpowernode.com/javavideo/144.html資料庫MySQL視頻http://www.bjpowernode.com/javavideo/111.htmlJDBC視頻http
  • Python爬蟲推薦用什麼框架呢?
    實現爬蟲技術的編程環境有很多種,Java、Python、C++等都可以用來爬蟲,但最熱門的依然是Python,這是為什麼呢?因為Python有著非常豐富的第三方庫,確實很適合做爬蟲,簡單的幾行代碼便可實現你想要的功能,同時Python也是數據挖掘和分析的好能手。
  • 用CSharp 來寫爬蟲(入門)
    一說到爬蟲估計很多人第一時間想到的是python,今天我們就用c#寫一個簡單的爬蟲小示例。我們採用的是HtmlAgilityPack組件這個插件能夠讓我們快速的爬取一些簡單的頁面,下面我以百度熱榜為例進行測試。
  • Python爬蟲並自製新聞網站,太好玩了
    使用Flask+爬蟲,教大家如何實時展示自己爬下來的數據到網頁上。先給大家展示一下這個醜醜的網頁 ↓(給個面子,別笑)整個流程就是簡單的三步:爬取數據利用實時爬取數據生成詞雲利用熱點推薦新聞爬虫部分這次爬蟲主要利用多線程方式爬取新浪新聞+網易新聞所有欄目新聞信息。
  • 初學者如何用「python爬蟲」技術抓取網頁數據?
    在當今社會,網際網路上充斥著許多有用的數據。我們只需要耐心觀察並添加一些技術手段即可獲得大量有價值的數據。而這裡的「技術手段」就是指網絡爬蟲。 今天,小編將與您分享一個爬蟲的基本知識和入門教程:什麼是爬蟲?
  • 使用Scrapy網絡爬蟲框架小試牛刀
    說人話就是只要是搞爬蟲的,用這個就van事了,因為裡面集成了一些很棒的工具,並且爬取性能很高,預留有很多鉤子方便擴展,實在是居家爬蟲的不二之選。文件代碼解釋如下如果大家在學習中遇到困難,想找一個python學習交流環境,可以加入我們的python裙,關注小編,並私信「01」即可進裙,領取python學習資料,會節約很多時間,減少很多遇到的難題。
  • 「原創」用jquery做爬蟲
    考慮到是做定向爬取,我就選擇了jquery,因為jquery相比其他語言做爬蟲是簡單輕鬆很多。不同語言自然會有不同用處。離開環境談哪個好,哪個不好都是耍流氓。1,如果是自己做著玩的話,定向爬幾個頁面,效率不是核心要求的話,問題不會大,什麼語言都行的,性能差異不會大。當然,如果碰到十分複雜的頁面,正則寫的很複雜的話,爬蟲的可維護性就會下降。2,如果是做定向爬取,而目標又要解析動態js。
  • Python入門指南教程:10天學會使用python做爬蟲!免費領取!
    從去年開始,公眾號鋪天蓋地的python廣告,讓很多行外人也知道了python這個東西,python語言開始變得無所不能,剛畢業的新手用python能做什麼?三分鐘做好了職場老手一天才能做完的表格十分鐘採集下全網競爭對手的數據寫一個軟體一年躺賺幾十萬!
  • 進階版python獲取天氣信息——爬蟲入門
    瀏覽器基於這些問題,今天我們就來個進階版的獲取天氣信息方法——爬蟲獲取,同時該例子也是理解入門爬蟲的最好例子。2.提取有用的數據對於數據的提取就是解析下載下來html,然後根據規則提取裡面有用的信息。這裡主要用到 lxml庫,它是Python的一個解析庫,支持HTML和XML的解析,支持XPath。XPath 是一門在 XML 文檔中查找信息的語言,XPath 可用來在 XML 文檔中對元素和屬性進行遍歷。
  • 會寫Java,不一定會用Collections,你會用嗎
    今天寫一下 Collections,這是Java官方提供的針對集合類的工具類,也是在開發中的一把利刃,能幫我們解決很多開發中的問題,但是依然有很多人不會或者不了解其中的API,一起學習下。1.Collectors,Collection,Collections傻傻分不清楚這可能是初學者遇到的問題,三個都和collect相關的。其中的分別也很簡單。
  • Python,爬蟲開發的不二選擇
    如果我們把網際網路比作一張大的蜘蛛網,數據便是存放於蜘蛛網的各個節點,而爬蟲就是一隻小蜘蛛,沿著網絡抓取自己的獵物(數據)。爬蟲指的是:向網站發起請求,獲取資源後分析並提取有用數據的程序。html5lib – 根據WHATWG規範生成HTML/ XML文檔的DOM。該規範被用在現在所有的瀏覽器上。feedparser – 解析RSS/ATOM feeds。
  • 看綜藝是為了學爬蟲,最後居然搞的深度學習,這Python課也是絕了
    普通Python學習讓人倦同學們,這次我們要學習用Python來做爬蟲,爬取的是深度學習的訓練資料。估計這麼一說,大部分同學是這樣的。少部分同學可能覺得爬蟲和深度學習比較時髦,還能硬著頭皮來聽講,但心裡肯定直打鼓,「這肯定是從入門到放棄吧?」