張軍強(qiáng),李煒,沈奇威
(1 北京郵電大學(xué)網(wǎng)絡(luò)與交換技術(shù)國(guó)家重點(diǎn)實(shí)驗(yàn)室,北京 100876; 2 東信北郵信息技術(shù)有限公司,北京 100191)
一種爬蟲監(jiān)控系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)*
張軍強(qiáng)1,2,李煒1,2,沈奇威1,2
(1 北京郵電大學(xué)網(wǎng)絡(luò)與交換技術(shù)國(guó)家重點(diǎn)實(shí)驗(yàn)室,北京 100876; 2 東信北郵信息技術(shù)有限公司,北京 100191)
隨著互聯(lián)網(wǎng)爆炸式的發(fā)展,網(wǎng)絡(luò)爬蟲的重要性越來(lái)越重要。一個(gè)搜索引擎搜索結(jié)果的數(shù)量以及質(zhì)量在一定程度上取決于網(wǎng)絡(luò)爬蟲爬取結(jié)果的質(zhì)量,而如何能更好的組織這些爬蟲也成了一件能影響爬蟲效率的事情。隨著在服務(wù)器上部署爬蟲的增加,對(duì)一個(gè)能夠有效管理爬蟲監(jiān)控系統(tǒng)的需求也就越來(lái)越緊迫。本文對(duì)爬蟲監(jiān)控系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)將會(huì)給爬蟲的管理帶來(lái)很大的方便。
網(wǎng)絡(luò)爬蟲;監(jiān)控系統(tǒng);Heritrix
隨著互聯(lián)網(wǎng)中海量信息的爆炸性增長(zhǎng),通用搜索引擎面臨著更新速度、索引規(guī)模和個(gè)性化需求等方面的挑戰(zhàn)。面對(duì)這些挑戰(zhàn),主題爬蟲應(yīng)用而生。主題爬蟲是指適應(yīng)特定主題和個(gè)性化搜索的網(wǎng)絡(luò)爬蟲,基于主題網(wǎng)絡(luò)爬蟲的搜索引擎已經(jīng)成為當(dāng)前搜索引擎和Web信息挖掘的一個(gè)研究熱點(diǎn)。
通用爬蟲的任務(wù)是盡可能多的搜集信息頁(yè)面,而在這一過(guò)程中并不在意搜集的順序和主題,需要消耗非常多的系統(tǒng)資源和網(wǎng)絡(luò)帶寬。主題網(wǎng)絡(luò)爬蟲則是盡可能快的搜集相關(guān)主題的網(wǎng)頁(yè),然而隨著網(wǎng)站系統(tǒng)規(guī)模的加大,需要的主題量的增多,部署的主題爬蟲也會(huì)漸漸增多,這個(gè)時(shí)候?qū)τ谶@些主題爬蟲的監(jiān)管系統(tǒng)就面臨著很大的壓力。
本文主要針對(duì)現(xiàn)在比較流行的一個(gè)爬蟲Heritrix進(jìn)行再設(shè)計(jì)并實(shí)現(xiàn)監(jiān)控, Heritrix是一個(gè)優(yōu)秀的互聯(lián)網(wǎng)信息采集工具,高可擴(kuò)展性,頁(yè)面抓取能力強(qiáng),用戶可以方便地對(duì)其定制開(kāi)發(fā)。
1.1 Heritrix
Heritrix項(xiàng)目是一個(gè)開(kāi)源的、可擴(kuò)展的Web爬蟲項(xiàng)目,基于Java語(yǔ)言實(shí)現(xiàn)。利用其出色的可擴(kuò)展性,開(kāi)發(fā)者可以擴(kuò)展它的各個(gè)組件,來(lái)實(shí)現(xiàn)自己的抓取邏輯。Heritrix項(xiàng)目始于2003年,目前有Heritrix 1.14.4和Heritrix 3.x兩個(gè)主要版本。
1.1.1 Heritrix主框架
Heritrix 3.x的框架主要分為Engine和Component兩大部分。Engine是爬蟲的主要功能模塊,負(fù)責(zé)實(shí)際的抓取任務(wù)。Component可以認(rèn)為是爬蟲的Web用戶接口,用戶可以通過(guò)Web界面對(duì)爬蟲進(jìn)行管理。Heritrix采用了模塊化的設(shè)計(jì),用戶可以在運(yùn)行時(shí)選擇要用的模塊。
Heritrix由核心類和插件模塊構(gòu)成。核心類可以配置,但不能被覆蓋,插件模塊可以由第三方模塊取代。因此,本文采用實(shí)現(xiàn)了特定抓取邏輯的第三方模塊來(lái)取代默認(rèn)的插件模塊,以滿足抓取需求。
Heritrix的整體結(jié)構(gòu)如圖1所示。其中下載控制器(CrawlController)是下載過(guò)程的總控制者,整個(gè)抓取工作的起點(diǎn),決定整個(gè)抓取任務(wù)的開(kāi)始和結(jié)束。每個(gè)URI 都有一個(gè)獨(dú)立的線程,它從邊界控制器(Frontier)獲取新的 URI,然后傳遞給處理鏈(Processor Chains)經(jīng)過(guò)一系列處理器(Processor)處理。
圖1 Heritrix運(yùn)行流程
處理鏈由多個(gè)處理器組成,在處理器里面依次對(duì)CrawlURI進(jìn)行處理,抓取頁(yè)面,分析頁(yè)面,存儲(chǔ)頁(yè)面,并將解析到的新鏈接加入Frontier隊(duì)列,不斷循環(huán),如圖2所示。
Processor Chain從Frontier里獲取CrawlURI,Processor Chain中的處理器鏈依次對(duì)CrawlURI進(jìn)行處理,抓取頁(yè)面,分析頁(yè)面,存儲(chǔ)頁(yè)面,并將解析到的新鏈接加入Frontier隊(duì)列,不斷循環(huán)。
圖2 URI運(yùn)行鏈
1.1.2 Heritrix處理鏈
Heritrix處理鏈由5個(gè)部分組成:Pre-fetchChain、FetchChain、ExtractorChain、WriteChain和PostprocessChain。Pre-fetchChain是預(yù)處理鏈,主要用于判斷抓取時(shí)的一些先決條件,如 robot協(xié)議、DNS等。FetchChain主要負(fù)責(zé)頁(yè)面的抓取與解析工作,ExtractorChain負(fù)責(zé)URI的過(guò)濾,決定哪些URI可以被加入Frontier。WriteChain是寫處理鏈,它負(fù)責(zé)數(shù)據(jù)的存儲(chǔ)。Post-processChain負(fù)責(zé)頁(yè)面的存儲(chǔ)與URI的后續(xù)處理工作,并將經(jīng)過(guò)ExtractorChain過(guò)濾后的URI加入Frontier。
上述處理鏈均繼承自ProcessorChain類,每個(gè)Chain內(nèi)部又由若干個(gè)處理器(Processor)組成。如FetchChain中的主要Processor有FetchDNS、FetchHTTP和ExtractorHTML等。Heritrix中所有處理器均繼承自Processor類,Heritrix提供了豐富的處理器供用戶選擇,用戶可以根據(jù)實(shí)際需求添加或刪除已有Processor,也可擴(kuò)展自己的Processor加入系統(tǒng)。
除此之外,Heritrix還使用了Spring技術(shù),用戶通過(guò)修改配置文件crawler-beans.xml就可以調(diào)整Processor Chain的處理器設(shè)置,Heritrix在初始化運(yùn)行時(shí)會(huì)讀取配置文件,自動(dòng)裝填各個(gè)處理器鏈。
1.2 RestFul模塊分析
Rest指的是一組架構(gòu)約束條件和原則,滿足這些約束條件和原則的應(yīng)用程序或設(shè)計(jì)就是RestFul。Web 應(yīng)用程序最重要的Rest原則是客戶端和服務(wù)器之間的交互在請(qǐng)求之間是無(wú)狀態(tài)的。從客戶端到服務(wù)器的每個(gè)請(qǐng)求都必須包含理解請(qǐng)求所必需的信息。如果服務(wù)器在請(qǐng)求之間的任何時(shí)間點(diǎn)重啟,客戶端不會(huì)得到通知。此外,無(wú)狀態(tài)請(qǐng)求可以由任何可用服務(wù)器回答,適合云計(jì)算環(huán)境??蛻舳丝梢跃彺鏀?shù)據(jù)以改進(jìn)性能。
在服務(wù)器端,應(yīng)用程序狀態(tài)和功能可以分為各種資源。資源是一個(gè)有趣的概念實(shí)體,它向客戶端公開(kāi)。資源的例子有應(yīng)用程序?qū)ο?、?shù)據(jù)庫(kù)記錄、算法等。每個(gè)資源都使用URI得到一個(gè)唯一的地址。所有資源都共享統(tǒng)一的界面,以便在客戶端和服務(wù)器之間傳輸狀態(tài)。使用的是標(biāo)準(zhǔn)的HTTP方法,比如Get、Put、Post和Delete。Hypermedia是應(yīng)用程序狀態(tài)的引擎,資源表示通過(guò)超鏈接互聯(lián)。
Heritrix使用的是RestLet(一個(gè)輕量級(jí)的RestFul框架)。在Heritrix主函數(shù)里面構(gòu)建了一個(gè)Component組件,而這個(gè)組件可以操作RestLet系統(tǒng)的啟動(dòng),在主函數(shù)里面利用RestLet設(shè)置了權(quán)限驗(yàn)證,用于對(duì)敏感資源的保護(hù),并綁定了IP和端口,用于Web客戶的訪問(wèn),Component里面綁定的EngineApplication是負(fù)責(zé)用戶請(qǐng)求路由的關(guān)鍵。在這個(gè)類里面實(shí)現(xiàn)了不同的請(qǐng)求交給不同的資源類來(lái)處理從而返回結(jié)果。
在資源類里面是根據(jù)請(qǐng)求的類型(Get、Post)來(lái)決定數(shù)據(jù)表單的處理流向,最后完成對(duì)請(qǐng)求的處理。
目前Heritrix爬蟲手動(dòng)配置時(shí),每個(gè)爬蟲只能運(yùn)行一個(gè)任務(wù),一定程度上造成了資源浪費(fèi),需要對(duì)其進(jìn)行一些適應(yīng)性改造。針對(duì)Heritrix功能方面的不足,本文在Heritrix3.1.1基礎(chǔ)上,設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)全新的任務(wù)管理模塊。Heritrix將一個(gè)爬取任務(wù)定義為一個(gè)Crawl Job。每個(gè)CrawlJob有自己的種子列表、線程、隊(duì)列和過(guò)濾規(guī)則等,它們獨(dú)立運(yùn)行,不會(huì)互相干擾。所有的CrawlJob建立在一個(gè)共同的Heritrix Engine上,由Heritrix Engine管控所有任務(wù)的運(yùn)行。
Heritrix中多個(gè)CrawlJob可以同時(shí)運(yùn)行,為配合這一機(jī)制,增量模塊設(shè)計(jì)了一套數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)每個(gè)任務(wù)的增量參數(shù)與信息。多任務(wù)管理模塊依照Heritrix 3.x的任務(wù)框架,建立了MyEngine->MyCrawlJob模式。MyEngine里存著Heritrix Engine的引用,并有一HashMap<String, MyCrawlJob>型的成員變量Jobs,保存每個(gè)CrawlJob對(duì)應(yīng)的MyCrawlJob。MyCrawlJob保存每個(gè)CrawlJob的增量參數(shù)與信息,并提供增量任務(wù)運(yùn)行過(guò)程中要用到的各種方法。
MyCrawlJob有3個(gè)重要的成員變量:CrawlJob Job,是對(duì)應(yīng)的真實(shí)爬蟲任務(wù)CrawlJob的引用,通過(guò)Job可以直接控制爬蟲任務(wù)。String JobName是任務(wù)名,F(xiàn)ile JobDir是任務(wù)的文件目錄。這3個(gè)成員變量在增量任務(wù)運(yùn)行的各個(gè)階段都會(huì)用到。任務(wù)配置模塊MyProperties負(fù)責(zé)讀取JobDir中的配置文件crawljob.properties,設(shè)置爬蟲任務(wù)的隊(duì)列數(shù)等。
爬蟲監(jiān)控系統(tǒng)實(shí)現(xiàn)了動(dòng)態(tài)增加新爬蟲源和監(jiān)控系統(tǒng)網(wǎng)站兩方面功能。動(dòng)態(tài)增加爬蟲源是在Heritrix主爬蟲的Launch流程下完成的,本文在此流程中添加了反射機(jī)制,具體流程如圖3所示。
圖3 Launch流程圖
首先,在網(wǎng)頁(yè)上點(diǎn)擊Launch(即啟動(dòng)這個(gè)任務(wù)),之后啟動(dòng)一個(gè)名字叫Launcher的線程,在這個(gè)線程的run方法里面得到了CrawlController的實(shí)例,并且利用這個(gè)實(shí)例的request CrawlStart方法啟動(dòng)了爬取任務(wù)。
其次,在requestCrawlStart方法里面設(shè)置了一個(gè)爬取線程的線程池。設(shè)置線程池的setupToePool函數(shù)中,新建ToePool(線程池)實(shí)例,用這個(gè)實(shí)例的setSize方法新建了線程,并且啟動(dòng),從而開(kāi)始了爬取的任務(wù)。動(dòng)態(tài)增加爬蟲源是在爬蟲的運(yùn)行當(dāng)中,上傳定制任務(wù)的配置文件和Jar分組,然后新的爬取任務(wù)利用這些上傳來(lái)的文件進(jìn)行爬取的過(guò)程,流程圖如圖4所示。
在監(jiān)控系統(tǒng)的操作界面上傳新建任務(wù)的文件之后點(diǎn)擊Rescan按鈕,這個(gè)按鈕的主要功能就是使Heritrix主爬蟲根據(jù)上傳上來(lái)的文件新建爬取任務(wù)(CrawlJob)。具體的流程是點(diǎn)擊這個(gè)按鈕之后會(huì)觸發(fā)Heritrix里面的findJobConfigs函數(shù),進(jìn)而調(diào)用這個(gè)函數(shù)的addJobDirectory子方法,在這個(gè)方法里面會(huì)根據(jù)目錄下面的文件實(shí)例化出一個(gè)CrawlJob,后面任務(wù)的啟動(dòng)停止等操作都是利用這個(gè)CrawlJob實(shí)例來(lái)完成的。
至此,動(dòng)態(tài)的新增加任務(wù)的主框架基本完成。
新建任務(wù)時(shí),在上傳配置文件之外還上傳了該任務(wù)的Jar分組,以形成一個(gè)定制的處理器鏈。爬取任務(wù)的URI處理器鏈形式相同(如圖2所示),但是針對(duì)不同的任務(wù)會(huì)有對(duì)應(yīng)的Extractor處理器實(shí)現(xiàn)。因此,每個(gè)新任務(wù)都需要針對(duì)Extractor處理器進(jìn)行改造,之后處理成Jar分組的形式上傳。在爬蟲主程序運(yùn)行的時(shí)候會(huì)通過(guò)反射機(jī)制從Jar分組里面實(shí)例化出Extractor處理器,進(jìn)而構(gòu)造出一個(gè)處理器鏈運(yùn)行新的任務(wù)。
以下是關(guān)于監(jiān)控系統(tǒng)網(wǎng)站的設(shè)計(jì),監(jiān)控系統(tǒng)是針對(duì)分布在多個(gè)服務(wù)器上的Heritrix爬蟲設(shè)計(jì)的,是用來(lái)減小多個(gè)爬蟲的監(jiān)管復(fù)雜度,監(jiān)控框架如圖5所示。
圖4 實(shí)例化CrawlJob流程圖
圖5 監(jiān)控系統(tǒng)主框架
通過(guò)圖5可以看出,監(jiān)控系統(tǒng)是獨(dú)立于各個(gè)爬蟲,通過(guò)HTTP來(lái)操作各個(gè)爬蟲的,首先通過(guò)各個(gè)主爬蟲的JSON接口獲得多個(gè)爬取任務(wù)的動(dòng)態(tài)信息,例如爬取的速度,爬取鏈接的統(tǒng)計(jì)等信息,然后利用前端框架展示出來(lái),其次可以利用監(jiān)控系統(tǒng)向主爬蟲發(fā)起HTTP請(qǐng)求,由于Heritrix實(shí)現(xiàn)了RestFul接口,爬蟲是可以處理這些HTTP請(qǐng)求從而完成爬蟲的啟停等操作,這就是大體上監(jiān)控系統(tǒng)的框架。
以下是針對(duì)上述主體框架而對(duì)爬蟲進(jìn)行的改造。首先通過(guò)對(duì)爬蟲的RestLet模塊改造,制定JSON接口,以獲得各個(gè)爬蟲的信息。在Heritrix主程序里面啟動(dòng)了一個(gè)RestLet Component,該組件綁定了一個(gè)EngineApplication資源,其中實(shí)現(xiàn)了路由規(guī)則,并制定了請(qǐng)求URL的處理類,即Web請(qǐng)求的處理鏈,其createRoot函數(shù)中可以新建自己的規(guī)則。本文只要通過(guò)HTTP請(qǐng)求獲得JSON信息,所以需要?jiǎng)?chuàng)建一個(gè)路由規(guī)則用于處理這個(gè)HTTP請(qǐng)求。
本文制定了一個(gè)資源類來(lái)獲得爬蟲的動(dòng)態(tài)信息,在Heritrix里面有一個(gè)StatisticsTracker類是用來(lái)定義和存儲(chǔ)每個(gè)CrawlJob的實(shí)時(shí)動(dòng)態(tài)信息的類,我們只需要在資源類里面持有CrawlJob類的引用,而這個(gè)引用里面又會(huì)持有StatisticsTracker的引用,便可以獲得爬蟲任務(wù)的實(shí)時(shí)信息。
資源類里面分別定義了用來(lái)處理Get請(qǐng)求、Post請(qǐng)求和Delete請(qǐng)求等其它請(qǐng)求的處理方法,里外還有用來(lái)控制是否能訪問(wèn)這些方法的allow方法。用來(lái)獲得爬蟲實(shí)時(shí)的JSON信息的是Get方法的任務(wù),然而用來(lái)處理爬蟲控制,例如啟停操作請(qǐng)求的就是Post方法的任務(wù),在Post方法里可以獲得外部的網(wǎng)頁(yè)請(qǐng)求,在這個(gè)資源類里面的Represent方法是用來(lái)響應(yīng)Get請(qǐng)求,只需要實(shí)現(xiàn)這個(gè)方法,在里面用JSON的格式打印出爬取任務(wù)的實(shí)時(shí)信息就可以了。至此,JSON接口方面設(shè)計(jì)完成。
本文基于PHP的Yii框架,搭建了一個(gè)Web應(yīng)用層框架以展示爬蟲的動(dòng)態(tài)信息以及動(dòng)態(tài)的添加新任務(wù)。由于監(jiān)控系統(tǒng)應(yīng)獲得爬蟲部署的具體服務(wù)器,設(shè)計(jì)一個(gè)數(shù)據(jù)表來(lái)存儲(chǔ)主爬蟲所在服務(wù)器的IP地址以及占用的端口號(hào)。添加主爬蟲界面可實(shí)現(xiàn)人工的向這個(gè)數(shù)據(jù)表添加一條主爬蟲的記錄。監(jiān)控系統(tǒng)可以通過(guò)這個(gè)數(shù)據(jù)表的信息來(lái)管理多個(gè)爬蟲。監(jiān)控系統(tǒng)通過(guò)使用PHP的curl模塊向爬蟲服務(wù)器發(fā)出HTTP請(qǐng)求,分別得到爬蟲JSON格式的消息,從而用來(lái)展示多個(gè)爬蟲,也可以通過(guò)這個(gè)模塊對(duì)各個(gè)爬取任務(wù)進(jìn)行啟停操作。
除此之外,另一個(gè)重要的模塊就是向各個(gè)主爬蟲添加子任務(wù)的操作,由于之前的動(dòng)態(tài)增加新爬蟲源的實(shí)現(xiàn),現(xiàn)在只需要實(shí)現(xiàn)通過(guò)監(jiān)控系統(tǒng)的網(wǎng)站向爬蟲服務(wù)器上傳文件的頁(yè)面。
因?yàn)樘砑幼尤蝿?wù)是針對(duì)一個(gè)Heritrix而言的,所以上傳任務(wù)文件也應(yīng)當(dāng)是針對(duì)一個(gè)Heritrix主程序,即針對(duì)Heritrix的Jobs文件夾上傳文件,這個(gè)模塊是利用PHP的上傳文件模塊和SSH2擴(kuò)展模塊來(lái)實(shí)現(xiàn)的,由于SSH2實(shí)現(xiàn)了遠(yuǎn)程文件傳輸功能,所以非常適合用來(lái)實(shí)現(xiàn)服務(wù)器之間的文件傳輸。
最后,還可以在Heritrix爬蟲里面進(jìn)行一些更細(xì)化的定制化工作,例如每天任務(wù)的定時(shí)爬取和每個(gè)任務(wù)每天爬取量的統(tǒng)計(jì),并把這些信息存庫(kù),利用一些前端的圖形化插件(如HighCharts)進(jìn)行數(shù)據(jù)的可視化,從而更直觀的查看各個(gè)爬蟲的運(yùn)行狀況。
簡(jiǎn)而言之,對(duì)于監(jiān)控系統(tǒng)的搭建,主要難點(diǎn)是在對(duì)于爬蟲后端的了解及其定制化開(kāi)發(fā),后端的信息獲取接口及處理模塊完成之后,Web端只需要完成對(duì)后端的調(diào)用即可。
本文基于Heritrix 3.1.1設(shè)計(jì)實(shí)現(xiàn)了監(jiān)控系統(tǒng),對(duì)于具有多個(gè)爬蟲的系統(tǒng)有很好的監(jiān)控管理效果,尤其更適用于垂直搜索領(lǐng)域。目前,本文所設(shè)計(jì)的定制化網(wǎng)絡(luò)爬蟲監(jiān)測(cè)的網(wǎng)站達(dá)幾十個(gè),包括新浪微博和水木論壇等,穩(wěn)定運(yùn)行時(shí)間接近1年,采集了大量網(wǎng)頁(yè),對(duì)爬蟲監(jiān)管統(tǒng)計(jì)提供了一個(gè)有效的方式,同時(shí)為用戶提供了大量有價(jià)值的數(shù)據(jù),在實(shí)際應(yīng)用中取得良好效果。
Design and implement of crawler monitoring system
ZHANG Jun-qiang1,2, LI Wei1,2, SHEN Qi-wei1,2
(1 Beijing University of Posts and Telecommunications Networking and Switching Technology, State Key Laboratory, Beijing 100876, China; 2 EBUPT Information Technology Co., Ltd., Beijing 100191, China)
With the explosive growth of Internet, the importance of web crawler is becoming increasingly important. The quantity and quality of search results of a search engine is depends to some extent on the quality of web crawler's crawling results, and how to organize these crawlers better have become a things can affect the eff ciency of crawler. With the increase of crawlers deployed on the server, the need for an effective management of monitoring system is more and more urgent. In this paper, the design and implementation of reptile monitoring system will bring great convenience to the crawler's management.
Web crawler; monitoring system; Heritrix
TN915
A
1008-5599(2014)12-0074-05
2014-11-01
國(guó)家973計(jì)劃項(xiàng)目(編號(hào):2013CB329102);國(guó)家自然科學(xué)基金資助項(xiàng)目(No. 61372120, 61271019, 61101119, 61121001);長(zhǎng)江學(xué)者和創(chuàng)新團(tuán)隊(duì)發(fā)展計(jì)劃資助(編號(hào):IRT1049);教育部科學(xué)技術(shù)研究重點(diǎn)(重大)項(xiàng)目資助(編號(hào):MCM20130310);北京高等學(xué)校青年英才計(jì)劃項(xiàng)目(編號(hào):YETP0473)。