上次用的java相關知識實現了一個簡單的網絡爬蟲,現在存在許多開源免費的爬蟲工具,相對來說,可以很簡單的獲取網頁數據,並寫入到本地。
下面我就闡述一下我用Heritrix爬蟲工具實現網頁數據爬取。
------>
目錄
1、Heritrix文件配置
2、Heritrix服務器job配置
3、如何創建job並執行
4、有選擇的爬取網頁
5、總結
----->
1‘ 基礎文件配置
網上下載heritrix的壓縮包,即可配置一個爬蟲服務器,其核心使用的是Tomcat。
解壓壓縮包,將conf目錄下的文件拷貝到根目錄下。
修改根目錄下此文件,將.template去掉。
然后用記事本(我用的UItraEdit工具,方便看配置文件和代碼)將文件打開,將@PASSWORD@的內容,更改為你的用戶名和密碼(自定義)。
將imxremote.password的文件變為只讀(屬性)。
注意:【!!!如果是win7系統,需要將此文件的所有者改為當前用戶,如圖。
點擊“高級”,
點擊“編輯”
此處選擇當前的用戶,再點擊”應用“,即可。
!!!】
2’ 服務器Job配置
執行bin目錄下的heritrix.cmd命令,用來啟動這個服務器(必須在命令行下執行)。
示例:首先進入該文件的bin目錄下,啟動命令為:
heritrix.cmd --admin=user:password
啟動如果成功,顯示窗口:
啟動成功之后,通過瀏覽器訪問當前服務器的8080端口來准備進行數據采集。
即輸入 localhost:8080/
進入之后首先輸入你剛開始配置時設定的用戶名和密碼。
然后進入首頁:
此窗口可以看到一些選項,有三個選項是比較重要的:
1) Console:控制台,在這里可以監控當前的任務爬取狀態
2) Jobs:可以在這里建立新的爬取任務
3) Profiles:配置爬取的屬性,例如:爬取的總線程數
首先需要在profiles中自己建立一個自定義的爬取的屬性配置。在Profiles選項內選擇New Profile based on it
進入界面:
點擊Modules,
這里需要設置爬取時的參數類。
例如:爬取的范圍,下載后的保存類型,爬取時所要下載的文件類型等。
首先要注意一點,兩個change必須要點一下,我當時就是忽略了這個導致job無法提交!!!
之后,你需要在此界面下面設置10個類,按我的圖來(規則我就不解釋了):
之后,選擇Settings進行一些其他屬性的配置,此處要更改一個線程數,(這個看你的電腦配置咯),之后再http-headers里面需要填寫你的工具版本,ip地址以及個人郵箱(這個主要是告訴網站管理者哪個帥鍋在爬我的網頁,當然,勸告一下,國外和國內一些大型的網站不要爬取,很容易被監測到也可能觸犯到信息竊取):
之后,點擊Finished會提示Profile modified,表示修改成功。
3’ 建立爬取任務並執行
在Jobs選項里,選擇Based on a profile選項,然后選擇剛剛配置的那個myprofile,在此處選擇你需要爬取的網站,我選擇的是新浪新聞的首頁:
然后點擊submit job,如果兩個箭頭都顯示才表示創建job成功,相反我有一個配置類的沒有點擊change下面一個箭頭就會提示初始化錯誤!
此時你進入console點擊Start就會開始執行任務:
如果你要結束或者暫停任務,點擊Terminate。
此時線程在不斷爬取數據,你不斷的點擊Refresh會發現在不斷更新數據,然后爬取的文件會在heritrix的根目錄jobs里面找到,所有數據存放位置在如下路徑的mirror文件夾內:
到此刻,網絡爬取結束,如上就是這個工具的使用方法。
4‘ 如何有選擇的爬取網頁
測試時會發現,爬取的內容太雜,不一定都是我們想要的,因此我們需要對這個工具的源代碼進行一些簡單的調整。
首先要將heritrix的jar包備份解壓;
然后需要將heritrix-1.12.1.jar文件拷貝到一個項目里,基於這個文件來進行配置。
1 package org.liky.utils; 2 3 import org.archive.crawler.datamodel.CandidateURI; 4 import org.archive.crawler.postprocessor.FrontierScheduler; 5 6 public class SinaNewsScheduler extends FrontierScheduler { 7 8 public SinaNewsScheduler(String name) { 9 super(name); 10 } 11 12 @Override 13 public void schedule(CandidateURI caUri) { 14 // 根據路徑,判斷該url是否有必要抓取。 15 // 這里我們要求路徑必須包含, news.sina.com.cn 16 if (caUri.toString().contains("news.sina.com.cn")) { 17 // 允許爬取 18 super.schedule(caUri); 19 } 20 } 21 }
自己編寫好這個工具類。
編寫好以后,需要將這個類打包到jar包里。(使用class文件)
之后,修改modules下的Processor.options文件。
將以下內容加入到這個文件中。
org.liky.utils.SinaNewsScheduler|SinaNewsScheduler |
前半部分是包.類名,后半部分就是類名,中間用 | 分隔。 |
然后使用jar命令將包打到一起。
將jar包替換掉原有的包(可以把原有的做個備份留下,防止打包有問題無法恢復)。
重新啟動heritrix,然后修改Profile的配置。
此時,再次爬取新浪新聞的時候,只會提取鏈接含有指定字符串的網址,排除很多無關的鏈接。
總結:
相對來說,Heritrix工具來爬取網頁數據是相當簡單的,無需寫代碼就可以進行大量的數據收集。
但是,與我上一篇博客《java實現網絡爬蟲》還是有些許不同:
首先在自由度上,手寫的代碼可以確認爬取的深度、排除無需爬取的網頁、提取有用的數據;
其次在內容上很繁雜,很多無效的數據也收集了,而且爬取的網頁會越來越多(當然,有一種修改配置的方法,寫一個java代碼限制爬取的網頁,然后將該class文件放入heritrix的jar包(上述第四個標題)),關於修改源代碼我相信很多新手都會望而止步,而且多寫java代碼來實現網絡爬蟲,益處多多;
最后在下一步數據分析上,可能多一點麻煩,誰會樂意整理一堆繁雜紛亂的數據呢?
至此,我還是傾向於java代碼實現網絡爬蟲,而且可以很方便的將數據收集到hadoop中,進行大數據的mapreduce進行分析。
這樣就相當於一個初步的大數據數據采集了。