基於jsoup的爬蟲


通過jsoup對 企查查 的公司信息爬取

1、Jsoup

先介紹下Jsoup,它還有一個名稱“Beautifulsoup for Java”,對爬蟲知識感興趣的朋友一般都是從Python的爬蟲開始,那么自然不會對Beautifulsoup感到陌生,而Jsoup就是java環境下同樣具有html文檔解析的最好的選擇之一。

主要方法就是 Jsoup.parse(),解析出來的是一個Document對象。Element對象則提供了一系列類似於DOM的方法來查找元素,抽取並處理其中的元素。這邊還是根據官方文檔的中文版將它們一一列舉,以便使用:

查找元素

getElementById(String id)

getElementsByTag(String tag)

getElementsByClass(String className)

getElementsByAttribute(String key) (and related methods)

Element siblings: siblingElements(), firstElementSibling(), lastElementSibling(); nextElementSibling(), previousElementSibling()

Graph: parent(), children(), child(int index)

元素數據

attr(String key)獲取屬性attr(String key, String value)設置屬性

attributes()獲取所有屬性

id(), className() and classNames()

text()獲取文本內容text(String value) 設置文本內容

html()獲取元素內HTMLhtml(String value)設置元素內的HTML內容

outerHtml()獲取元素外HTML內容

data()獲取數據內容(例如:script和style標簽)

tag() and tagName()

操作HTML和文本

append(String html), prepend(String html)

appendText(String text), prependText(String text)

appendElement(String tagName), prependElement(String tagName)

html(String value)

這給我大致的感覺就像是html的讀寫,而爬蟲就是利用它的讀的功能。

2、爬蟲

一般來說,爬蟲都是模擬瀏覽器訪問的存在,但是有爬蟲也就有反爬蟲,尤其是像企查查這樣以數據為核心的類似網站,它所建立的反爬蟲機制是非常強的,這時,一般的爬蟲是難以獲取到想要得到的所有數據的。之前我所寫過的一個爬蟲(詳見github)拿來作為框架已經不合適了,我也想過再系統地去學python的爬蟲,為什么是python?因為它的第三方包多啊,也有相應的大型可以定制的爬蟲框架。但是萬一還是不行呢?然后就陷入了爬蟲與反爬蟲的攻防戰中,對,那樣應該是一個技術控要做的,但此時,更重要的是,減少時間成本與學習成本而獲得大量優秀有效的數據以便后續的數據開發與分析。所以我選擇一個最無腦的方式……

大家玩過瀏覽器的都知道有個保存網頁的功能吧,嗯,我們這次的爬蟲就是相當於解析本地文檔。這點當然受益於上一次爬蟲的開發,就很簡單的兩個功能,頁面請求與保存接着解析,寫好的爬蟲放在定時器中就可以自動執行了。這次的從代碼方面看更簡單,就是一次頁面解析的過程,如果有N個公司的信息要獲得,那么就寫N個HashMap吧!

其實有了思路再加上Jsoup的方法那么簡單使用,很快就能完成。

相關代碼就放在github上了。

3、個人使用經驗

其實有代碼有說明,照着弄只要時間長點基本都能弄出來。所以這里要提供點精華了 ^_^

關於表格數據的抓取(解析)

對於表格,一般來說獲取表格數據時,都會寫一個循環,因為每一行的結構都是一樣的,而通過Tag的Name獲取時,會同時獲取表頭。

比如: <tr><th>身高</th></tr>

我們要獲取的是“身高”屬性 這一列的值,而並不需要“身高”。

那么我們可以直接結束整個循環的第一次。

操作方法就是:

boolean flag = true;

在循環里加入

 

if(flag) {
        flag = false;
       }else {
        ... //需要執行的語句
           }

 

這樣就可以過濾掉表頭了。

上面的方法是用來解決水平結構的表格。

還有一種垂直結構的表格。

我自己的辦法是,因為這種表格的表頭都是有自己的標簽的,所以直接利用jsoup先把dom處理一次。

Document.getElementsByClass("#").remove();

 之后再獲取自己想要的信息吧~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM