1. 程式人生 > >網路爬蟲系統Heritrix的結構分析

網路爬蟲系統Heritrix的結構分析

隨著網路時代的日新月異,人們對搜尋引擎,網頁的內容,大資料處理等問題有了更多的要求。如何從海量的網際網路資訊中選取最符合要求的資訊成為了新的熱點。在這種情況下,網路爬蟲框架heritrix出現解決了這個問題。

       Heritrix是一個開源的、java開發的、可擴充套件的web爬蟲專案。使用者可以使用它來從網上抓取想要的資源。其最出色之處在於它良好的可擴充套件性,方便使用者實現自己的抓取邏輯。

       本文首先介紹網路爬蟲程式的概念和作用,分析了heritrix的工作流程,模組劃分,然後對原始碼進行多層次詳細的分析,最後通過heritrix進行面向特定主題的網頁抓取試驗並進行結果分析。

關鍵詞:網路爬蟲;網頁蒐集;heritrix;原始碼分析

Abstract

       Withthe development of network, user’s requirement for search engines, webpagecontent, large data processing problems increases all the time. How to selectmost valuable information from massive Internet information has become a newhotspot. In this case, a new web crawler frame-heritrix solved this problem.

       Theheritrix web crawler is a java-developed, open-source, extensible project.Users can use it fetch resources from Internet. Its most outstanding featurelies in its good scalability, makes users can fetch information in their ownlogic.

       Thispaper firstly introduces the concept and function of network crawler, analyzesthe work process, module division of heritrix. Then analyzes the source indetail, at last, uses heritrix to fetch the specific web pages and analyzes theresult.

Key words: heritrix; web crawler; sourcecode 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核心包及類功能說明

  1. 包名:org.archive.crawlerHeritrix 程式執行的入口包

1)       CommandLineParser類

可通過CMD命令在命令列對Heritrix進行操作,該類用於解析CMD命令。

2)       Heritrix類

Heritrix主類,通過該類啟動Heritrix。

3)       SimpleHttpServer類

Web伺服器,可以通過Web管理Heritrix。

4)       WebappLifecycle類

封裝Servlet,可以通過Web啟動Heritrix,裡邊裝載Heritrix物件。

  1. 包名: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。

  1. 包名:org.archive.crawler.admin.ui 服務於UI管理介面

1)       CookieUtils類

Cookie工具類,主要用於訪問Cookie。

2)       JobConfigureUtils類

CrawlJob配置管理工具類,通過WebUI配置CrawlJob時會使用該類

  1. 包名: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資料。

  1. 包名:org.archive,crawler.deciderulesHeritrix的規則包,如決定哪些URL可以抓取可以排程。

1)       DecideRule類

URL規則的父類,稽核一個URL是否接受、拒絕或放棄。

2)       DecidingScope類

驗證一個URL是否在範圍內來決定是否接受、拒絕或放棄。

  1. 包名:org.archive.crawler.event 事件管理,如Heritrix的暫停、重啟、停止等

1)       CrawlStatusListner類

爬蟲監聽器,監聽爬蟲是否在執行,是否暫停等。

2)       CrawlURIDispositionListener類

URL監聽器,監聽URL是否失敗,是否要重新抓取等。

  1. 包名:org.archive.crawler.extractorHeritrix的造血器,通過它抽取新的URL再次進行抓取

1)       Extractor類

所有抽取類的父類,用於從一個URL中抽取新的URL。

2)       ExtractorCSS類、ExtractorHTML類、ExtractorPDF類、ExtractorXML類等

從相應的格式總抽取新的URL。

  1. 包名:org.archive.crawler.framework Heritrix的框架包,存放一些核心類,一般是父類,如Heritrix控制類CrawlController;排程器類Frontier。

1)       CrawlController類

核心類。控制器,控制整個爬蟲的啟動,暫停、停止等。

2)       Filter類

過濾器,決定哪些URL可以抓取哪些不抓,父類,具體由子類實現

3)       Frontier類

排程器,對進來的URL進行排程。

4)       Processor類

處理器,一個URL由不同的處理器合作完成。該類作為父類。

5)       ToePool類

執行緒池,用於管理爬蟲執行緒。

6)       WritePoolProcessor類

寫處理器管理池,用於管理多個寫處理器,可以在分散式中使用。

  1. 包名:org.archive.crawler.frontieHeritrix的排程器,決定抓取哪個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,現將挑選核心的標籤進行說明。

  1. <meta></meta>  代表著該抓取JOB的基本元素,包括的屬性有:Job的名稱name,抓取Job的描述description,抓取工作的操作者operator,抓取任務的時間date等元素。
  2.  <controller></controller>裡包括與抓取有關的所有引數,由於內容較多,並且Heritrix也已將他們分成不同模組。自己包括的基本屬性有很多與path有關的字串,用來儲存與抓取工作相關的檔案目錄的各種路徑。例如<string name="logs-path">logs</string>記錄了日誌的存放路徑。
  3. <newObjectname="scope" class="org.archive.crawler ">抓取範圍,構建CrawlScope。通過多個引數來控制抓取過程中種子檔案的處理和URL的放置。
  4. <mapname="http-headers">HTTP協議,當處理爬蟲HTTP協議時需要構造。利用string型別的“user-agent”欄位來確保使用者代理的可用性。該欄位必須包含瀏覽器資訊、有效的URL,如此爬蟲來可以訪問網站。
  5. <newObjectname="frontier" class="org.archive.crawler.frontier.BdbFrontier">Frontier排程器。利用多個引數控制URL抓取的頻率,時間,重試次數,URL的優先順序等。可以通過修改本排程器的內容來實現抓取過程的優化。改進爬蟲程式。
  6. <mapname="fetch-processors"> 獲取元件,通過本元件來獲取整個網頁的HTTP協議、DNS協議、IP地址、埠等資訊,將抓取頁面的內容按照相應的格式一一獲取。
  7. <mapname="write-processors"> 寫元件,用來記錄將抓取的內容寫入本地儲存中的各項選項,如寫入的方式,儲存的位置等。

四、小結

目前搜尋引擎技術越來越受到關注,而網路爬蟲作為其中至關重要的一環自然是需要更多地理解與深入地分析。Heritrix作為開源的擴充套件性優良的網路爬蟲程式,有著很高的研究,使用價值。

本文通過對Heritrix系統的整體架構分析開始,理清整個系統的各個模組劃分及各個模組的作用。整體抓取的流程為:在CrawlController的控制下,一次把URL一個一個抓取出來,利用排程器Frontier實現URL鏈的處理,再利用FetchProcessor獲取網頁中的URL資訊,然後把網頁內容寫入本地磁碟,再按規則抓取下一個URL。分析了流程,對原始碼在本地測試,分析原始碼的核心實現,瞭解了重要的包和類的作用,並且分析了整體配置檔案order.xml的核心內容。對以後利用Heritrix抓取URL工作做好了準備,可以在此基礎上實現自己的抓取規則來設計新的爬蟲程式。