劉曉東 林鳳德 朱文歡
摘? 要:網(wǎng)絡(luò)爬蟲是實現(xiàn)數(shù)據(jù)分析的重要基礎(chǔ),通過網(wǎng)絡(luò)爬蟲可實現(xiàn)對數(shù)據(jù)的獲取。針對爬蟲的渠道廣、數(shù)量多且雜、單點效率低的問題,引入了輕量級的多線程爬蟲框架Crawler4j和分布式定時任務(wù)調(diào)度框架Quartz,文章主要基于這兩個框架來搭建穩(wěn)定、高效的分布式爬蟲系統(tǒng)。
關(guān)鍵詞:網(wǎng)絡(luò)爬蟲;分布式;Crawler4j;Quartz
Abstract: Web crawler is an important foundation of data analysis, through which data can be acquired. Aiming at the problem of crawler's wide channel, large number and miscellaneous, and low efficiency of single point, the lightweight multi-threaded crawler framework Crawler4j and the distributed timed task scheduling framework Quartz are introduced. This paper mainly builds a stable and efficient distributed crawler system based on these two frameworks.
網(wǎng)絡(luò)爬蟲(Web Crawler)是指按照特定的方式,自動獲取網(wǎng)絡(luò)中大量數(shù)據(jù)(包括結(jié)構(gòu)化數(shù)據(jù)、半結(jié)構(gòu)化數(shù)據(jù),以及非結(jié)構(gòu)化數(shù)據(jù))的程序或者腳本。在大數(shù)據(jù)時代,數(shù)據(jù)就是財富,得數(shù)據(jù)者得天下,所以作為獲取網(wǎng)絡(luò)數(shù)據(jù)的網(wǎng)絡(luò)爬蟲技術(shù)將越來越受到重視。網(wǎng)絡(luò)爬蟲技術(shù)不僅涉及到網(wǎng)絡(luò)知識、網(wǎng)頁前后端知識,而且還包含各種輔助工具,是個綜合的技術(shù)[1]。本文通過開源框架Crawler4j[2]和Quartz[3]來構(gòu)建定時循環(huán)、穩(wěn)定、快速的多線程分布式爬蟲系統(tǒng),最終實現(xiàn)爬蟲的高效數(shù)據(jù)采集功能。
2 技術(shù)選型
2.1 Quartz中集成Crawler4j
Crawler4j是一款基于Java的輕量級單機開源爬蟲框架[2],該框架的特點是實現(xiàn)簡單、速度快、容易上手,同時該框架支持多線程、過濾重復url、垂直獲取數(shù)據(jù)等功能。在使用Crawler4j框架時,需要關(guān)注兩個重要的類,一個類是:WebCrawler類,它負責匹配url規(guī)則、解析html頁面和提取所需數(shù)據(jù);另外一個類為:Controller類,它用來控制爬蟲的各種狀態(tài)。對于Crawler4j的配置,需要根據(jù)不同的爬蟲任務(wù)來進行定制化設(shè)計,如setMaxDepthOfCrawling()[2]就是配置最大深度,setMaxPagesToFetch()[2]就是頁面抓取的最大數(shù)量,對于不同的配置,需要查看官方文檔[2]。
Quartz是任務(wù)調(diào)度領(lǐng)域的一個開源項目[3],其最大的特點是擁有豐富的功能,它可以用來創(chuàng)建或者運行少則幾個,多則十個、百個、甚至幾萬個復雜任務(wù)。Quartz框架中定時任務(wù)部分是在Job類的void execute(JobExecutionContextcontext)[3]方法中執(zhí)行,如果想要集成Crawler4j爬蟲框架,只需在execute()方法中構(gòu)造Crawler4j配置及啟動對應(yīng)配置爬蟲線程,這樣就能夠?qū)崿F(xiàn)定時爬蟲任務(wù)了。啟動爬蟲任務(wù)后,用Crawler4j自帶的解析特性來解析對應(yīng)url返回的頁面。但是這種方法不是通用的,所以對于一些特殊頁面還需要采取自定義解析類來解析。
2.2 分布式實現(xiàn)原理
需要獲取的數(shù)據(jù)來源渠道眾多,有門戶網(wǎng)站、快訊、自媒體等等。各渠道的數(shù)據(jù)結(jié)構(gòu)也不統(tǒng)一,這樣便導致每一個任務(wù)都很個性化,需要做定制化處理來滿足需求。依托Quartz不僅可以實現(xiàn)成百上千個任務(wù)的運行和管理,而且每一個任務(wù)都可以做定制化處理[4]。單個節(jié)點運行眾多任務(wù)的時候,存在著運行效率低、獲取數(shù)據(jù)不及時、無法高可用等問題。通過引入分布式系統(tǒng)可以有效地提高系統(tǒng)的整體運行效率,同時解決高可用問題,保證系統(tǒng)的穩(wěn)定運行。
在集群中,每個節(jié)點能和數(shù)據(jù)庫組成一個獨立且完整的應(yīng)用。Quartz通過數(shù)據(jù)庫來調(diào)度當前節(jié)點與其他節(jié)點進行協(xié)作,每個節(jié)點的啟動或停止是相互獨立的行為,它們之間沒有任何通信。Quartz集群在同一個數(shù)據(jù)庫下,由數(shù)據(jù)庫中保存狀態(tài)來判斷調(diào)度任務(wù)是否正在執(zhí)行,并且其他節(jié)點不能執(zhí)行正在執(zhí)行中的任務(wù),這樣就保證了該任務(wù)的實例在集群中是單實例運行的,并且集群中分配任務(wù)是按照負載均衡策略來進行[5,6]。當任務(wù)在其中一個節(jié)點中運行失敗,數(shù)據(jù)庫中會有狀態(tài)的記錄,并且馬上重新分配到另外一個節(jié)點中啟動運行,這樣便保證了任務(wù)的高可用性。
3 分布式爬蟲系統(tǒng)
3.1 分布式系統(tǒng)搭建
搭建基于Quartz的集群,首先要建立數(shù)據(jù)庫表結(jié)構(gòu)。運行官方網(wǎng)站docs/dbTables[3]路徑下的腳本文件,在mysql中創(chuàng)建對應(yīng)的11張表,如圖1所示,它是實現(xiàn)集群的基礎(chǔ)。
其次需要編寫Quartz對應(yīng)的配置文件,可以在quartz.properties配置,也可以把配置文件寫到對應(yīng)的configuration中。在配置中特別需要注意isClustered 必須設(shè)置為True,否則不能實現(xiàn)分布式集群。
最后就是定義實現(xiàn)Job接口的爬蟲任務(wù)類,配置Crawler4j,把對應(yīng)的配置放在數(shù)據(jù)庫中。如圖2所示,當任務(wù)啟動時就去數(shù)據(jù)庫獲取對應(yīng)任務(wù)Crawler4j配置,添加到Crawler4j的框架中。用SpringBoot來集成Quartz,啟動SpringBoot就能實現(xiàn)對應(yīng)的定時任務(wù)。
3.2 定制化任務(wù)實現(xiàn)
為了滿足定制化任務(wù)[7]的需要,以及實現(xiàn)管理端對爬蟲任務(wù)的管理和監(jiān)控,在數(shù)據(jù)庫表中設(shè)計了t_crawler_task(任務(wù))表和t_sched_card(令牌)表。利用這兩張表可以實現(xiàn)對任務(wù)的增刪改查,同時滿足對任務(wù)的定制化,比如需要對定時實現(xiàn)定制化,只需在cron字段填上定制化的時間就能實現(xiàn)定時任務(wù)的定制化。
Quartz實現(xiàn)定時調(diào)度系統(tǒng)是將任務(wù)開發(fā)和任務(wù)調(diào)度進行分離[6]。開發(fā)人員不需要考慮任務(wù)的調(diào)度問題,只需要考慮任務(wù)需要爬取什么數(shù)據(jù),然后實現(xiàn)Job接口即可。任務(wù)調(diào)度可以根據(jù)任務(wù)自身的情況進行設(shè)置,可以在爬蟲管理系統(tǒng)中配置,也可以直接配置在數(shù)據(jù)庫中。當SpringBoot容器啟動后,系統(tǒng)自動檢測所有實現(xiàn)Job接口的類,并將其初始化為實例,在初始化過程中,系統(tǒng)會讀取每個Job任務(wù)已經(jīng)設(shè)置好的調(diào)度信息,而后根據(jù)配置好的調(diào)度信息進行有序調(diào)度[7]。
4 結(jié)束語
本文通過Crawler4j和Quartz來搭建分布式定時爬蟲系統(tǒng),分布式節(jié)點數(shù)量理論上不受限制,且每個節(jié)點中的代碼、配置和部署都一模一樣。在集群中任務(wù)的數(shù)目可以成百上千,同時每一個任務(wù)可以在Crawler4j中配置多線程,從而大大提高了爬蟲的效率。目前實現(xiàn)的分布式系統(tǒng)穩(wěn)定,超過半年沒有出現(xiàn)過宕機的情況,而且開發(fā)簡單,高效。
當然該分布式系統(tǒng)依然存在一些不足需要改進:
(1)本系統(tǒng)還需要開發(fā)爬蟲管理系統(tǒng),用來監(jiān)控和管理爬蟲任務(wù)。
(2)爬蟲系統(tǒng)需要設(shè)計更加通用的解析頁面方式,以便能夠快速地通過修改配置文件而不是重新修改對應(yīng)的代碼來解決眾多渠道改版所帶來的爬蟲實現(xiàn)問題。
參考文獻:
[1]王敏.分布式網(wǎng)絡(luò)爬蟲的研究與實現(xiàn)[D].東南大學,2017.
[2]https://github.com/yasserg/crawler4j[EB/OL].
[3]http://www.quartz-scheduler.org/[EB/OL].
[4]張康.基于Quartz的分布式定時任務(wù)調(diào)度模塊的設(shè)計與實現(xiàn)[D].南京大學,2019.
[5]段子飛.支持Ajax的Deep Web網(wǎng)絡(luò)爬蟲系統(tǒng)的設(shè)計與實現(xiàn)[D].華南理工大學,2015.
[6]魏麗娟.基于hadoop的網(wǎng)絡(luò)爬蟲技術(shù)研究[D].武漢理工大學,2013.
[7]于成龍,于洪波.網(wǎng)絡(luò)爬蟲技術(shù)研究[J].東莞理工學院學報,2011,18(3):25-29.