nutch2二次开发笔记
来源:互联网 发布:数据库基础知识总结 编辑:程序博客网 时间:2024/06/18 17:18
1.Nutch介绍
Nutch 是一个开源Java 实现的爬虫框架和搜索引擎。支持分布式处理,有两个主版本1.x和2.x,它们的主要区别是1.x版本底层存储使用的是HDFS,2.x引入了Gora作为存储抽象层,从而支持各种NoSQL数据库,如HBase,Cassandra等,另外也支持mysql
2.Nutch安装问题
具体的安装步骤可以参考http://blog.csdn.net/lzjzy520/article/details/41596893,这里仅补充自身遇到的几个问题.
一.2.3.1版本ant编译时候, 会卡在 loading settings :: file = /usr/java/apache-nutch-2.3.1/ivy/ivysettings.xml,等待很久没反应, 因此选择了安装2.2.1版本
二.ant编译过程较久,我第一次编译成功花了40多分钟,所以得耐心等待
三.我是在不修改maven仓库地址的情况下编译成功,仓库地址修改为http://mirrors.ibiblio.org/maven2/或者http://maven.oschina.net/content/groups/public/时编译失败,如果jar包下载不了,可以试试来回切换仓库地址或者使用阿里云的maven仓库地址
四.在linux环境下安装,nutch版本使用2.2.1,solr版本使用4.4.0,hbase版本使用0.90.4
3.Nutch的二次开发
一.添加cookie抓取需要登录的网站
首先,将nutch源码导入到eclipse. nutch安装目录下列称为NUTCH_HOME,另外,以尽量少改动源码和写自定义插件的前提下开发
NUTCH_HOME/runtime/local/conf/nutch-site.xml文件,添加
<property> <name>plugin.includes</name> <value>protocol-http|protocol-httpclient|urlfilter-regex|parse-(html|tika|metatags)|filter-xpath|index-(basic|metadata|anchor|more)|scoring-opic|urlnormalizer-(pass|regex|basic)|language-identifier</value> <description>Regular expression naming plugin directory names to include. Any plugin not matching this expression is excluded. In any case you need at least include the nutch-extensionpoints plugin. By default Nutch includes crawling just HTML and plain text via HTTP, and basic indexing and search plugins. In order to use HTTPS please enable protocol-httpclient, but be aware of possible intermittent problems with the underlying commons-httpclient library. </description></property>可以将cookie信息也放在这个文件中,如添加
<property><name>cookie.value</name><value>BAIDUID=24B253A73C44B95F9D0A876F23FCAAAA:FG=1;BDSVRTM=0</value></property>接下来,修改源码src/plugin/protocol-httpclient/src/java/Http.java,
在setConf()方法添加cookieValue变量读取cookie值,在configureClient()方法给header添加Cookie
public void setConf(Configuration conf) { //其他代码略.....cookieValue = conf.get("cookie.value", "");//其他代码略.... }
private void configureClient() { //.... headers.add(new Header("Cookie", cookieValue)); //.... }
二.如果要抓取的页面有分页,但是页码的跳转是用js方法
nutch会收集当前页面的url,那么如何将我们自己要想的url添加进去呢?
首先解析要抓取页面,一共有多少分页.可以找到这个类src/plugin/parse-html/src/java/HtmlParser.java
getParse(String url, WebPage page)方法中,
utils.getText(sb, root); // extract text text = sb.toString(); //这里的text就是页面的文本内容我们可以看到在DOMContentUtils.getTextHelper()方法遍历了dom节点,通过使用DOM方法获取到总页数,然后可以组装好
url,在NUTCH_HOME/runtime/local/urls/目录下生产存放url地址的文件. 就是说,让nutch在下一次抓取时候,去访问你这次的url.
另外,也可以在HtmlParser.java的sniffCharacterEncoding(ByteBuffer content) 方法,str变量是整个页面的html代码,可以用 jsoup进行解析.
如果不想将url保存到文件中,还有一个思路就是将url更新到crawldb中,看下HtmlParser类中如下的2行代码
utils.getOutlinks(baseTag!=null?baseTag:base, l, root); outlinks = l.toArray(new Outlink[l.size()]);我们可以添加自己的url到outlinks集合中.
三.不想深度抓取
默认情况下,nutch会保存抓取页面中的一些HTML标签href属性的url,下次执行命令时候就会抓取这些链接地址.有时候我们并不需要这些额外的数据.这种情况下HtmlParser类的outlinks变量就不需要处理了.
保存outlinks的代码在src/java/crawl/DbUpdateMapper的map方法
Map<Utf8, Utf8> outlinks = page.getOutlinks(); if (outlinks != null) { for (Entry<Utf8, Utf8> e : outlinks.entrySet()) { int depth=Integer.MAX_VALUE; Utf8 depthUtf8=page.getFromMarkers(DbUpdaterJob.DISTANCE); if (depthUtf8 != null) depth=Integer.parseInt(depthUtf8.toString()); scoreData.add(new ScoreDatum(0.0f, e.getKey().toString(), e.getValue().toString(), depth)); } }
四.eclipse运行源码问题
运行Crawler的main方法时候会报错. GeneratorReducer第100行, 代码如下:
batchId = newUtf8(conf.get(GeneratorJob.BATCH_ID));
这里的conf.get(GeneratorJob.BATCH_ID)为空报错.
解决方法,修改GeneratorJob中的public Map<String,Object> run(Map<String,Object> args) 方法。添加以下代码
// generate batchId int randomSeed = Math.abs(new Random().nextInt()); String batchId = (curTime / 1000) + "-" + randomSeed; getConf().set(BATCH_ID, batchId);同样的,SolrIndexerJob的第40行,String batchId = (String)args.get(Nutch.ARG_BATCH);因为也为空值而报错,这里
可以给batchId指定一个值.能达到运行源码正常就行,这时就可以DEBUG详细的查看nutch如何运行了.
五.小结
Nutch属于Apache的, 支持分布式处理,包含web爬虫和全文搜索功能,看起来美美的.
不过,用起来蛮复杂的,二次开发不够灵活也略显麻烦,抓取目标不特定,后期有变动的话,要修改的地方会很多.
如果nutch能满足你80%的需求,如果不考虑后期需求变动会有比较大的修改,看了源码后如果觉得自己可以hold住它,可以使用.
否则个人建议还是自己开发会简单些.
- nutch2二次开发笔记
- Nutch2 插件机制(用于二次开发)
- hadoop2.7.1 nutch2.3 二次开发windows环境
- Ubuntu12.04+Nutch2.2.1+MySQL 配置笔记
- SolidWorks二次开发学习笔记
- discuz二次开发笔记
- RTX二次开发笔记1
- RTX二次开发笔记2
- phpcms 二次开发笔记
- PHPCMS二次开发笔记一
- discuz!二次开发笔记
- 基于jeesite二次开发笔记
- 商城二次开发学习笔记---20140701
- Joomla3.2版本二次开发笔记
- Revit二次开发---入门小笔记
- 二次开发
- 二次开发
- 二次开发
- Kafka 消息偏移量的维护
- ACM暑假训练codeforces A. Arcade Game D. Frozen Rivers(康托展开式,spfa)
- n后问题————回溯法求解(递归与非递归)
- mysql replace into 遇上主键自增
- use python to sendmail
- nutch2二次开发笔记
- JAVA函数实现任意给定一组数, 找出任意数相加等于某数或者在一个范围
- 正则中出现多个贪婪模式
- 外观模式 | Facade Pattern
- 设计模式之单例模式
- QNX system architecture 11
- 关于HTTP协议,一篇就够了
- 剑指offer
- 微信小程序 从服务器获取数据(十四)