|
本文由淺入深,詳細(xì)介紹了 Heritrix 在 Eclipse 中的配置、運(yùn)行。最后對(duì)其進(jìn)行擴(kuò)展,介紹如何實(shí)現(xiàn)只抓取特定網(wǎng)站的頁(yè)面。 通過(guò)本文,讀者可以了解 Heritrix 的相關(guān)特點(diǎn)以及在 Eclipse 中的配置運(yùn)行,能夠從零開(kāi)始構(gòu)建特定站點(diǎn)的專(zhuān)有爬蟲(chóng),從而為網(wǎng)站增加全文檢索服務(wù)。 背景隨著網(wǎng)站內(nèi)容的增加,為其添加搜索功能是一個(gè)常見(jiàn)的需求,搜索引擎也已成為互聯(lián)網(wǎng)最重要的應(yīng)用之一。你是否覺(jué)得普通的數(shù)據(jù)庫(kù)檢索已經(jīng)不能滿(mǎn)足你的查詢(xún)需求了呢?是否希望花最小的代價(jià)為你的網(wǎng)站建立一個(gè)像 Google、百度那樣的全文搜索引擎?是否希望創(chuàng)建自己專(zhuān)有的搜索引擎而不是想盡辦法 SEO(Search Engine Optimization,搜索引擎優(yōu)化)來(lái)等著 Google、百度收錄你的網(wǎng)站?借助于開(kāi)源工具的力量,你將很容易實(shí)現(xiàn)上述目標(biāo)。 搜索引擎的實(shí)現(xiàn)過(guò)程,可以看作三步:1. 從互聯(lián)網(wǎng)上抓取網(wǎng)頁(yè); 2. 對(duì)網(wǎng)頁(yè)進(jìn)行處理,建立索引數(shù)據(jù)庫(kù); 3. 進(jìn)行查詢(xún)。因此無(wú)論什么樣的搜索引擎,都必須要有一個(gè)設(shè)計(jì)良好的爬蟲(chóng)來(lái)支持。Heritrix 是 SourceForge 上基于 Java 的開(kāi)源爬蟲(chóng),它可以通過(guò) Web 用戶(hù)界面來(lái)啟動(dòng)、設(shè)置爬行參數(shù)并監(jiān)控爬行,同時(shí)開(kāi)發(fā)者可以隨意地?cái)U(kuò)展它的各個(gè)組件,來(lái)實(shí)現(xiàn)自己的抓取邏輯,因其方便的可擴(kuò)展性而深受廣大搜索引擎愛(ài)好者的喜愛(ài)。 雖然 Heritrix 功能強(qiáng)大,但其配置復(fù)雜,而且官方只在 Linux 系統(tǒng)上測(cè)試通過(guò),用戶(hù)難以上手。本文由淺入深,詳細(xì)介紹 Heritrix 在 windows 下 Eclipse 中的配置運(yùn)行,并對(duì)其進(jìn)行簡(jiǎn)單擴(kuò)展,使其只針對(duì)某一特定網(wǎng)站進(jìn)行抓取,為構(gòu)建相應(yīng)站點(diǎn)的全文搜索引擎打好基礎(chǔ)。 Heritrix 下載目前 Heritrix 的最新版本是 1.14.4(2010-5-10 發(fā)布),您可以從 SourceForge(http:///projects/archive-crawler/files/)上下載。每個(gè)版本都有四個(gè)壓縮包,兩個(gè) .tar.gz 包用于 Linux 下,.zip 用于 windows 下。其中 heritrix-1.14.4.zip 是源代碼經(jīng)過(guò)編譯打包后的文件,而 heritrix-1.14.4-src.zip 中包含原始的源代碼,方便進(jìn)行二次開(kāi)發(fā)。本文需要用到 heritrix-1.14.4-src.zip,將其下載并解壓至 heritrix-1.14.4-src 文件夾。 在 Eclipse 中的配置首先在 Eclipse 中新建 Java 工程 MyHeritrix。然后利用下載的源代碼包根據(jù)以下步驟來(lái)配置這個(gè)工程。 1. 導(dǎo)入類(lèi)庫(kù)Heritrix 所用到的工具類(lèi)庫(kù)都在 heritrix-1.14.4-src\lib 目錄下,需要將其導(dǎo)入 MyHeritrix 工程。 1)將 heritrix-1.14.4-src 下的 lib 文件夾拷貝到 MyHeritrix 項(xiàng)目根目錄; 2)在 MyHeritrix 工程上右鍵單擊選擇“Build Path?Configure Build Path …”,然后選擇 Library 選項(xiàng)卡,單擊“Add JARs …”,如圖 1 所示。 圖 1. 導(dǎo)入類(lèi)庫(kù) - 導(dǎo)入前![]() 3)在彈出的“JAR Selection”對(duì)話框中選擇 MyHeritrix 工程 lib 文件夾下所有的 jar 文件,然后點(diǎn)擊 OK 按鈕。如圖 2 所示。 圖 2. 選擇類(lèi)庫(kù)![]() 設(shè)置完成后如圖 3 所示: 圖 3. 導(dǎo)入類(lèi)庫(kù) - 導(dǎo)入后![]() 2. 拷貝源代碼1)將 heritrix-1.14.4-src\src\java 下的 com、org 和 st 三個(gè)文件夾拷貝進(jìn) MyHeritrix 工程的 src 下。這三個(gè)文件夾包含了運(yùn)行 Heritrix 所必須的核心源代碼; 2)將 heritrix-1.14.4-src\src\resources\org\archive\util 下的文件 tlds-alpha-by-domain.txt 拷貝到 MyHeritrix\src\org\archive\util 中。該文件是一個(gè)頂級(jí)域名列表,在 Heritrix 啟動(dòng)時(shí)會(huì)被讀??; 3)將 heritrix-1.14.4-src\src 下 conf 文件夾拷貝至 Heritrix 工程根目錄。它包含了 Heritrix 運(yùn)行所需的配置文件; 4)將 heritrix-1.14.4-src\src 中的 webapps 文件夾拷貝至 Heritrix 工程根目錄。該文件夾是用來(lái)提供 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 文件夾,缺點(diǎn)是這個(gè)是打包好的 .war 文件,無(wú)法修改源代碼。 拷貝完畢后的 MyHeritrix 工程目錄層次如圖 4 所示。這里運(yùn)行 Heritrix 所需的源代碼等已經(jīng)準(zhǔn)備完備,下面需要修改配置文件并添加運(yùn)行參數(shù)。 圖 4. MyHeritrix 工程的目錄層次![]() 3. 修改配置文件conf 文件夾是用來(lái)提供配置文件的,里面包含了一個(gè)很重要的文件:heritrix.properties。heritrix.properties 中配置了大量與 Heritrix 運(yùn)行息息相關(guān)的參數(shù),這些參數(shù)的配置決定了 Heritrix 運(yùn)行時(shí)的一些默認(rèn)工具類(lèi)、Web UI 的啟動(dòng)參數(shù),以及 Heritrix 的日志格式等。當(dāng)?shù)谝淮芜\(yùn)行 Heritrix 時(shí),只需要修改該文件,為其加入 Web UI 的用戶(hù)名和密碼。如圖 5 所示,設(shè)置 heritrix.cmdline.admin = admin:admin,“admin:admin”分別為用戶(hù)名和密碼。然后設(shè)置版本參數(shù)為 1.14.4。 圖 5. 設(shè)置登陸用戶(hù)名和密碼![]() 4. 配置運(yùn)行文件在 MyHeritrix 工程上右鍵單擊選擇“Run As?Run Configurations”,確保 Main 選項(xiàng)卡中的 Project 和 Main class 選項(xiàng)內(nèi)容正確,如圖 6 所示。其中的 Name 參數(shù)可以設(shè)置為任何方便識(shí)別的名字。 圖 6. 配置運(yùn)行文件—設(shè)置工程和類(lèi)![]() 然后在 Classpath 頁(yè)選擇 UserEntries 選項(xiàng),此時(shí)右邊的 Advanced 按鈕處于激活狀態(tài),點(diǎn)擊它,在彈出的對(duì)話框中選擇“Add Folders”,然后選擇 MyHeritrix 工程下的 conf 文件夾。如圖 7 所示。 圖 7. 添加配置文件![]() 至此我們的 MyHeritrix 工程已經(jīng)可以運(yùn)行起來(lái)了。下面我們來(lái)看看如何啟動(dòng) Heritrix 并設(shè)置一個(gè)具體的抓取任務(wù)。 創(chuàng)建網(wǎng)頁(yè)抓取任務(wù)找到 org.archive.crawler 包中的 Heritrix.java 文件,它是 Heritrix 爬蟲(chóng)啟動(dòng)的入口,右鍵單擊選擇“Run As?Java Application”,如果配置正確,會(huì)在控制臺(tái)輸出如圖 8 所示的啟動(dòng)信息。 圖 8. 運(yùn)行成功時(shí)控制臺(tái)輸出![]() 在瀏覽器中輸入 http://localhost:8080,會(huì)打開(kāi)如圖 9 所示的 Web UI 登錄界面。 圖 9. Heritrix 登錄界面![]() 輸入之前設(shè)置的用戶(hù)名 / 密碼:admin/admin,進(jìn)入到 Heritrix 的管理界面,如圖 10 所示。因?yàn)槲覀冞€沒(méi)有創(chuàng)建抓取任務(wù),所以 Jobs 顯示為 0。 圖 10. Heritrix 控制臺(tái)![]() Heritrix 使用 Web 用戶(hù)界面來(lái)啟動(dòng)、設(shè)置爬行參數(shù)并監(jiān)控爬行,簡(jiǎn)單直觀,易于管理。下面我們以北京林業(yè)大學(xué)首頁(yè) (http://www./) 為種子站點(diǎn)來(lái)創(chuàng)建一個(gè)抓取實(shí)例。 在 Jobs 頁(yè)面創(chuàng)建一個(gè)新的抓取任務(wù),如圖 11 所示,可以創(chuàng)建四種任務(wù)類(lèi)型。 圖 11. 創(chuàng)建抓取任務(wù)![]()
這里我們選擇“With defaults”,然后輸入任務(wù)相關(guān)信息,如圖 12 所示。 圖 12. 創(chuàng)建抓取任務(wù)“BJFU”![]() 注意圖 11 中下方的按鈕,通過(guò)這些按鈕可以對(duì)抓取工作進(jìn)行詳細(xì)的設(shè)置,這里我們只做一些必須的設(shè)置。 首先點(diǎn)擊“Modules”按鈕,在相應(yīng)的頁(yè)面為此次任務(wù)設(shè)置各個(gè)處理模塊,一共有七項(xiàng)可配置的內(nèi)容,這里我們只設(shè)置 Crawl Scope 和 Writers 兩項(xiàng),下面簡(jiǎn)要介紹各項(xiàng)的意義。 1)Select Crawl Scope:Crawl Scope 用于配置當(dāng)前應(yīng)該在什么范圍內(nèi)抓取網(wǎng)頁(yè)鏈接。例如選擇 BroadScope 則表示當(dāng)前的抓取范圍不受限制,選擇 HostScope 則表示抓取的范圍在當(dāng)前的 Host 范圍內(nèi)。在這里我們選擇 org.archive.crawler.scope.BroadScope,并單擊右邊的 Change 按鈕保存設(shè)置狀態(tài)。 2)Select URI Frontier:Frontier 是一個(gè) URL 的處理器,它決定下一個(gè)被處理的 URL 是什么。同時(shí),它還會(huì)將經(jīng)由處理器鏈解析出來(lái)的 URL 加入到等待處理的隊(duì)列中去。這里我們使用默認(rèn)值。 3)Select Pre Processors:這個(gè)隊(duì)列的處理器是用來(lái)對(duì)抓取時(shí)的一些先決條件進(jìn)行判斷。比如判斷 robot.txt 信息等,它是整個(gè)處理器鏈的入口。這里我們使用默認(rèn)值。 4)Select Fetchers:這個(gè)參數(shù)用于解析網(wǎng)絡(luò)傳輸協(xié)議,比如解析 DNS、HTTP 或 FTP 等。這里我們使用默認(rèn)值。 5)Select Extractors:主要是用于解析當(dāng)前服務(wù)器返回的內(nèi)容,取出頁(yè)面中的 URL,等待下次繼續(xù)抓取。這里我們使用默認(rèn)值。 6)Select Writers:它主要用于設(shè)定將所抓取到的信息以何種形式寫(xiě)入磁盤(pán)。一種是采用壓縮的方式(Arc),還有一種是鏡像方式(Mirror)。這里我們選擇簡(jiǎn)單直觀的鏡像方式:org.archive.crawler.writer.MirrorWriterProcessor。 7)Select Post Processors:這個(gè)參數(shù)主要用于抓取解析過(guò)程結(jié)束后的掃尾工作,比如將 Extrator 解析出來(lái)的 URL 有條件地加入到待處理的隊(duì)列中去。這里我們使用默認(rèn)值。 設(shè)置完畢后的效果如圖 13: 圖 13. 設(shè)置 Modules![]() 設(shè)置完“Modules”后,點(diǎn)擊“Settings”按鈕,這里只需要設(shè)置 user-agent 和 from,其中:
對(duì)于各項(xiàng)參數(shù)的解釋?zhuān)梢渣c(diǎn)擊參數(shù)前的問(wèn)號(hào)查看。本次任務(wù)設(shè)置如圖 14 所示。 圖 14. 設(shè)置 Settings![]() 完成上述設(shè)置后點(diǎn)擊“Submit job”鏈接,然后回到 console 控制臺(tái),可以看到我們剛剛創(chuàng)建的任務(wù)處于 pending 狀態(tài),如圖 15 所示。 圖 15. 啟動(dòng)任務(wù)![]() 點(diǎn)擊“Start”啟動(dòng)任務(wù),刷新一下即可看到抓取進(jìn)度以及相關(guān)參數(shù)。同時(shí)可以暫?;蚪K止抓取過(guò)程,如圖 16 所示。需要注意的是,進(jìn)度條的百分比數(shù)量并不是準(zhǔn)確的,這個(gè)百分比是實(shí)際上已經(jīng)處理的鏈接數(shù)和總共分析出的鏈接數(shù)的比值。隨著抓取工作不斷進(jìn)行,這個(gè)百分比的數(shù)字也在不斷變化。 圖 16. 開(kāi)始抓取![]() 同時(shí),在 MyHeritrix 工程目錄下自動(dòng)生成“jobs”文件夾,包含本次抓取任務(wù)。抓取下來(lái)網(wǎng)頁(yè)以鏡像方式存放,也就是將 URL 地址按“/”進(jìn)行切分,進(jìn)而按切分出來(lái)的層次存儲(chǔ)。如圖 17 所示。 圖 17. 抓取到的網(wǎng)頁(yè)![]() 從圖 17 也可以看出,因?yàn)槲覀冞x擇了 BroadScope 的抓取范圍,爬蟲(chóng)會(huì)抓取所有遇到的 URL,這樣會(huì)造成 URL 隊(duì)列無(wú)限制膨脹,無(wú)法終止,只能強(qiáng)行終止任務(wù)。盡管 Heritrix 也提供了一些抓取范圍控制的類(lèi),但是根據(jù)實(shí)際測(cè)試經(jīng)驗(yàn),如果想要完全實(shí)現(xiàn)自己的抓取邏輯,僅僅靠 Heritrix 提供的抓取控制是不夠的,只能修改擴(kuò)展源代碼。 下面本文以實(shí)現(xiàn)抓取北京林業(yè)大學(xué)(www.)下相關(guān)頁(yè)面為例說(shuō)明如何擴(kuò)展 Heritrix 實(shí)現(xiàn)自己的抓取邏輯。 擴(kuò)展 Heritrix我們先來(lái)分析一下 Heritrix 的總體結(jié)構(gòu)和 URI 的處理鏈。 Heritrix 的總體結(jié)構(gòu)Heritrix 采用了模塊化的設(shè)計(jì),用戶(hù)可以在運(yùn)行時(shí)選擇要用的模塊。它由核心類(lèi)(core classes)和插件模塊(pluggable modules)構(gòu)成。核心類(lèi)可以配置,但不能被覆蓋,插件模塊可以由第三方模塊取代。所以我們就可以用實(shí)現(xiàn)了特定抓取邏輯的第三方模塊來(lái)取代默認(rèn)的插件模塊,從而滿(mǎn)足自己的抓取需要。 Heritrix 的整體結(jié)構(gòu)如圖 18 所示。其中 CrawlController(下載控制器)整個(gè)下載過(guò)程的總控制者,整個(gè)抓取工作的起點(diǎn),決定整個(gè)抓取任務(wù)的開(kāi)始和結(jié)束。每個(gè) URI 都有一個(gè)獨(dú)立的線程,它從邊界控制器(Frontier)獲取新的 URI,然后傳遞給 Processor chains(處理鏈)經(jīng)過(guò)一系列 Processor(處理器)處理。 圖 18. Heritrix 整體結(jié)構(gòu)![]() URI 處理流程處理鏈由多個(gè)處理器組成,共同完成對(duì) URI 的處理,如圖 19 所示。 圖 19. URI 處理鏈![]() 1)Pre-fetch processing chain( 預(yù)處理鏈 ),用來(lái)判斷抓取時(shí)的一些先決條件,如 robot 協(xié)議、DNS 等。 2)Fetch processing chain(抓取處理鏈),解析網(wǎng)絡(luò)傳輸協(xié)議,從遠(yuǎn)程服務(wù)器獲取數(shù)據(jù)。 3)Extractor processing chain(抽取處理鏈),從網(wǎng)頁(yè)中抽取新的 URL。 4)Write/index processing chain(寫(xiě)處理鏈),負(fù)責(zé)把數(shù)據(jù)寫(xiě)入本地磁盤(pán)。 5)Post-processing chain(后置處理鏈),在整個(gè)抓取解析過(guò)程結(jié)束后,進(jìn)行一些掃尾工作,比如將前面 Extractor 解析出來(lái)的 URL 有條件的加入到待處理隊(duì)列中去。這里我們只需要控制加入到待處理隊(duì)列中的 URL,就可以控制抓取的范圍。 擴(kuò)展 FrontierScheduler 來(lái)抓取特定網(wǎng)站內(nèi)容FrontierScheduler 是 org.archive.crawler.postprocessor 包中的一個(gè)類(lèi),它的作用是將在 Extractor 中所分析得出的鏈接加入到 Frontier 中,以待繼續(xù)處理。在該類(lèi)的 innerProcess(CrawlURI) 函數(shù)中,首先檢查當(dāng)前鏈接隊(duì)列中是否有一些屬于高優(yōu)先級(jí)的鏈接。如果有,則立刻轉(zhuǎn)走進(jìn)行處理;如果沒(méi)有,則對(duì)所有的鏈接進(jìn)行遍歷,然后調(diào)用 Frontier 中的 schedule() 方法加入隊(duì)列進(jìn)行處理。其代碼如圖 20 所示。 圖 20. FrontierScheduler 類(lèi)中的 innerProcess() 和 schedule() 函數(shù)![]() 從上面的代碼可以看出 innerProcess() 函數(shù)并未直接調(diào)用 Frontier 的 schedule() 方法,而是調(diào)用自己內(nèi)部的 schedule() 方法,進(jìn)而在這個(gè)方法中再調(diào)用 Frontier 的 schedule() 方法。而 FrontierScheduler 的 schedule() 方法實(shí)際上直接將當(dāng)前的候選鏈接不加任何判斷地直接加入到抓取隊(duì)列當(dāng)中了。這種方式為 FrontierScheduler 的擴(kuò)展留出了很好的接口。 這里我們需要構(gòu)造一個(gè) FrontierScheduler 的派生類(lèi) FrontierSchedulerForBjfu,這個(gè)類(lèi)重載了 schedule(CandidateURI caUri) 這個(gè)方法,限制抓取的 URI 必須包含“bjfu”,以保證抓取的鏈接都是北林內(nèi)部的地址。派生類(lèi) FrontierSchedulerForBjfu 具體代碼如圖 21 所示。 圖 21. 派生類(lèi) FrontierSchedulerForBjfu![]() 然后,在 modules 文件夾中的 Processor.options 中添加一行“org.archive.crawler.postprocessor.FrontierSchedulerForBjfu|FrontierSchedulerForBjfu”,這樣在爬蟲(chóng)的 WebUI 中就可以選擇我們擴(kuò)展的 org.archive.crawler.postprocessor.FrontierSchedulerForBjfu 選項(xiàng)。如圖 22 所示。 圖 22. 用 FrontierSchedulerForBjfu 代替 FrontierScheduler![]() 最終抓取的頁(yè)面如圖 23 所示,全部都是 http://www.下的頁(yè)面。是不是很簡(jiǎn)單呢?當(dāng)然,如果只是想實(shí)現(xiàn)這個(gè)抓取目標(biāo),不用修改源代碼,通過(guò)在 Web UI 中設(shè)置抓取規(guī)則也可以滿(mǎn)足要求。本文只是以此為例說(shuō)明 Heritrix 如何擴(kuò)展 Heritrix。 圖 23. 擴(kuò)展后的抓取效果![]() 常見(jiàn)問(wèn)題1. Access restriction 錯(cuò)誤錯(cuò)誤信息: 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 錯(cuò)誤![]() 解決方案: 這是 JRE 的訪問(wèn)限制導(dǎo)致報(bào)錯(cuò),在 MyHeritrix 工程上右鍵單擊選擇“Build Path?Configure Build Path …”,然后選擇 Library 選項(xiàng)卡,將“JRE System Library”刪除然后重新導(dǎo)入一下即可修復(fù)?;蛘哌x擇“Windows?Preferences?Java?Compiler?Errors/Warnings”找到“Deprecated and restricted API”下的“Forbidden reference (access rules)”,將默認(rèn)設(shè)置“Error”改為“Warning”或“Ignore”。 2. NullPointerException 的錯(cuò)誤錯(cuò)誤信息如圖 25 所示: 圖 25. NullPointerException 錯(cuò)誤![]() 解決方案: 這個(gè)錯(cuò)誤的原因是缺少了“tlds-alpha-by-domain.txt”文件,在 heritrix-1.14.4-src\src\resources\org\archive\util 下可以找到該文件,將其拷貝到 MyHeritrix\src\org\archive\util 中即可。 3. Modules 界面無(wú)法改變選擇項(xiàng)錯(cuò)誤信息如圖 26 所示。 圖 26. Modules 界面無(wú)法改變選擇項(xiàng)![]() 解決方案: 這是因?yàn)闆](méi)有添加運(yùn)行時(shí)所需的配置文件,參照本文“4. 配置運(yùn)行方式”為 Classpath 添加參數(shù)即可。 注意事項(xiàng)Heritrix 屬于多線程下載爬蟲(chóng),在公司內(nèi)網(wǎng)使用有抓取限制。 總結(jié)在搜索引擎的開(kāi)發(fā)過(guò)程中,使用一個(gè)優(yōu)秀的爬蟲(chóng)來(lái)獲得所需要的網(wǎng)頁(yè)信息是第一步,也是整個(gè)系統(tǒng)成功的關(guān)鍵。Heritrix 是一個(gè)功能強(qiáng)大而且高效的爬蟲(chóng),具有良好的可擴(kuò)展性。本文介紹了它在 windows 下 Eclipse 中的配置運(yùn)行以及擴(kuò)展,使您可以以最快的速度上手使用 Heritrix,享受您的爬蟲(chóng)之旅。 |
|
|