利用 Heritrix 構建特定站點爬蟲

Berkeley db(獨立介紹)

本文由淺入深,詳細介紹了 Heritrix 在 Eclipse 中的配置、運行。最後對其進行擴展,介紹如何實現只抓取特定網站的頁面。

通過本文,讀者可以瞭解 Heritrix 的相關特點以及在 Eclipse 中的配置運行,能夠從零開始構建特定站點的專有爬蟲,從而爲網站增加全文檢索服務。

背景

隨着網站內容的增加,爲其添加搜索功能是一個常見的需求,搜索引擎也已成爲互聯網最重要的應用之一。你是否覺得普通的數據庫檢索已經不能滿足你的查詢需求了呢?是否希望花最小的代價爲你的網站建立一個像 Google、百度那樣的全文搜索引擎?是否希望創建自己專有的搜索引擎而不是想盡辦法 SEO(Search Engine Optimization,搜索引擎優化)來等着 Google、百度收錄你的網站?藉助於開源工具的力量,你將很容易實現上述目標。

搜索引擎的實現過程,可以看作三步:1. 從互聯網上抓取網頁 2. 對網頁進行處理,建立索引數據庫 3. 進行查詢。因此無論什麼樣的搜索引擎,都必須要有一個設計良好的爬蟲來支持。Heritrix 是 SourceForge 上基於 Java 的開源爬蟲,它可以通過 Web 用戶界面來啓動、設置爬行參數並監控爬行,同時開發者可以隨意地擴展它的各個組件,來實現自己的抓取邏輯,因其方便的可擴展性而深受廣大搜索引擎愛好者的喜愛。

雖然 Heritrix 功能強大,但其配置複雜,而且官方只在 Linux 系統上測試通過,用戶難以上手。本文由淺入深,詳細介紹 Heritrix 在 windows 下 Eclipse 中的配置運行,並對其進行簡單擴展,使其只針對某一特定網站進行抓取,爲構建相應站點的全文搜索引擎打好基礎。

回頁首

Heritrix 下載

目前 Heritrix 的最新版本是 1.14.4(2010-5-10 發佈),您可以從 SourceForge(http://sourceforge.net/projects/archive-crawler/files/)上下載。每個版本都有四個壓縮包,兩個 .tar.gz 包用於 Linux 下,.zip 用於 windows 下。其中 heritrix-1.14.4.zip 是源代碼經過編譯打包後的文件,而 heritrix-1.14.4-src.zip 中包含原始的源代碼,方便進行二次開發。本文需要用到 heritrix-1.14.4-src.zip,將其下載並解壓至 heritrix-1.14.4-src 文件夾。

回頁首

在 Eclipse 中的配置

首先在 Eclipse 中新建 Java 工程 MyHeritrix。然後利用下載的源代碼包根據以下步驟來配置這個工程。

1. 導入類庫

Heritrix 所用到的工具類庫都在 heritrix-1.14.4-src\lib 目錄下,需要將其導入 MyHeritrix 工程。

1)將 heritrix-1.14.4-src 下的 lib 文件夾拷貝到 MyHeritrix 項目根目錄;

2)在 MyHeritrix 工程上右鍵單擊選擇“Build PathConfigure Build Path …”,然後選擇 Library 選項卡,單擊“Add JARs …”,如圖 1 所示。


圖 1. 導入類庫 - 導入前
 

3)在彈出的“JAR Selection”對話框中選擇 MyHeritrix 工程 lib 文件夾下所有的 jar 文件,然後點擊 OK 按鈕。如圖 2 所示。


圖 2. 選擇類庫
 

設置完成後如圖 3 所示:


圖 3. 導入類庫 - 導入後
 

2. 拷貝源代碼

1)將 heritrix-1.14.4-src\src\java 下的 com、org 和 st 三個文件夾拷貝進 MyHeritrix 工程的 src 下。這三個文件夾包含了運行 Heritrix 所必須的核心源代碼;

2)將 heritrix-1.14.4-src\src\resources\org\archive\util 下的文件 tlds-alpha-by-domain.txt 拷貝到 MyHeritrix\src\org\archive\util 中。該文件是一個頂級域名列表,在 Heritrix 啓動時會被讀取;

3)將 heritrix-1.14.4-src\src 下 conf 文件夾拷貝至 Heritrix 工程根目錄。它包含了 Heritrix 運行所需的配置文件;

4)將 heritrix-1.14.4-src\src 中的 webapps 文件夾拷貝至 Heritrix 工程根目錄。該文件夾是用來提供 servlet 引擎的,包含了 Heritrix 的 web UI 文件。需要注意的是它不包含幫助文檔,如果想使用幫助,可以將 heritrix-1.14.4.zip\docs 中的 articles 文件夾拷貝到 MyHeritrix\webapps\admin\docs(需新建 docs 文件夾)下。或直接用 heritrix-1.14.4.zip 的 webapps 文件夾替換 heritrix-1.14.4-src\src 中的 webapps 文件夾,缺點是這個是打包好的 .war 文件,無法修改源代碼。

拷貝完畢後的 MyHeritrix 工程目錄層次如圖 4 所示。這裏運行 Heritrix 所需的源代碼等已經準備完備,下面需要修改配置文件並添加運行參數。


圖 4. MyHeritrix 工程的目錄層次
 

3. 修改配置文件

conf 文件夾是用來提供配置文件的,裏面包含了一個很重要的文件:heritrix.properties。heritrix.properties 中配置了大量與 Heritrix 運行息息相關的參數,這些參數的配置決定了 Heritrix 運行時的一些默認工具類、Web UI 的啓動參數,以及 Heritrix 的日誌格式等。當第一次運行 Heritrix 時,只需要修改該文件,爲其加入 Web UI 的用戶名和密碼。如圖 5 所示,設置 heritrix.cmdline.admin = admin:admin,“admin:admin”分別爲用戶名和密碼。然後設置版本參數爲 1.14.4。


圖 5. 設置登陸用戶名和密碼
 

4. 配置運行文件

在 MyHeritrix 工程上右鍵單擊選擇“Run AsRun Configurations”,確保 Main 選項卡中的 Project 和 Main class 選項內容正確,如圖 6 所示。其中的 Name 參數可以設置爲任何方便識別的名字。


圖 6. 配置運行文件—設置工程和類
 

然後在 Classpath 頁選擇 UserEntries 選項,此時右邊的 Advanced 按鈕處於激活狀態,點擊它,在彈出的對話框中選擇“Add Folders”,然後選擇 MyHeritrix 工程下的 conf 文件夾。如圖 7 所示。


圖 7. 添加配置文件
 

至此我們的 MyHeritrix 工程已經可以運行起來了。下面我們來看看如何啓動 Heritrix 並設置一個具體的抓取任務。

回頁首

創建網頁抓取任務

找到 org.archive.crawler 包中的 Heritrix.java 文件,它是 Heritrix 爬蟲啓動的入口,右鍵單擊選擇“Run AsJava Application”,如果配置正確,會在控制檯輸出如圖 8 所示的啓動信息。


圖 8. 運行成功時控制檯輸出
 

在瀏覽器中輸入 http://localhost:8080,會打開如圖 9 所示的 Web UI 登錄界面。


圖 9. Heritrix 登錄界面
 

輸入之前設置的用戶名 / 密碼:admin/admin,進入到 Heritrix 的管理界面,如圖 10 所示。因爲我們還沒有創建抓取任務,所以 Jobs 顯示爲 0。


圖 10. Heritrix 控制檯
 

Heritrix 使用 Web 用戶界面來啓動、設置爬行參數並監控爬行,簡單直觀,易於管理。下面我們以北京林業大學首頁 (http://www.bjfu.edu.cn/) 爲種子站點來創建一個抓取實例。

在 Jobs 頁面創建一個新的抓取任務,如圖 11 所示,可以創建四種任務類型。


圖 11. 創建抓取任務
 
  • Based on existing job:以一個已經有的抓取任務爲模板生成新的抓取任務。
  • Based on a recovery:在以前的某個任務中,可能設置過一些狀態點,新的任務將從這個設置的狀態點開始。
  • Based on a profile:專門爲不同的任務設置了一些模板,新建的任務將按照模板來生成。
  • With defaults:這個最簡單,表示按默認的配置來生成一個任務。

這裏我們選擇“With defaults”,然後輸入任務相關信息,如圖 12 所示。


圖 12. 創建抓取任務“BJFU”
 

注意圖 11 中下方的按鈕,通過這些按鈕可以對抓取工作進行詳細的設置,這裏我們只做一些必須的設置。

首先點擊“Modules”按鈕,在相應的頁面爲此次任務設置各個處理模塊,一共有七項可配置的內容,這裏我們只設置 Crawl Scope 和 Writers 兩項,下面簡要介紹各項的意義。

1)Select Crawl Scope:Crawl Scope 用於配置當前應該在什麼範圍內抓取網頁鏈接。例如選擇 BroadScope 則表示當前的抓取範圍不受限制,選擇 HostScope 則表示抓取的範圍在當前的 Host 範圍內。在這裏我們選擇 org.archive.crawler.scope.BroadScope,並單擊右邊的 Change 按鈕保存設置狀態。

2)Select URI Frontier:Frontier 是一個 URL 的處理器,它決定下一個被處理的 URL 是什麼。同時,它還會將經由處理器鏈解析出來的 URL 加入到等待處理的隊列中去。這裏我們使用默認值。

3)Select Pre Processors:這個隊列的處理器是用來對抓取時的一些先決條件進行判斷。比如判斷 robot.txt 信息等,它是整個處理器鏈的入口。這裏我們使用默認值。

4)Select Fetchers:這個參數用於解析網絡傳輸協議,比如解析 DNS、HTTP 或 FTP 等。這裏我們使用默認值。

5)Select Extractors:主要是用於解析當前服務器返回的內容,取出頁面中的 URL,等待下次繼續抓取。這裏我們使用默認值。

6)Select Writers:它主要用於設定將所抓取到的信息以何種形式寫入磁盤。一種是採用壓縮的方式(Arc),還有一種是鏡像方式(Mirror)。這裏我們選擇簡單直觀的鏡像方式:org.archive.crawler.writer.MirrorWriterProcessor。

7)Select Post Processors:這個參數主要用於抓取解析過程結束後的掃尾工作,比如將 Extrator 解析出來的 URL 有條件地加入到待處理的隊列中去。這裏我們使用默認值。

設置完畢後的效果如圖 13:


圖 13. 設置 Modules
 

設置完“Modules”後,點擊“Settings”按鈕,這裏只需要設置 user-agent 和 from,其中:

  • “@VERSION@”字符串需要被替換成 Heritrix 的版本信息。
  • “PROJECT_URL_HERE”可以被替換成任何一個完整的 URL 地址。
  • “from”屬性中不需要設置真實的 E-mail 地址,只要是格式正確的郵件地址就可以了。

對於各項參數的解釋,可以點擊參數前的問號查看。本次任務設置如圖 14 所示。


圖 14. 設置 Settings
 

完成上述設置後點擊“Submit job”鏈接,然後回到 console 控制檯,可以看到我們剛剛創建的任務處於 pending 狀態,如圖 15 所示。


圖 15. 啓動任務
 

點擊“Start”啓動任務,刷新一下即可看到抓取進度以及相關參數。同時可以暫停或終止抓取過程,如圖 16 所示。需要注意的是,進度條的百分比數量並不是準確的,這個百分比是實際上已經處理的鏈接數和總共分析出的鏈接數的比值。隨着抓取工作不斷進行,這個百分比的數字也在不斷變化。


圖 16. 開始抓取
 

同時,在 MyHeritrix 工程目錄下自動生成“jobs”文件夾,包含本次抓取任務。抓取下來網頁以鏡像方式存放,也就是將 URL 地址按“/”進行切分,進而按切分出來的層次存儲。如圖 17 所示。


圖 17. 抓取到的網頁
 

從圖 17 也可以看出,因爲我們選擇了 BroadScope 的抓取範圍,爬蟲會抓取所有遇到的 URL,這樣會造成 URL 隊列無限制膨脹,無法終止,只能強行終止任務。儘管 Heritrix 也提供了一些抓取範圍控制的類,但是根據實際測試經驗,如果想要完全實現自己的抓取邏輯,僅僅靠 Heritrix 提供的抓取控制是不夠的,只能修改擴展源代碼。

下面本文以實現抓取北京林業大學(www.bjfu.edu.cn)下相關頁面爲例說明如何擴展 Heritrix 實現自己的抓取邏輯。

回頁首

擴展 Heritrix

我們先來分析一下 Heritrix 的總體結構和 URI 的處理鏈。

Heritrix 的總體結構

Heritrix 採用了模塊化的設計,用戶可以在運行時選擇要用的模塊。它由核心類(core classes)和插件模塊(pluggable modules)構成。核心類可以配置,但不能被覆蓋,插件模塊可以由第三方模塊取代。所以我們就可以用實現了特定抓取邏輯的第三方模塊來取代默認的插件模塊,從而滿足自己的抓取需要。

Heritrix 的整體結構如圖 18 所示。其中 CrawlController(下載控制器)整個下載過程的總控制者,整個抓取工作的起點,決定整個抓取任務的開始和結束。每個 URI 都有一個獨立的線程,它從邊界控制器(Frontier)獲取新的 URI,然後傳遞給 Processor chains(處理鏈)經過一系列 Processor(處理器)處理。


圖 18. Heritrix 整體結構
 

URI 處理流程

處理鏈由多個處理器組成,共同完成對 URI 的處理,如圖 19 所示。


圖 19. URI 處理鏈
 

1)Pre-fetch processing chain( 預處理鏈 ),用來判斷抓取時的一些先決條件,如 robot 協議、DNS 等。

2)Fetch processing chain(抓取處理鏈),解析網絡傳輸協議,從遠程服務器獲取數據。

3)Extractor processing chain(抽取處理鏈),從網頁中抽取新的 URL。

4)Write/index processing chain(寫處理鏈),負責把數據寫入本地磁盤。

5)Post-processing chain(後置處理鏈),在整個抓取解析過程結束後,進行一些掃尾工作,比如將前面 Extractor 解析出來的 URL 有條件的加入到待處理隊列中去。這裏我們只需要控制加入到待處理隊列中的 URL,就可以控制抓取的範圍。

擴展 FrontierScheduler 來抓取特定網站內容

FrontierScheduler 是 org.archive.crawler.postprocessor 包中的一個類,它的作用是將在 Extractor 中所分析得出的鏈接加入到 Frontier 中,以待繼續處理。在該類的 innerProcess(CrawlURI) 函數中,首先檢查當前鏈接隊列中是否有一些屬於高優先級的鏈接。如果有,則立刻轉走進行處理;如果沒有,則對所有的鏈接進行遍歷,然後調用 Frontier 中的 schedule() 方法加入隊列進行處理。其代碼如圖 20 所示。


圖 20. FrontierScheduler 類中的 innerProcess() 和 schedule() 函數
 

從上面的代碼可以看出 innerProcess() 函數並未直接調用 Frontier 的 schedule() 方法,而是調用自己內部的 schedule() 方法,進而在這個方法中再調用 Frontier 的 schedule() 方法。而 FrontierScheduler 的 schedule() 方法實際上直接將當前的候選鏈接不加任何判斷地直接加入到抓取隊列當中了。這種方式爲 FrontierScheduler 的擴展留出了很好的接口。

這裏我們需要構造一個 FrontierScheduler 的派生類 FrontierSchedulerForBjfu,這個類重載了 schedule(CandidateURI caUri) 這個方法,限制抓取的 URI 必須包含“bjfu”,以保證抓取的鏈接都是北林內部的地址。派生類 FrontierSchedulerForBjfu 具體代碼如圖 21 所示。


圖 21. 派生類 FrontierSchedulerForBjfu
 

然後,在 modules 文件夾中的 Processor.options 中添加一行“org.archive.crawler.postprocessor.FrontierSchedulerForBjfu|FrontierSchedulerForBjfu”,這樣在爬蟲的 WebUI 中就可以選擇我們擴展的 org.archive.crawler.postprocessor.FrontierSchedulerForBjfu 選項。如圖 22 所示。


圖 22. 用 FrontierSchedulerForBjfu 代替 FrontierScheduler
 

最終抓取的頁面如圖 23 所示,全部都是 http://www.bjfu.edu.cn下的頁面。是不是很簡單呢?當然,如果只是想實現這個抓取目標,不用修改源代碼,通過在 Web UI 中設置抓取規則也可以滿足要求。本文只是以此爲例說明 Heritrix 如何擴展 Heritrix。


圖 23. 擴展後的抓取效果
 

回頁首

常見問題

1. Access restriction 錯誤

錯誤信息:

Access restriction: The type FileURLConnection is not accessible due to restriction on required library C:\Program Files\Java\jdk1.6.0_20\jre\lib\rt.jar,如圖 24 所示。


圖 24. Access restriction 錯誤
 

解決方案:

這是 JRE 的訪問限制導致報錯,在 MyHeritrix 工程上右鍵單擊選擇“Build PathConfigure Build Path …”,然後選擇 Library 選項卡,將“JRE System Library”刪除然後重新導入一下即可修復。或者選擇“WindowsPreferencesJavaCompilerErrors/Warnings”找到“Deprecated and restricted API”下的“Forbidden reference (access rules)”,將默認設置“Error”改爲“Warning”或“Ignore”。

2. NullPointerException 的錯誤

錯誤信息如圖 25 所示:


圖 25. NullPointerException 錯誤
 

解決方案:

這個錯誤的原因是缺少了“tlds-alpha-by-domain.txt”文件,在 heritrix-1.14.4-src\src\resources\org\archive\util 下可以找到該文件,將其拷貝到 MyHeritrix\src\org\archive\util 中即可。

3. Modules 界面無法改變選擇項

錯誤信息如圖 26 所示。


圖 26. Modules 界面無法改變選擇項
 

解決方案:

這是因爲沒有添加運行時所需的配置文件,參照本文“4. 配置運行方式”爲 Classpath 添加參數即可。

回頁首

注意事項

Heritrix 屬於多線程下載爬蟲,在公司內網使用有抓取限制。

回頁首

總結

在搜索引擎的開發過程中,使用一個優秀的爬蟲來獲得所需要的網頁信息是第一步,也是整個系統成功的關鍵。Heritrix 是一個功能強大而且高效的爬蟲,具有良好的可擴展性。本文介紹了它在 windows 下 Eclipse 中的配置運行以及擴展,使您可以以最快的速度上手使用 Heritrix,享受您的爬蟲之旅。

發佈了81 篇原創文章 · 獲贊 65 · 訪問量 34萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章