題記:一步一坑,且行且珍惜
最近接到任務,要利用nutch去抓取公司內部系統的文章,可是需要登錄才能抓到。對于一個做.net,不熟悉java,不知道hadoop,很少接觸linux的我,這個過程真是艱難且痛苦的,盲人摸象搬的折騰出來了,但是我對hadoop還是沒了解。這個東西在網上真的很難查到,我也是自己試驗,網上零碎的片段拼起來的。有些在網上可以隨便找打的,我就不詳細說明了,我只說明網上不好查到的內容。
本文是在假設你已經會簡單使用nutch的條件下寫的,如果需要基礎配置,網上還是有較多的。
環境和軟件(linux+ant+nutch)
step1:nutch 不支持表單登錄,這個必須要對其進行二次開發??墒窃趺淳幾g是個很大的問題。我在網上看到別人寫的windows+eclipse+cygwin,我自己配置了半天,但是還是沒搞出來,算了,還是用linux吧,誰叫nutch就是用linux,hadoop的呢。
step2:去官網下載nutch-1.6-src,注意不是bin了,因為我們是要改代碼的?,F在nutch-2.1也出來了,但是我來之前就是用的1.6,沒辦法,接著做吧。
step3: 去官網下載ant,找個最新版本下載就可以了。這個是用來編譯nutch的。我的版本是apache-ant-1.9.4-bin.tar.gz,但是ant版本并無太大影響。
step4:為ant配置環境變量,這個方法在網上有很多講解,不細說了。
二次開發nutch
怎么進行開發呢?由于我用eclipse沒有讓nutch跑起來,也不會編譯,所以我采用最原始的辦法,去改單個java文件,用ant去編譯。
step1:怎么實現登錄
用了一個簡單粗暴的辦法,在每次進行http請求時檢查cookie jar 里面存不存在cookie,不存在就讀取nutch.site.xml里面我們配置的登錄鏈接,然后把cookie存進去,不管你抓取哪個網頁,不管你用沒用到,反正cookie就在了。
參考地址:https://issues.apache.org/jira/browse/NUTCH-827
step2:補丁下載地址
http-client-form-authtication.patch 網盤下載地址:http://pan.baidu.com/s/1sjuek0l
nutch-http-cookies.patch 網盤下載地址:http://pan.baidu.com/s/1pJ3BDO3
step3:補丁使用方法
拿到補丁文件,感到欣喜萬分,可是怎么用啊,完全不會啊。我把補丁文件研究了一下,發現了規律。除了httpBase在lib-http這個插件里面,我們其他的PRotocol-httpclient里面,按照補丁里面的++就是添加,--就是刪除,根據上下文推出位置,新增代碼或者新增類即可。注意每個版本代碼已經有變化,但是找到自己決定合適的地方,總可以找到的。我用最原始的的辦法,手動去修改了httpBase類和http類,按照補丁新增了幾個類,這一步一定要細心,別copy錯了。
+++ src/plugin/lib-http/src/java/org/apache/nutch/protocol/http/api/HttpBase.java (working copy)
+++ src/plugin/protocol-httpclient/src/java/org/apache/nutch/protocol/httpclient/Http.java (working copy)
step4:怎么配置登錄頁面的地址
在nutch-site.xml里面添加登錄信息即可,注意雖然上面的文章,補丁上都是nutch-default.xml,但是根據nutch xml順序,加在nutch-site.xml即可.
找到登錄頁面表單里的用戶名,密碼等,模擬登錄。
注意:xml存在轉義 不能直接寫& 要用&;來代替
<property> <name>http.cookie.login.page</name> <value>www.xxx.com/login?id=xxx&pas=xxx</value> <description>URL of the login page to derive the cookies from. Cookies will be stored upon initialization and re-initialized upon expiration. Any URL request attributes will be sent to POSTed to the page. NOTE: This currently only works for protocol-httpclient.</description></property>
ant 編譯nutch
在nutch-1.6目錄下運行 ant就可以直接進行編譯,但是有一些問題需要注意。
問題一:jsoup.jar不存在
由于我們修改的文件用引入了這個包,所以我們需要在工程中引入這個包,要修改ivysetting.xml和plugin.xml,具體方法谷歌(add third part dependency to you nutch plugin),我的搜索不了,以后再更新。
問題二:運行到此處沒反應的,需要等待幾分鐘
resolve-default:[ivy:resolve] :: Ivy 2.2.0 - 20100923230623 :: http://ant.apache.org/ivy/ ::[ivy:resolve] :: loading settings :: file = /home/shaozt/softIns/CrawSource/apache-nutch-2.1/ivy/ivysettings.xml
問題三:connection time out
此問題的原因是http://repo1.maven.org/maven2/不存在,解決方案是尋找能使用的資源庫URL。經過測試http://mirrors.ibiblio.org/maven2/在瀏覽器下可以正常訪問,用此URL替換/ivy目錄下ivysettings.xml中的http://repo1.maven.org/maven2/,可以正常下載所依賴的jar包,編譯成功。
問題四:是否需要代理
如果你使用的是代理,而問題三改后任然timeout ,需要為ant配置代理,格式如下。網上的什么set感覺沒有用。
export ANT_OPTS="-Dhttp.proxyHost=XXX -Dhttp.proxyPort=XX"http://如果需要用戶名和密碼,需要后面添加export ANT_OPTS="-Dhttp.proxyHost=代理服務器地址 -Dhttp.proxyPort=代理服務器端口 -Dhttp.proxyUserName=用戶名 -Dhttp.proxyPassWord=密碼"
nutch使用注意:二次開發的是protocol-httpclient,在nutch-site.xml 把protocol-http 插件換成protocol-httpclient
最重要的幾點我都已經說明了,我相信會對需要的人有很大的幫助。不過這個插件二次開發還是不太完善,補丁包里面也有很多不用的代碼,但是至少功能實現了。后面還面臨更大的挑戰,主頁可不可以不要全部用js生成,還讓人怎么活??!
(原創)博客園 輕狂書生http://www.49028c.com/xiaoshuai1992/p/nutchlogin.html,轉載請注明出處!
新聞熱點
疑難解答