(轉)Heritrix學習


本文轉載自:http://www.cnblogs.com/phishine/articles/1599258.html

1.   Heritrix 簡介

Heritrix是一個專門為互聯網上的網頁進行存檔而開發的網頁檢索器。它使用Java編寫並且完全開源。它主要的用戶界面可以通過一個web流量器來訪問並通過它來控制檢索器的行為,另外,它還有一個命令行工具來供用戶選擇調用。

Heritrix是由互聯網檔案館和北歐國家圖書館聯合規范化編寫於2003年初。第一次正式發布是在2004年1月,並不斷的被互聯網檔案館和其他感興趣的第三方改進着。到現在已經成為一個成熟的開源爬蟲,並被廣泛使用。

Heritrix的操作模型:

從模型中可以看到,利用Heritrix我們可以輕松從互聯網上獲取信息並將它們全部存儲下來,然后可以任意的訪問獲取到的網頁信息並可以查看報告。

 

Heritrix的整體結構簡圖如下:

它的工作流程是一個循環,具體流程是:

  1 在預定的URI中選擇一個。

  2 從選擇的URI的網址下載遠程文件

  3 分析,歸檔下載到的內容

  4 從分析到的內容里面選擇感興趣的URI。加入預定隊列。

  5 標記已經處理過的URI

 

在大概的了解了Heritrix及它的工作機制之后,我們就可以開始Heritrix的使用了。

 

2.   Heritrix 的配置與使用

 1)    安裝與配置

從官方網站http://crawler.archive.org/下載最新版本的Heritrix運行包,解壓到一個文件夾內。其中,Heritrix所用到的工具類庫都存於lib下,另外,在Heritrix目錄下有一個conf目錄,其中包含了一個很重要的文件:heritrix.properties

 heritrix.properties中配置了大量與Heritrix運行息息相關的參數,這些參數主要是配置了Heritrix運行時的一些默認工具類、WebUI的啟動參數,以及Heritrix的日志格式等。當第一次運行Heritrix時,只需要修改該文件,為其加入WebUI的登錄名和密碼。在"heritrix.cmdline.admin="后面增加賬戶和密碼,比如heritrix.cmdline.admin=admin:admin 。其中,用戶名和密碼是以一個冒號進行分隔,使用者可以指定任何的字符串做為用戶名密碼。

新建一個文件Heritrix.cmd 作為啟動Heritrix的命令文件,在文件內寫入:

(假設文件夾路徑為D:\heritrix

 

運行上述腳本,在瀏覽器輸入http://localhost:8080/,輸入之前設置的用戶名密碼,即可進入Heritrix管理頁面。

 

2)    新建抓取任務

(1)       單擊菜單欄上的“Jobs”標簽,就可以進入任務創建頁面。如下圖所示:

 

(2)       在任務創建頁面中,有4種創建任務的方式,具體含義如下:

Based on existing job:以一個已經有的抓取任務為模板,創建所有抓取屬性和抓取起始URL的列表

Based on a recovery:在以前的某個任務中,可能設置過一些狀態點,新的任務將從這個設置的狀態點開始。

Based on a profile:專門為不同的任務設置了一些模板,新建的任務將按照模板來生成。

With defaults:這個最簡單,表示按默認的配置來生成一個任務。

 

(3)       單擊With defaults鏈接,創建一個新的抓取任務。

(4)       在新建任務的名稱上,填入任務名稱。在Description中隨意填入字符,然后再在seeds框中,填入待抓取的起始網址。如下圖所示:

 

(5)       單擊“Modules”按鈕,就進入了配置抓取時的處理鏈的頁面。

在倒數第三項 "Select Writers "內刪除默認的"org.archive.crawler.writer.ARCWriterProcess”,加 "org.archive.crawler.writer.MirrorWriterProcessor",這樣執行任務的時候抓取到的頁面會以鏡像的方式放在本地的目錄結構中,而不是生成ARC存檔文件。如下圖:

 

(6)       單擊“Settings” 按鈕,進入了屬性設置的頁面。

在屬性設置頁面上有非常多的輸入域,Heritrix在抓取網頁時,這些域是用來對的各個組件的值進行預設。由於頁面上的內容非常多,使用者可能無法全部了解它們的作用。所以Heritrix提供了一個輔助功能,來在最大程度上讓使用者了解每個參數的含義。在每個屬性的右側都有一個小問號,當單擊問號時,就會彈出一個JavascriptAlert提示框,上面介紹了當前屬性的作用。

當在第一次使用Heritrix時,所需要設置的參數並不多,以默認設置為主。但有一些參數是必須在第一次使用時就設置好的,就是HTTP-Header這個屬性域。

如下圖所示,紅色框內是修改前后對照。其中“user-agent”中的“PROJECT_URL_HERE”對應自己的完整URL地址,“from”中設置自己的合法email地址,這兩項設置其實可隨便設置,只要格式規則合法即可。圖中的@VERSION@設置為1.12.1,即1.12.1版本的。

 

(7)       設置完成后,點擊“Submit job”,即完成全部任務的建立工作。 這時就可以在Console頁面中點擊start啟動任務。

 

抓取到的所有文件在” %Heritrix_HOME%/jobs/任務名-任務時間/mirror”這個路徑下,按照域名分開存放。

 

 

3.   Heritrix 的擴展開發 

1)    
Heritrix 結構分析

        

從上圖可以看出,Heritrix總體上是一個平台結構,內部的組件都具有松耦合的特點。任何一個部分都可以進行拆卸並替換,這就給我們進行基於Heritrix的自定義開發提供了條件。

 

下面簡單介紹一下每個組件的作用

1.      CrawlController

CrawlController(中央控制器)是抓取任務的核心組件,它控制着整個抓取的流程。

 

2.      CrawlOrder

CrawlOrder (抓取任務)是整個抓取工作的起點,它記錄了任務的所有屬性,即在創建任務時的一系列設置。


3.      Frontier

Frontier (鏈接制造工廠)負責所有鏈接的處理。將已經爬過的URI做標記,並將未處理的鏈接放入待處理隊列。

 

4.      ToeThread

ToeThread(處理線程)Heritrix是多線程的,每個 URL 被一個線程處理,這個線程就叫做 ToeThread,每個線程都會包括一條處理鏈,如下圖所示。

 

5.       Processor

Processor(處理器)代表着單個的處理器,所有的處理器都是它的子類。它包括以下幾種:PreProcessor(預處理器)、Fetcher(獲取器)、Extractor(抽取器)、Writer(存儲器)、PostProcessor(后處理器)。

                                                           

 

 

 

 

 

 

2)    Heritrix 的組件開發

在使用Heritrix的過程中,可能會需要一些特定功能,比如說只想抓取一個域名下的網頁等。這時就需要擴展原有的Heritrix,自己寫一些組件來滿足這些要求。

 

(1)   擴展FrontierScheduler

首先在Heritrix工程中創建類包my. processor. ,之后新建類MyFrontierScheduler。代碼如下:


 

         之后打開Heritrix目錄下的module文件夾,里面是所有模塊的配置文件。打開Processor.options,在里面加入一行my. processor.MyFrontierScheduler|MyFrontierScheduler。然后保存退出,之后你就可以在新建任務的時候選擇使用自己擴展的FrontierScheduler了。

 

 

(2)   擴展MirrorWriterProcessor

有的時候我們需要在網頁下載之前將網頁進行分析並提取有效內容存儲起來,這時我們可以擴展MirrorWriterProcessor這個模塊。利用一個開源的包htmlparser分析網頁結構,並將結果存儲起來。htmlparser可以在http://htmlparser.sourceforge.net 獲得。將下載的包添加到項目的引用列表中。

新建MyMirrorWriterProcessor,將之前MirrorWriterProcessor的代碼復制過來,改掉類名及構造函數的名稱。添加新的引用:


新建一個方法AnalysisFile(),在writeToPath這個函數中調用它:

 

 之后就可以在AnalysisFile()中處理dest這個文件,將其進行分析並保存為想要的格式。以下例子將其去掉Html標簽之后封裝進一個XML文件:

4.   Heritrix 的常用技巧

1)    只保存html類型的文件

對於大多數的搜索引擎,我們所要做的只是對於純文本的搜索。因此只需要保存html類型的內容。Heritrix的官方文檔”Heritrix User Manual”中給出了一個解決方案

         在新建任務時點擊”submodules”,如下圖:

     添加一個新的規則,類型為NotMatchesFilePatternDecideRule,並將其放置在PrerequisiteAccept-

DecideRule之前,不然dns將不會被正確解析。之后在設置面板中如下設置:

這樣設置之后,爬蟲就會只抓取html類型的文件,而將其它類型的文件都忽略掉。

 

2)    Queue-assignment-policy的設置。

當我們設置了在特定的域名下爬行的時候,經常會碰到永遠只有一個線程在運行的情況,導致爬行十分緩慢。這是因為在默認的情況下,Heritrix使用HostnameQueueAssignmentPolicy來產生key值,從這個策略的名字,我們也可以很容易的看出,keyhostname是有關系的。而事實上,這個策略正是用hostname作為key值的。因此一個域名下的所有鏈接都會放到同一個線程中去。

為解決這個問題,我們新建一個策略:

這樣用ELF hash算法把url盡量平均分部到各個隊列中去,采集的速度大大的加快了。

 

 

 

參考資料:

1.   Gordon Mohretal : An introduction to Heritrix. Accessed Apr 2009.

http://crawler.archive.org/An%20Introduction%20to%20Heritrix.pdf

2.    Wikipedia Heritrix Homepage. Accessed Apr 2009.    http://en.wikipedia.org/wiki/Heritrix

3.    John Erik Halse : Heritrix developer documentation. Accessed Apr 2009.

http://crawler.archive.org/articles/developer_manual.html

4.    Kristinn Sigurđsso: Heritrix User Manual. Accessed Apr 2009.

http://crawler.archive.org/articles/user_manual/index.html

5.    邱哲 符滔滔:《開發自己的搜索引擎-Lucene 2.0+Heritrix人民郵電出版社 ISBN:711516000  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM