上次用的java相關知識實現了一個簡單的網絡爬蟲,如今存在許多開源免費的爬蟲工具,相對來講,能夠很簡單的獲取網頁數據,並寫入到本地。java
下面我就闡述一下我用Heritrix爬蟲工具實現網頁數據爬取。瀏覽器
------>服務器
目錄網絡
一、Heritrix文件配置ide
二、Heritrix服務器job配置工具
三、如何建立job並執行oop
四、有選擇的爬取網頁post
五、總結測試
----->大數據
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進行分析。
這樣就至關於一個初步的大數據數據採集了。