摘要:優雅的使用框架,爬取唐詩別苑網的詩人詩歌數據同時在幾種動態加載技術中對比作選擇雖然差不多兩年沒有維護,但其本身是一個優秀的爬蟲框架的實現,源碼中有很多值得參考的地方,特別是對爬蟲多線程的控制。
優雅的使用WebMagic框架,爬取唐詩別苑網的詩人詩歌數據
同時在幾種動態加載技術(HtmlUnit、PhantomJS、Selenium、JavaScriptEngine)中對比作選擇
WebMagic雖然差不多兩年沒有維護,但其本身是一個優秀的爬蟲框架的實現,源碼中有很多值得參考的地方,特別是對爬蟲多線程的控制。另外,由于頁面爬取到的是非結構化數據,所以數據保存到MongoDB。技術準備
IDE:IntelliJ IDEA 2018.3.5
JDK版本:1.8.0_181
數據庫:MongoDB 4.0.10
涉及技術:
Webmagic輕量級爬蟲框架
HtmlUnit網頁分析工具包,模擬瀏覽器運行
PhantomJS
JavaScriptEngine
MongoDB ORM框架 Morphia
JUC:Java線程池、線程協作、線程安全類
日志log4j 1.7.25
Java反射
單例模式、工廠模式、代理模式
pom.xml文件中的依賴非常簡單,并沒有使用到Spring系列的框架,所以有些地方自己編碼實現了Spring提供的功能項目結構
biz包:包括頁面爬取邏輯的Processor類,爬蟲結果保存的Pipeline類
dao包:數據獲取層
entity包:實體類,映射保存在MongoDB的文檔(Document)
vo包:值對象,簡單的Java對象
util包:工具包,包括數據庫連接類、爬蟲輔助類
common包:項目相關通用類
Main類:程序入口
項目說明根據需求將數據保存到MongoDB數據庫,因此在程序運行前必須設置好resources/mongodb.properties文件
最好保證MongoDB的版本是4.0以上。另外MongoDB的用戶管理比較麻煩,過程大致如下:首先需要創建存儲數據的數據庫,如命名為user_tangpoem,并存入隨便一條數據(集合)使數據庫有效化,然后創建一個
admin數據庫的root用戶,繼續創建一個可以讀寫應用數據庫user_tangpoem的用戶,然后修改MongoDB配置文件使其以安全認證模式啟動。重啟數據庫,選擇admin數據庫(use admin)
用剛剛創建的用戶(非root用戶)使用db.auth()進行登錄,返回1說明驗證成功,選擇user_tangpoem數據庫(use user_tangpoem),輸入show collections,如果看到最初創建數據庫時的集合,則說明用戶創建成功。
詳細可參考 MongoDB4.0.0 遠程連接及用戶名密碼認證登陸配置——windows
爬蟲以多線程的方式運行,在resources/spider.properties文件中可以設置線程數和線程睡眠時間,在設置好數據庫配置的基礎上,直接運行Main.main(),爬蟲就會開始爬取。
線程睡眠,是WebMagic框架源碼中每線程爬取完一個url后必然經歷的過程,但作者文檔并沒有對此進行說明,請根據實際情況調整動態加載技術的選擇 1. PhantomJS和Selenium
WebMagic底層已經很好的使用了HttpClient加載靜態頁面,對于動態頁面,也有PhantomJSDownloader和SeleniumDownloader兩個常用的利用
瀏覽器內核模擬瀏覽器行為的實現,其中,PhantomJS需要指定phantomjs.exe和進行爬取的JS文件,而seleniumDownloader需要指定chromedriver.exe,需要自行下載對應操作系統的版本,
使用起來并不難,本項目不多作討論。這里關鍵說明HtmlUnit
一款開源的Java頁面分析工具,讀取頁面后,可以有效的使用HtmlUnit分析頁面上的內容。使用純Java實現的模擬瀏覽器,不需要指定外部文件。
雖然其對JS的支持并不完全,但總體而言HtmlUnit的內存消耗、CPU消耗和效率都比PhantomJS和Selenium好,值得進行使用
本項目使用2.25版本的HtmlUnit并沒有出現JS加在不成功的問題,但使用2.3x的版本會無法加載3. JavaScriptEngine
既然要加載JS,為何不直接提取JS代碼,使用Java自帶的JS引擎處理呢?
因為JavaScriptEngine是有局限性的,最明顯就是其不支持jquery的語法,因為jquery使用了瀏覽器內置的對象,而JS引擎本身是沒有瀏覽器對象的
那還能使用JS引擎嗎?
當然可以,只要分析過頁面的加載邏輯,如果不涉及瀏覽器對象的使用,或者將JS邏輯進行轉化,還是能夠使用JS引擎的,但犧牲了泛用性。本項目經分析后使用JS引擎加載
4. 橫向對比經過測試,三者比較如下
加載一個接口的效率:PhantomJS約13秒,HtmlUnit約10秒,JS引擎約6秒
內存消耗、CPU消耗:PhantomJS > HtmlUnit > JS引擎
PhantomJS使用外置的程序,所以JVM無法管理這部分的硬件資源,需要打開任務管理器爬取過程
經過分析,爬取步驟分為4步:
爬取所有的詩人id。調用一次接口即可獲得所有的詩人id,返回JSON格式數據,接口地址為:http://poem.studentsystem.org...
爬取所有的詩人信息。根據上一步的詩人id逐一爬取對應的詩人詳細信息,一共有 2529 條數據,則接口調用 2529 次,返回JSON格式數據,接口地址為:http://poem.studentsystem.org...{id}
爬取所有的詩歌信息。根據上一步的詩人信息獲取所有的詩歌id,然后逐一調用接口獲取詩歌詳細信息,一共有約 48000 條數據,則接口調用 48000 次,返回html頁面,需要模擬瀏覽器動態執行JS,接口地址為:http://poem.studentsystem.org...{id}
由于動態執行JS可會能超時,因此最后要處理未成功加載完畢的詩歌信息,從數據庫中讀取這類數據,再次構成url調用接口爬取,直到所有數據都完整。這類數據約占1%,則接口調用約 480 次
顯然,如上描述,采用的是寬度優先遍歷,所以當執行到第3步時,才會有數據入庫耗時估計優化后使用Java8的nashorn JS引擎執行JS代碼,不需要動態加載JS,所以不會出現4的問題
根據爬取過程分析,忽略程序啟動時間和調用獲取詩人id接口的時間
在開啟8線程的并發模式下(使用HtmlUnit進行動態加載):
調用獲取詩人信息的接口,每次需要5秒(5秒是線程內置的睡眠時間,可設置)
調用獲取詩歌信息的接口,每次需要10秒(包含了上述的5秒)
一共需要: 2529 / 8 5 + 48000 (1 + 0.01)/ 8 * 10 ≈ 62596秒 ≈ 1043分鐘 ≈ 17.4小時
上述數據是在本地測試中得到的,配置為 win10 8G i5-4210M 4核
優化后,用JS引擎取代模擬瀏覽器動態加載JS,獲取詩歌信息的耗時明顯縮短,由10秒縮短到6秒左右,因此重新計算耗時如下:
2529 / 8 5 + 48000 / 8 6 ≈ 37185秒 ≈ 620分鐘 ≈ 10.3小時
性能評估當使用模擬瀏覽器動態加載JS時,觀察JVM的使用情況,發現爬取詩歌階段頻繁發生Minor GC(新生代GC),差不多10秒一次,如下圖所示,
后判明是多線程模擬瀏覽器加載頁面行為非常的耗內存(參考同時打開8個瀏覽器加載網頁),對象頻繁創建,頻繁消耗,
建議運行時通過-Xms -Xmx把JVM內存設置得大些,至少1G,然后把新生代的比例設大,如-Xms2048M -Xmx2048M -XX:+UseParallelOldGC -XX:NewRatio=1
后來,用JS引擎取代模擬瀏覽器動態加載JS,不僅速度得到明顯提升,而且內存的消耗大幅度降低,Minor GC平均1分鐘發生一次,如下圖所示,
最后附上GitHub項目地址:https://github.com/Kanarienvogels/spider-tangpoem
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74977.html
摘要:有一個模塊其中實現了一個。但是感覺靈活性不大。接口如下它會獲得一個實例,你可以在里面進行任意的操作。本部分到此結束。 webmagic有一個selenium模塊,其中實現了一個SeleniumDownloader。但是感覺靈活性不大。所以我就自己參考實現了一個。 首先是WebDriverPool用來管理WebDriver池: import java.util.ArrayList; im...
摘要:是爬蟲框架中比較簡單易上手的一個。官網鏈接下面的例子是使用這個框架來爬取工商銀行的私人理財推薦分頁列表數據。頁面鏈接為引入配置如果項目已經引入記錄日志,則需要在中排除。 webmagic是java爬蟲框架中比較簡單易上手的一個。官網鏈接:http://webmagic.io/ 下面的例子是使用這個框架來爬取工商銀行的私人理財推薦分頁列表數據。頁面鏈接為:https://mybank.i...
摘要:爬蟲框架源碼分析之爬蟲框架源碼分析之爬蟲框架源碼分析之爬蟲框架源碼分析之爬蟲框架源碼分析之之進階 爬蟲框架Webmagic源碼分析之Spider爬蟲框架WebMagic源碼分析之Scheduler爬蟲框架WebMagic源碼分析之Downloader爬蟲框架WebMagic源碼分析之Selector爬蟲框架WebMagic源碼分析之SeleniumWebMagic之Spider進階
摘要:序是里頭比較優秀的一個爬蟲框架使用作為解析工具,并基于其開發了解析的工具。默認使用了作為下載工具。這里展示一下入門級使用。 序 webmagic是java里頭比較優秀的一個爬蟲框架: 使用Jsoup作為HTML解析工具,并基于其開發了解析XPath的工具Xsoup。 默認使用了Apache HttpClient作為下載工具。 這里展示一下入門級使用。 maven ...
摘要:獲取正在運行的線程數,用于狀態監控。之后初始化組件主要是初始化線程池將到中,初始化開始時間等。如果線程池中運行線程數量為,并且默認,那么就停止退出,結束爬蟲。 本系列文章,針對Webmagic 0.6.1版本 一個普通爬蟲啟動代碼 public static void main(String[] args) { Spider.create(new GithubRepoPageP...
閱讀 2448·2021-11-15 11:38
閱讀 2831·2021-11-02 14:44
閱讀 3812·2021-09-26 10:13
閱讀 3055·2021-08-13 15:02
閱讀 776·2019-08-30 15:56
閱讀 1427·2019-08-30 15:53
閱讀 2357·2019-08-30 13:01
閱讀 3184·2019-08-29 12:57