本文主要參考:http://blog.csdn.net/yunshuixiliu/article/details/8627488
和http://blog.csdn.net/wy_kath/article/details/9385015
非常感謝!!!記下來,以便以後查看~
一、heritrix的安裝配置
Heritrix具體下載地址如下:
http://sourceforge.net/projects/archive-crawler/files/archive-crawler%20%28heritrix%201.x%29/
本實例所用的爲Heritrix1.14.4的源代碼版本,即你只需下載一個文件即可:heritrix-1.14.4-src.zip。 之所以採用源代碼版本,是因爲本實例中,需要對Heritrix 進行一些擴展,以適應本實例的需求。網上教程多是下載兩個文件heritrix-1.14.4.zip和heritrix-1.14.4-src.zip,即費時,又大多無效,按照網上流傳配置辦法很難成功。這裏我已在MyEclipse裏順利配置完成並抓取到所需網頁,下面開始配置流程:
1、將heritrix-1.14.4-src.zip的壓縮包解壓,目錄中的lib和src是本實例需要的兩個文件夾。 “lib”文件夾下存放的是Heritrix 運行時候所需要的第三方類庫,“src”文件夾下就是Heritrix 的源代碼。
2、在Eclipse 中打開菜單:File/new/Java Project,並在“Project name”中輸入“Heritrix”,這樣就新建了一個項目名稱叫做Heritrix ,同時將源代碼文件夾下的lib文件夾拖放置新建好的項目工程Heritrix 下。在Elipse裏的項目工程內,找到剛剛拖進去的lib文件夾,把裏面所有的.jar文件選中,右鍵Build Path→ Add to...,這樣便完成了運行庫的添加任務。
3、將位於Heritrix 源代碼文件夾下的src\ Java \ 的org和st兩個文件夾直接拖進Heritrixj工程的src下。如果當添加完後報錯,只是因爲你的太低版本的Eclipse默認的編譯版本爲1.4,所以要改成1.5或者1.6版本。單擊菜單中的Window ,選擇Preferences之後,展開左邊的Java選項,單擊其中的“Compiler”,將Compiler compliancelevel改成J2EE1.6或1.5。
4、將位於解壓後文件夾下的src \ conf\下的所有文件和文件夾拖至Heritrix 工程的src內,在src 內找到heritrix .properties並打開。 該文件是Heritrix 的配置文件,在“heritrix .cmdline.admin= ”後邊添加用戶和密碼,格式如:“admin:admin”,在登錄Heritrix 的管理界面時需要此用戶名和密碼。 在配置文件中還能夠指定Heritrix 管理界面的訪問端口,建議可爲8080端口。
錯誤1: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,如圖 1 所示。
解決方案:這是 JRE 的訪問限制導致報錯,在 MyHeritrix 工程上右鍵單擊選擇“Build PathConfigure Build Path …”,然後選擇 Library 選項卡,將“JRE System Library”刪除然後重新導入一下即可修復。或者選擇“WindowsPreferencesJavaCompilerErrors/Warnings”找到“Deprecated and restricted API”下的“Forbidden reference (access rules)”,將默認設置“Error”改爲“Warning”或“Ignore”
錯誤2:這個時候會報錯NullPointerException 的錯誤:這個錯誤的原因是缺少了“tlds-alpha-by-domain.txt”文件,在 heritrix-1.14.4-src\src\resources\org\archive\util 下可以找到該文件,將其拷貝到org.archive.util包(MyHeritrix\src\org\archive\util) 中即可。
圖2. NullPointerException 錯誤
5、將Heritrix 源代碼文件夾下的src下的其他文件夾,即除conf 和Java兩個文件夾以外的所有文件夾,拖至Heritrix 項目工程下,
6、至此,Heritrix 已經可以運行起來了。 運行Heritrix ,選擇執行org.archive.crawler包下的heritrix.java文件,以Java application方式運行。然後Heritrix 會在控制檯輸出一段信息,最後是版本號,這就表示Heritrix 已經運行成功了。
7、啓動瀏覽器並在瀏覽器的地址欄中輸入http://localhost:8080 便可看到Heritrix 的登錄界面。用戶名和密碼處分別輸入在配置文件中,輸入的admin和admin,單擊“Login”按鈕後便能看到Heritrix 的控制檯界面。
到此,Heritrix安裝與配置完成。最好的參考教程:http://www.ibm.com/developerworks/cn/opensource/os-cn-heritrix/index.html?ca=drs-#major2 (很好的錯誤解決轉載 : http://hi.baidu.com/liuqiyuan/item/9127c1103a3a8a001894ecdf
錯誤 3:錯誤具體:
12:32:54.530 EVENT Starting Jetty/4.2.23
12:32:54.563 WARN!! Delete existing temp dir C:\Users\asus\AppData\Local\Temp\Jetty_127_0_0_1_8080__ for WebApplicationContext[/,jar:file:/F:/workspacetwo/Heritrixfive/webapps/admin.war!/]
12:32:54.566 WARN!! Failed to delete temp dir C:\Users\asus\AppData\Local\Temp\Jetty_127_0_0_1_8080__
12:32:54.585 WARN!! Can't reuse C:\Users\asus\AppData\Local\Temp\Jetty_127_0_0_1_8080__, using C:\Users\asus\AppData\Local\Temp\Jetty_127_0_0_1_8080___1930706384182235396
12:32:54.638 EVENT Started WebApplicationContext[/,Heritrix Console]
12:32:54.690 WARN!! Failed to start: [email protected]:8080
Exception in thread "main" org.mortbay.util.MultiException[java.net.BindException: Address already in use: JVM_Bind]
at org.mortbay.http.HttpServer.start(HttpServer.java:640)
at org.archive.crawler.SimpleHttpServer.startServer(SimpleHttpServer.java:279)
at org.archive.crawler.Heritrix.startEmbeddedWebserver(Heritrix.java:1236)
at org.archive.crawler.Heritrix.doCmdLineArgs(Heritrix.java:715)
at org.archive.crawler.Heritrix.main(Heritrix.java:556)
Heritrix version: 1.14.4
12:32:54.692 EVENT Stopped WebApplicationContext[/,Heritrix Console]
12:32:54.693 EVENT Stopped org.mortbay.http.NCSARequestLog@618d26
12:32:54.693 EVENT Stopped org.mortbay.jetty.Server@ae506e
它的意思是端口占用了,重新啓動下myeclipse就行了
二 、heritrix的使用教程
學習研究heritrix已經有了一段時間了,想寫一些博文,一來是方便以後自己查閱,二來和廣大博友們分享交流,提高認識。
本系列文章所用環境:heritrix1.14.4 + myeclipse10
heritrix1.14.4源碼包下載:http://download.csdn.net/detail/kath_y/5788787
一、在myeclipse中安裝配置heritrix
1、新建空的java項目(注意不是WEB項目),命名爲Heritrix;
2、把heritrix-1.14.4-src\src\java\目錄下的org、st和com文件夾拷貝到Heritrix/src目錄下;
3、把heritrix-1.14.4\src下的wbapps文件夾拷貝到heritrix目錄下;
4、右擊heritrix項目,點擊properties ,通過JavaBuildPath,將heritrix-1.14.4-src下的lib目錄下的所有包導入進來;(此時工程目錄下會自動生成一個Referenced Libraries)
5、解壓縮heritrix-1.14.4目錄下的heritrix-1.14.4.jar文件,把解壓後的所有文件和文件夾(除org、st、com文件夾和heritrix.properties文件外)拷貝到heritrix目錄下;
6、將heritrix-1.14.4目錄下的conf文件夾拷貝到heritrix目錄下;並將heritrix目錄下的profiles、modules、selftest文件夾移入conf文件夾中;
7、打開eclipse下的heritrix/conf/heritrix.properties文件,找到"heritrix.cmdline.admin=",修改爲“heritrix.cmdline.admin = admin:admin”;(admin:admin對應登錄時的用戶名:密碼,可以根據自己喜好修改)
8、Conf/jmxremote.password.template拷貝到heritrix目錄下。改名爲:jmxremote.password,最後再行改成:
monitorRole admin
controlRole admin
9、找到org.archive.crawler包,運行Heritrix.java中的main函數。
可能會出現的異常:
1、在Heritrix.java中出現File URLConnection 紅叉;
解決辦法:依次點擊Window->java->Compiler->Errors/Warnings,將Forbidden reference(access rules)的選項從Error改爲Warning,點擊Apply,點擊OK。
2、出現的異常:......thread-10org.archive.util.ArchiveUtils.<linit>( )TLD list....
解決辦法:將\heritrix-1.14.4-src\heritrix-1.14.4\src\resources\org\archive\util 下的文本文檔拷貝到heritrix中的src\org\archive\util下;
最終運行Heritrix.java的正確結果如下:
二、登錄並創建一個簡單的JOB
1、打開瀏覽器,輸入http://localhost:8080,進入heritrix的登錄頁面
2、點擊Login按鈕後進入heritrix的控制檯界面
①左邊紅色方框裏介紹的是當前heritrix的一些信息。
②右邊藍色框內顯示了當前Java虛擬機的一些狀態,如上圖所示,可以看到當前的堆大小爲4184KB,而已經被使用了3806KB,另外,最大的堆內容可以達到65088KB,也就是在64M左右。在正式抓取的時候,64M的最大內存是不夠用的,一般至少設置爲512M。設置過程如下:右鍵點擊Heritrix->Run As->Run Configurations,進入該頁面,選擇Arguments項,在VM arguments:框下輸入:-Xmx512m,點擊Apply。
重新啓動heritrix,登錄後可以看到最大內存已經改到了520256 KB,即512M。
3、創建一個Job
1)點擊控制檯頁面的Jobs按鈕,進入如下界面
在創建頁面有四種創建方式,含義如下:
①Based on existing job:以一個已經有的抓取任務爲模板,創建所有抓取屬性和抓取起始URL的列表。
②Based on a recovery:在以前的某個任務中,可能設置過一些狀態點,新的任務將從這個設置的狀態點開始。
③Based on a profile:專門爲不同的任務設置了一些模板,新建的任務將按照模板來生成。
③With defaults:這個最簡單,表示按默認的配置來生成一個任務。
(2)、點擊選擇最簡單的With Defaults方式,創建一個新的任務
在Heritrix中,一個任務對應一個描述文件。這個描述文件的默認的名稱爲order.xml。每次創建一個新任務時,都相當於生成了一個order.xml的文件。文件中詳細記錄了Heritrix在運行時需要的所有信息。例如,它包括該用戶所選擇的Processor類、Frontier類、Fetcher類、抓取時線程的最大數量、連接超時的最大等待時間等信息。上面所說的4種創建抓取任務的方式,其實都是在生成一個order.xml文件。其中,第4種With defaults,則是直接拷貝默認的order.xml文件。在所創建的Eclipse工程或是命令行啓動的Heritrix下載包中,該默認的order.xml文件均是放於profiles\default目錄下的。
關於order.xml的細節,在此還不必深究。接下的學習中會做介紹。
在新建任務的名稱上,填入“sina_blog”,表示該抓取任務將抓取新浪博客的信息。在Description中隨意填入字符,然後再在seeds框中,填入新浪博客首頁地址。
這裏需要解釋一下seeds的含義。所謂seeds,其實指的是抓取任務的起始點。每次的抓取,總是需要從一個起始點開始,在得到這個起始點網頁上的信息後,分析出新的地址加入抓取隊列中,然後循環抓取,重複這樣的過程,直到所有鏈接都分析完畢。在新建任務的過程是可以填多個Seeds作爲起點的,以上只作爲一個示例,所以只填了新浪博客的首頁地址
(3)、設置抓取時的處理鏈
在上圖的下邊有一排按鈕:Modules Submodulers Settings Overrides Submit job,點擊Modules按鈕,進入處理鏈設置頁面。
此時頁面並沒有做配置的Add/Change按鈕及相應的下拉菜單,我們需要在myeclipse中將modules的上一級目錄放到項目的classpath中,過程如下:
右鍵Heritrix->Run As->Run configuratins.....->classpath->user Entries->Advanced->Add External Folder,找到modules的上一級目錄conf加入即可。
重新啓動Heritrix項目,登錄並和之前一樣創建job,到Modules頁面可以看到,頁面如下:
此時,頁面中出現了Add/Change的配置按鈕。
從上而下,可以看到,需要配置的內容共有7項,其中CrawlScope和Frontier是兩個最重要的組件。
①CrawlScope用於配置當前應該在什麼範圍內抓取網頁鏈接。比如,如果選擇BroadScope,則表示當前抓取的範圍不受限制,但如果選擇了HostScope,則表示抓取的範圍在當前的Host內。我們選擇BroadScope。
②Frontier則是一個URL的處理器,它將決定下一個被處理的URL是什麼。同時,它還會將經由處理器鏈所解析出來的URL加入到等待處理的隊列中去。我們使用BdbFrontier類來做爲處理器(其實Heritrix也只有這一個可用的Frontier),全權掌管URL的分配。
除了以上兩個組件外,還有5個隊列要配。這五個隊列根據先後的順序,就依次組成了Heritrix的整個處理器鏈。5個隊列的含義分別如下:
Ⅰ、PreProcessor:這個隊列中,所有的處理器都是用來對抓取時的一些先決條件做判斷的。比如判斷robot.txt的信息等,它是整個處理器鏈的入口。
Ⅱ、Fetcher:從名稱上看,它用於解析網絡傳輸協議,比如解析DNS、HTTP或FTP等。這裏我們主要使用FetchDNS和FetchHTTP兩個類。
Ⅲ、Extractor:它的名字就很好的揭示了它的作用。它主要用是於解析當前獲取到的服務器返回內容,這些內容通常是以字符串形式緩存的。在這個隊列中,包括了一系列的工具,如解析HTML、CSS等。在解析完畢,取出頁面中的URL後,將它們放入隊列中,等待下次繼續抓取。在演示中,使用兩種Extractor,即ExtractorHTTP和ExtractorHTML。
Ⅳ、Writer:主要是用於將所抓取到的信息寫入磁盤。通常寫入磁盤時有兩種形式,一種是採用壓縮的方式寫入,在這裏被稱爲Arc方式,另一種則採用鏡象方式寫入。當然處理起來,鏡象方式要更爲容易一些,因此,我們命名用鏡象Mirror方式。
Ⅴ 、PostProcessor:在整個抓取解析過程結束後,進行一些掃尾的工作,比如將前面Extractor解析出來的URL有條件的加入到待處理隊列中去。
值得一提的是,在處理器鏈的設置過程中,每一個隊列中的處理器都是要分先後順序的,信息的處理流程實際上是不可逆的,因此,在設置時,可以看見在隊列的右側總是有“Up”、“Down”和“Remove”這樣的操作,以幫助能夠正確的設置其順序。
在設置完Hertrix所需的處理鏈後,仍然還不能夠馬上開始抓取任務,還需對默認的運行時參數做一些修改,以適應真正的需要。
(4)、設置運行時的參數
在設置完處理鏈後,在頁面頂部或底部都可以找到如下圖所示的菜單項,單擊“Settings”鏈接,就進入了屬性設置的頁面。
如下圖在屬性設置頁面上有非常多的輸入域,Heritrix在抓取網頁時,這些域是用來對的各個組件的值進行預設。
由於頁面上的內容非常多,使用者可能無法全部瞭解它們的作用。所以Heritrix提供了一個輔助功能,來在最大程度上讓使用者瞭解每個參數的含義。
可以看到,在每個屬性的右側都有一個小問號,當單擊問號時,就會彈出一個Javascript的Alert提示框,上面介紹了當前屬性的作用。例如,在上圖中單擊“max-toe-threads”屬性,通過Alert的提示可以知道,它表示的是同時處理URIS的線程的最大數目。默認是100,我們設置爲50。
當在第一次使用Heritrix時,所需要設置的參數並不多,以默認設置爲主。以下就來介紹一些必須要在第一次使用時就要配置好的參數。
①max-toes-threads
該參數的含義很容易瞭解,它表示Heritrix在運行該抓取任務時,爲任務分配多少個線程進行同步抓取。該參數的默認值爲100,而事實上根據筆者的經驗,在機器配置和網絡均很好的情況下,設置50個線程數就已經足夠使用了。
② HTTP-Header
在HTTP-Header這個屬性域下面,包括兩個屬性值“user-agent”和“from”。默認情況下,這兩個屬性的值如下圖
很明顯,這樣的值是無法完成真實的HTTP協議的模擬的,所以,必須要將值改掉。可以參照下圖:
其實只需要最後的URL和聯繫郵箱格式正確就可以了,可以隨便設置。
(5)、完成Job的創建
在完成上述的設置之後,任務就創建成成功了,點擊下圖"Submit job"按鈕提交任務。
提交任務後,會跳轉到如下頁面,表示任務創建成功。
從圖中看到,有一個Pending Jobs,也就是我們之前創建的任務sina_blog。接下來,我們就去啓動我們的任務,開始抓取網頁。
三、啓動Job,抓取網頁
1、點擊“Console”按鈕回到Console界面,可以看到剛剛創建的任務已經啓動了,等待我們開始它
點擊"Start"按鈕,“Pending”狀態的抓取任務激活,開始抓取網頁。
2、分析抓取頁面的一些信息。
當我們點擊"Start"開始抓取網頁後,控制檯界面如下:
界面中Rates框中顯示的是抓取的速度。Mermory框中反應的是java虛擬機的內存狀態。Load框中顯示的是抓取的線程數以及隊列的負載以及一些其他信息。Totals框中則是已經處理的鏈接數和總共分析出的鏈接數的比值,但這個值往往不是準確的,因爲當頁面在不斷被抓取分析時,鏈接的數量也會不斷的增加,因此,這個百分比的數字也在不斷的變化。如圖所示:此時總共抓取到的鏈接數已經達到了78560個,處理了2712個,它的百分比數量爲3%。
到這裏,已經把Heritrix成功的運行起來,並且抓取了一定的內容。接下來,看一下heritrix是如何存儲抓取下來的內容的。
四、Heritrix的鏡像存儲結構
由於在前面設置了Writer的類型爲MirrorWriter。因此,磁盤上應該留有了所抓取到的網頁的各種鏡象。那麼,究竟Heritrix是如何存儲下鏡象信息的呢?打開Eclipse的workspace目錄,進入heritrixProject的工程,裏面有一個jobs目錄。進入後,找到以剛纔job的名稱打頭的文件夾,這裏面的內容,就是Heritrix在運行時實時生成的。其中,有一個mirror目錄,進入後,如下圖所示:
其實所謂鏡象方式存儲,就是將URL地址按“/”進行切分,進而按切分出來的層次存儲,比如一個URL地址爲:http://blog.sina.com.cn/index.html
那麼它在mirror目錄中的保存位置就該是blog.sina.com.cn目錄下的index.html文件。
五、停止抓取任務
當用戶進行某個抓取任務時,有兩種方法會讓任務停止下來。
1.正常終止
第一種方法當然就是任務的自然結束,其條件爲所有隊列中的URI都已經被處理過了。此時,任務將自然終止。在“Jobs”面版上會看到任務已經完成,被加入到“Completed jobs”列表中。
2.強行終止
當然,任務不可能總是運行完,這可能是因爲對任務的控制不夠,結果抓取了太多不相關的信息,進而造成URL隊列無限制膨脹,無法終止。在這種情況下,就需要強行將任務終止。在Console面版上有如下圖所示的一排鏈接,最後一個“Terminate”鏈接,就是用來終止當前運行的任務。
單擊“Terminate”鏈接後,當前在運行的抓取任務就會立即終止,並同樣將任務放置到“Jobs”面版上的“Completed jobs”列表中,只不過在“status”上,它會顯示“Finished - Ended by operator”這樣的提示。
當然,如果用戶希望關閉Heritrix,並終止所有正在運行的任務,也可以單擊Console面版上的“Shutdown Heritrix software”的鏈接,此時,Heritrix會彈出一個警告,告訴你如果關閉Heritrix,則當前一切正在運行的任務都將被終止。如下圖所示。
如果選擇“I’m sure, shut it down”,則Heritrix的WebUI將會終止,虛擬機進程結束。
六、接下來的目標
關於heritrix的配置及初次使用,就寫到這裏了,接下來將進行heritrix的部分源碼分析及擴展,改造成自己想要的爬蟲。歡迎各位博友們拍磚交流,指點接下來的研究線路!