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&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. - :: 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,转载请注明出处!
nutch 抓取需要登录的网页的更多相关文章
- Nutch抓取流程
nutch抓取流程注入起始url(inject).生成爬取列表(generate).爬取(fetch).解析网页内容(parse).更新url数据库(updatedb)1:注入起始url(inject ...
- Fiddler: 如何抓取HTTPS协议的网页
作者:韦玮 转载请注明出处 Fiddler默认只能抓取HTTP协议的网页,不能抓取HTTPS协议的网页,而我们很多时候,都需要抓HTTPS协议的网页,比如抓淘宝数据等.今天,韦玮老师会为大家讲解如何 ...
- Fiddler如何抓取HTTPS协议的网页
Fiddler默认只能抓取HTTP协议的网页,不能抓取HTTPS协议的网页,而我们很多时候,都需要抓HTTPS协议的网页,比如抓淘宝数据等.今天,韦玮老师会为大家讲解如何使用Fiddler抓取HTTP ...
- 如何让Python爬虫一天抓取100万张网页
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 王平 源自:猿人学Python PS:如有需要Python学习资料的 ...
- java抓取动态生成的网页
最近在做项目的时候有一个需求:从网页面抓取数据,要求是首先抓取整个网页的html源码(后期更新要使用到).刚开始一看这个简单,然后就稀里哗啦的敲起了代码(在这之前使用过Hadoop平台的分布式爬虫框架 ...
- C# asp.net 抓取需要登录的网页内容 抓取asp.net登录验证的网站
private void btnASPNET_Click(object sender, EventArgs e) { Dictionary<string, s ...
- 网页抓取:PHP实现网页爬虫方式小结
来源:http://www.ido321.com/1158.html 抓取某一个网页中的内容,需要对DOM树进行解析,找到指定节点后,再抓取我们需要的内容,过程有点繁琐.LZ总结了几种常用的.易于实现 ...
- python3下scrapy爬虫(第二卷:初步抓取网页内容之直接抓取网页)
上一卷中介绍了安装过程,现在我们开始使用这个神奇的框架 跟很多博主一样我也先选择一个非常好爬取的网站作为最初案例,那么我先用屌丝必备网站http://www.shaimn.com/xinggan/作为 ...
- [转]抓取当前登录用户登录密码的工具:mimipenguin
Github项目地址 前有Mimikatz,今有mimipenguin,近日国外安全研究员huntergregal发布了工具mimipenguin,一款Linux下的密码抓取神器,可以说弥补了Linu ...
随机推荐
- 跨平台sdk接入总结
sdk说明: 1.Bugly SDK:自动捕获上报App的脚本错误和原生代码引发的崩溃信息,并提供异常问题分类分析. 2.语音 SDK:提供游戏内收发语音功能. 接入步骤: step1:仔细通读一遍s ...
- mybatis主键返回的实现
向数据库中插入数据时,大多数情况都会使用自增列或者UUID做为主键.主键的值都是插入之前无法知道的,但很多情况下我们在插入数据后需要使用刚刚插入数据的主键,比如向两张关联表A.B中插入数据(A的主键是 ...
- 会话技术: Cookie 和 Session
会话技术 会话技术:从浏览器开始访问服务器,到关闭浏览器,这期间发生了许多次请求和响应,这个过程就叫做一次会话. Cookie 和 Session 都是处理会话技术的两种具体实现,Cookie将数据保 ...
- HDU3046 最大流(最小割)
Pleasant sheep and big big wolf Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ( ...
- Android数据过滤器:Filter
类图: 通常可以将SearchView和ListView结合,实现数据的搜索和过滤. 1.监听SearchView,SearchView.setOnQueryTextListener(OnQueryT ...
- MySql 利用函数 查询所有子节点
前提:mysql 函数 find_in_set(str,strlist), cast(value as type) 一.find_in_set(str,strlist):如果字符串str是在的 ...
- Data Mining的十种分析方法——摘自《市场研究网络版》谢邦昌教授
Data Mining的十种分析方法: 记忆基础推理法(Memory-Based Reasoning:MBR) 记忆基础推理法最主要的概念是用已知的案例(case)来预测未来案例的一些属 ...
- MQTT协议-MQTT协议简介及协议原理
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建 ...
- Java中哈希表(Hashtable)是如何实现的
Java中哈希表(Hashtable)是如何实现的 Hashtable中有一个内部类Entry,用来保存单元数据,我们用来构建哈希表的每一个数据是Entry的一个实例.假设我们保存下面一组数据,第一列 ...
- java springmvc4 图片或文件上传
1.文件配置 配置文件解析 上传文件处理的核心方法 // uploadOneFile.jsp, uploadMultiFile.jsp submit to. @RequestMapping(value ...