摘要
隨着網絡時代的日新月異,人們對搜索引擎,網頁的內容,大數據處理等問題有了更多的要求。如何從海量的互聯網信息中選取最符合要求的信息成為了新的熱點。在這種情況下,網絡爬蟲框架heritrix出現解決了這個問題。
Heritrix是一個開源的、java開發的、可擴展的web爬蟲項目。用戶可以使用它來從網上抓取想要的資源。其最出色之處在於它良好的可擴展性,方便用戶實現自己的抓取邏輯。
本文首先介紹網絡爬蟲程序的概念和作用,分析了heritrix的工作流程,模塊划分,然后對源碼進行多層次詳細的分析,最后通過heritrix進行面向特定主題的網頁抓取試驗並進行結果分析。
關鍵詞:網絡爬蟲;網頁搜集;heritrix;源碼分析
Abstract
With the development of network, user’s requirement for search engines, webpage content, large data processing problems increases all the time. How to select most valuable information from massive Internet information has become a new hotspot. In this case, a new web crawler frame-heritrix solved this problem.
The heritrix web crawler is a java-developed, open-source, extensible project. Users can use it fetch resources from Internet. Its most outstanding feature lies in its good scalability, makes users can fetch information in their own logic.
This paper firstly introduces the concept and function of network crawler, analyzes the work process, module division of heritrix. Then analyzes the source in detail, at last, uses heritrix to fetch the specific web pages and analyzes the result.
Key words: heritrix; web crawler; source code analysis; web page search.
一、引言
隨着互聯網中網頁數量的急劇增長,面對如此龐大的網絡資源,快速准確找到自己需要的信息變得越來越重要,而通用的搜索引擎已經不能滿足不同用戶對不同信息的需求。例如如今電子商務領域,如何快速、准確搜索用戶所需求的信息,成為一個關鍵因素。搜索引擎是從各種網絡資源中根據關鍵字搜索出特定的資源的一種工具,而網絡爬蟲技術是搜索引擎中的關鍵技術。目前的搜索引擎室面向互聯網中所有信息的,但是人們往往需要更精確更具體的搜索引擎,在這種情況下,Heritrix項目應運而生。Heritrix是一個純由Java開發的、開源的Web網絡爬蟲,用戶可以使用它從網絡上抓取想要的資源。Heritrix最出色的的特性是開發者可以在現有的框架基礎上對各個組件進行擴展,實現自己所需要的抓取邏輯。
本文將從介紹Heritrix系統的框架和工作流程入手,繼而深入分析核心的源碼,然后在本地對該系統進行測試,實現自己定義的搜索邏輯,最后對整個結果進行測試分析。
二、網絡爬蟲Heritrix系統介紹
2.1Heritrix系統簡介
網絡爬蟲是一種按照一定的規則,自動抓取互聯網信息的程序或腳本。從一個或若干初始網頁的URL開始,利用HTTP等標准協議讀取文檔,將文檔中所包括的URL放入URL隊列中,然后從隊列中新的URL處開始進行漫游,把爬過的網頁搜集起來,直到沒有滿足條件的新的URL為止。
網絡爬蟲工具Heritrix是由面向對象的程序設計語言java開發的,開源的網絡爬蟲工具包,它的程序執行速度之快是傳統搜索引擎無法企及的。作為一個專為互聯網網頁進行存檔而開發的網頁檢索器,開發者可利用其出色可擴展性來實現自己的抓取邏輯。
2.2Heritrix系統結構
Heritrix是一個爬蟲框架,其組織結構如圖2.1所示,包含了整個組件和抓取流程:
圖2.1 Heritrix系統架構
Heritrix采用的是模塊化的設計,各個模塊由一個控制器類(CrawlController類)來協調,控制器是整體的核心。控制器結構圖如圖2.2所示:
圖2.2 CrawlController類結構圖
CrawlController類是整個爬蟲的總控制者,控制整個抓取工作的起點,決定整個抓取任務的開始和結束。CrawlController從Frontier獲取URL,傳遞給線程池(ToePool)中的ToeThread處理。
Frontier(邊界控制器)主要確定下一個將被處理的URL,負責訪問的均衡處理,避免對某一Web服務器造成太大的壓力。Frontier保存着爬蟲的狀態,包括已經找到的URI、正在處理中的URI和已經處理過的URI。
Heritrix是按多線程方式抓取的爬蟲,主線程把任務分配給Teo線程(處理線程),每個Teo線程每次處理一個URL。Teo線程對每個URL執行一遍URL處理器鏈。URL處理器鏈包括如下5個處理步驟。整個流程都在圖2.1中。
(1)預取鏈:主要是做一些准備工作,例如,對處理進行延遲和重新處理,否決隨后的操作。
(2)提取鏈:主要是下載網頁,進行DNS轉換,填寫請求和響應表單。
(3)抽取鏈:當提取完成時,抽取感興趣的HTML和JavaScript,通常那里有新的要抓取的URL。
(4)寫鏈:存儲抓取結果,可以在這一步直接做全文索引。Heritrix提供了用ARC格式保存下載結果的ARCWriterProcessor實現。
(5)提交鏈:做和此URL相關操作的最后處理。檢查哪些新提取出的URL在抓取范圍內,然后把這些URL提交給Frontier。另外還會更新DNS緩存信息。
服務器緩存(Server cache)存放服務器的持久信息,能夠被爬行部件隨時查到,包括被抓取的Web服務器信息,例如DNS查詢結果,也就是IP地址。
三、Heritrix核心源碼分析
3.1核心包及類功能說明
- 包名:org.archive.crawler Heritrix 程序運行的入口包
1) CommandLineParser類
可通過CMD命令在命令行對Heritrix進行操作,該類用於解析CMD命令。
2) Heritrix類
Heritrix主類,通過該類啟動Heritrix。
3) SimpleHttpServer類
Web服務器,可以通過Web管理Heritrix。
4) WebappLifecycle類
封裝Servlet,可以通過Web啟動Heritrix,里邊裝載Heritrix對象。
- 包名:org.archive.crawler.admin Heritrix的管理包,比如CrawlJob表示一個抓取任務job,CrawlJobHandler管理JOB,以及日志統計等
1) CrawlJob類
Heritrix的核心類,代表着一個抓取任務,order.xml大部分屬性圍繞其配置
2) CrawlJobErrorHandler類
維護一個抓取任務(CrawlJob)的錯誤日志,在UI中顯示JOB錯誤
3) CrawlJobHandler類
抓取任務管理器,Heritrix可以有多個抓取任務,都由它進行管理
4) SeedRecord類
記錄種子的處理記錄,如種子重定向到哪個URL,在seed.txt里有說明。
5) StaticsticsTracker類
Heritrix核心類,統計追蹤器,貫穿整個Heritrix的運行,如統計抓取了多少URL。
- 包名:org.archive.crawler.admin.ui 服務於UI管理界面
1) CookieUtils類
Cookie工具類,主要用於訪問Cookie。
2) JobConfigureUtils類
CrawlJob配置管理工具類,通過WebUI配置CrawlJob時會使用該類
- 包名:org.archive.crawler,datamodel Heritrix的數據模型包,如在Heritrix中代表一個URL的CandidateURI
1) CandidateURI類
核心類,代表一個URL,貫穿整個抓取工程,還沒有通過調度器(Frontier)
2) CheckPoint類
Heritrix會定期備份數據,如日志、正在獲取的URL等,當異常中斷時課利用它來恢復。
3) CrawlHost類
核心類,代表一個Host,里邊主要包含域名、IP。
4) CrawlOrder類
核心類,基本上對應着配置文件order.xml的各個屬性值。
5) CrawlServer類
核心類,對應一個Host,里邊裝載着一個Host的各種Heritrix數據。
- 包名:org.archive,crawler.deciderules Heritrix的規則包,如決定哪些URL可以抓取可以調度。
1) DecideRule類
URL規則的父類,審核一個URL是否接受、拒絕或放棄。
2) DecidingScope類
驗證一個URL是否在范圍內來決定是否接受、拒絕或放棄。
- 包名:org.archive.crawler.event 事件管理,如Heritrix的暫停、重啟、停止等
1) CrawlStatusListner類
爬蟲監聽器,監聽爬蟲是否在運行,是否暫停等。
2) CrawlURIDispositionListener類
URL監聽器,監聽URL是否失敗,是否要重新抓取等。
- 包名:org.archive.crawler.extractor Heritrix的造血器,通過它抽取新的URL再次進行抓取
1) Extractor類
所有抽取類的父類,用於從一個URL中抽取新的URL。
2) ExtractorCSS類、ExtractorHTML類、ExtractorPDF類、ExtractorXML類等
從相應的格式總抽取新的URL。
- 包名:org.archive.crawler.framework Heritrix的框架包,存放一些核心類,一般是父類,如Heritrix控制類CrawlController;調度器類Frontier。
1) CrawlController類
核心類。控制器,控制整個爬蟲的啟動,暫停、停止等。
2) Filter類
過濾器,決定哪些URL可以抓取哪些不抓,父類,具體由子類實現
3) Frontier類
調度器,對進來的URL進行調度。
4) Processor類
處理器,一個URL由不同的處理器合作完成。該類作為父類。
5) ToePool類
線程池,用於管理爬蟲線程。
6) WritePoolProcessor類
寫處理器管理池,用於管理多個寫處理器,可以在分布式中使用。
- 包名:org.archive.crawler.frontie Heritrix的調度器,決定抓取哪個URL
1) AbstractFrontier類
調度器基本實現類,非常復雜的實現。
2) BdbWorkQueue類
抓取隊列由BDB存儲管理,相同classkey的URL為一個隊列.classkey由用戶配置決定,Heritrix默認是相同host的URL就為一個隊列。
3) RecoveryJournal類
管理着/logs/recover,該文件記錄所有的URL抓取情況,如抓取成功、失敗都有不同的對應格式。該文件主要用於下次Heritrix恢復,如Heritrix異常中斷重新啟動Heritrix的話又會重新抓取,而如果基於該文件啟動的話則會避免這個問題,同時對於上次異常中斷而來不及抓取的URL都會優先抓取。
4) WorkQueueFrontier類
隊列調度器,管理所有的隊列,里面用不同類型管理不同隊列。
3.2配置文件分析
Heritrix系統的一個核心是order.xml配置文件,它里邊的每一個配置都關系到整個系統的運行情況,例如可以控制抓取的速度,可以優化電腦行呢,可以在某一次的抓取上繼續抓取。整個文件格式為標簽語言xml,現將挑選核心的標簽進行說明。
- <meta></meta> 代表着該抓取JOB的基本元素,包括的屬性有:Job的名稱name,抓取Job的描述description,抓取工作的操作者operator,抓取任務的時間date等元素。
- <controller></controller> 里包括與抓取有關的所有參數,由於內容較多,並且Heritrix也已將他們分成不同模塊。自己包括的基本屬性有很多與path有關的字符串,用來保存與抓取工作相關的文件目錄的各種路徑。例如<string name="logs-path">logs</string>記錄了日志的存放路徑。
- <newObject name="scope" class="org.archive.crawler ">抓取范圍,構建CrawlScope。通過多個參數來控制抓取過程中種子文件的處理和URL的放置。
- <map name="http-headers">HTTP協議,當處理爬蟲HTTP協議時需要構造。利用string類型的“user-agent”字段來確保用戶代理的可用性。該字段必須包含瀏覽器信息、有效的URL,如此爬蟲來可以訪問網站。
- <newObject name="frontier" class="org.archive.crawler.frontier.BdbFrontier">Frontier調度器。利用多個參數控制URL抓取的頻率,時間,重試次數,URL的優先級等。可以通過修改本調度器的內容來實現抓取過程的優化。改進爬蟲程序。
- <map name="fetch-processors"> 獲取組件,通過本組件來獲取整個網頁的HTTP協議、DNS協議、IP地址、端口等信息,將抓取頁面的內容按照相應的格式一一獲取。
- <map name="write-processors"> 寫組件,用來記錄將抓取的內容寫入本地存儲中的各項選項,如寫入的方式,存儲的位置等。
四、小結
目前搜索引擎技術越來越受到關注,而網絡爬蟲作為其中至關重要的一環自然是需要更多地理解與深入地分析。Heritrix作為開源的擴展性優良的網絡爬蟲程序,有着很高的研究,使用價值。
本文通過對Heritrix系統的整體架構分析開始,理清整個系統的各個模塊划分及各個模塊的作用。整體抓取的流程為:在CrawlController的控制下,一次把URL一個一個抓取出來,利用調度器Frontier實現URL鏈的處理,再利用FetchProcessor獲取網頁中的URL信息,然后把網頁內容寫入本地磁盤,再按規則抓取下一個URL。分析了流程,對源碼在本地測試,分析源碼的核心實現,了解了重要的包和類的作用,並且分析了整體配置文件order.xml的核心內容。對以后利用Heritrix抓取URL工作做好了准備,可以在此基礎上實現自己的抓取規則來設計新的爬蟲程序。
參考文獻
[1] Kristinn Sigurðsson. Incremental crawling with Heritrix. National and University Library of Iceland[M].2008
[2] 白萬民,蘇希樂.Heritrix在垂直搜索引擎中的應用[J].計算機時代,2011(9)
[3] 朱 敏,羅省賢.基於 Heritrix 的面向特定主題的聚焦爬蟲研究[J]. 計算機技術與發展,2012 (2)
[4] 劉顯一. 基於Lucene和Heritrix的主題搜索引擎的設計與實現[M].北京郵電大學.2012.8
[5] 張敏. 基於Heritrix 限定爬蟲的設計與實現[J].計算機應用與軟件.2013.4(4)
[6] 楊 頌,歐陽柳波.基於 Heritrix 的面向電子商務網站增量爬蟲研究[J]. 軟件導刊,2010,9( 7) : 38-39.
[7] 楊定中,趙 剛,王 泰.網絡爬蟲在 Web 信息搜索與數據挖掘中的應用[J].計算機工程與設計,2009,30( 24)
[8] 邱 哲,符滔滔. Lucene 2.0+Heritrix 開發自己的搜索引擎[M].北京: 人民郵電出版社,2007