nutch 抓取需要登录的网页

  题记:一步一坑,且行且珍惜

  最近接到任务,要利用nutch去抓取公司内部系统的文章,可是需要登录才能抓到。对于一个做.net,不熟悉java,不知道hadoop,很少接触linux的我,这个过程真是艰难且痛苦的,盲人摸象搬的折腾出来了,但是我对hadoop还是没了解。这个东西在网上真的很难查到,我也是自己试验,网上零碎的片段拼起来的。有些在网上可以随便找打的,我就不详细说明了,我只说明网上不好查到的内容。

   本文是在假设你已经会简单使用nutch的条件下写的,如果需要基础配置,网上还是有较多的。

环境和软件(linux+ant+nutch)

  

  step1:nutch 不支持表单登录,这个必须要对其进行二次开发。可是怎么编译是个很大的问题。我在网上看到别人写的windows+eclipse+cygwin,我自己配置了半天,但是还是没搞出来,算了,还是用linux吧,谁叫nutch就是用linux,hadoop的呢。

  step2:去官网下载nutch-1.6-src,注意不是bin了,因为我们是要改代码的。现在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&amp;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"

//如果需要用户名和密码,需要后面添加
export ANT_OPTS="-Dhttp.proxyHost=代理服务器地址 -Dhttp.proxyPort=代理服务器端口 -Dhttp.proxyUserName=用户名 -Dhttp.proxyPassword=密码"

nutch使用注意:二次开发的是protocol-httpclient,在nutch-site.xml 把protocol-http 插件换成protocol-httpclient

最重要的几点我都已经说明了,我相信会对需要的人有很大的帮助。不过这个插件二次开发还是不太完善,补丁包里面也有很多不用的代码,但是至少功能实现了。后面还面临更大的挑战,主页可不可以不要全部用js生成,还让人怎么活啊!

 (原创)博客园 轻狂书生http://www.cnblogs.com/xiaoshuai1992/p/nutchlogin.html,转载请注明出处!

原文地址:https://www.cnblogs.com/xiaoshuai1992/p/nutchlogin.html