Nutch教程——准备篇 by 逼格DATA

来源:互联网 发布:手机淘宝链接复制在哪 编辑:程序博客网 时间:2024/06/16 19:11

实在是看不下去Nutch官方的坑爹教程了,总结一套看完能懂的Nutch教程,持续更新中。


开发环境和基础:

学习Nutch,必须满足以下几个条件,缺一不可:

1)Linux环境,实在是没办法就在Windows上装linux虚拟机。

2)熟悉Java。

3)有Hadoop基础,能够编写hadoop下map reduce程序。

4)能够看懂Linux Shell。


下面来解释以下为什么需要满足这些条件。Nutch是在hadoop上运行的,windows下跑hadoop有一定的问题。并且Nutch中流程的控制使用的是Linux Shell,在windows上实现也比较麻烦。如果看不懂Linux Shell,就看不懂Nutch的流程。Nutch被切分成几个流程,每个流程都由Map Reduce完成,如果没有Map Reduce编程的基础,就看不懂Nutch源码。


源码阅读:

千万不要拿Nutch源码作为爬虫入门的教程。在学习Nutch之前最好先找一个单机爬虫熟悉爬虫的流程和基础。如果连Http请求、网页信息抽取这些最基础的技术细节都搞不清楚,阅读Nutch源码是没有用的,虽然说Nutch的http请求、网页解析是通过插件来完成的,但是我可以告诉你,如果你对Nutch的工作流程不是非常了解,是写不了Nutch插件的,哪怕是最简单的插件,所以不要想通过阅读Nutch插件的方法,来学习怎么发送http请求这种基础。更重要的是,在阅读Nutch源码之前,一定要了解爬虫的流程。Nutch中每个流程的输入输出都存放在hadoop文件中,文件是SequenceFIle,直接无法正确阅读文件的内容,如果想通过观察SequenceFile来了解爬虫的流程,是比较困难的。JAVA开源的单机爬虫有很多种,和Nutch流程最相似的是WebCollector。WebCollector和Nutch一样,都是将完整广度遍历切分成一层一层的爬取(每一层对应树的一层),有相同的链接存储、更新机制,采用相同的线程池,可以通过阅读WebCollector的源码来作为学习Nutch的基础。


分布式:

写Nutch代码不需要分布式知识,用Map Reduce框架写代码,会自动完成代码的分布式运行。Nutch的所有流程都是用Map Reduce完成的,如果你没有Map Reduce的基础,Nutch的代码基本就和天书一样。在学习Nutch前,至少要能够自己编写hadoop官方教程中的WordCount的代码。

乱码?索引?:

相信很多用过Nutch的人都有疑问,按照官方教程爬取网站后,网页存在哪里了?的确看到产生了中间文件,但是为什么是乱码?这些乱码是因为给网页做了索引么?
如果你有这种疑问,应该去学习一下hadoop了。和上面说的一样,没有hadoop基础看不懂Nutch。Nutch默认会保存所有的网页,但是网页并不是按照网站结构存储的。在一轮爬取中,所有的网页都被放到一个叫content的文件夹中,文件夹中有若干个文件,这种文件叫SequenceFile,SequenceFile可以认为是存储JAVA中对象(一个或多个)的文件,网页源码被封装在一个Content类型的对象中(Content.java源码),Nutch就是将这些Content类型的对象,存储在SequenceFile中。如果你用文本编辑器查看SequenceFIle,看到的就是乱码,而不是因为做索引导致的乱码。
至于SequenceFile怎么读写,这是hadoop的基础,想使用Nutch采集的数据,就去学学怎么读取SequenceFile吧。

开发工具:

官网下到的Nutch源码是用ant进行管理的,官方有个教程用ant命令将项目转换成eclipse项目,但是我个人非常不建议用eclipse作为开发工具。Intellij和Netbeans可以兼容eclipse项目,也可以用来开发Nutch。关于三个IDE的对比这是比较有争议的问题,这里不多说。不过这里最推荐的还是Intellij,后面的教程也都是用Intellij作为示范。

二次开发:

上面说了可以将Nutch源码放到Intellij中进行二次开发,但是我们这里说一下对Nutch二次开发个人的见解。对Nutch的开发主要是开发Nutch插件,Nutch的插件的确强大,但是Nutch的插件是为了搜索引擎设计的,如果你的业务是做数据采集,修改这些插件基本没有意义,有时候还会带来不必要的麻烦。Nutch常用的插件有:
1)URL正规化
2)正则过滤器
3)http请求器
4)网页解析器
5)网页打分
6)索引
7)其他
这些插件里,http请求器和网页解析器被修改的最多,剩下的插件基本没有什么修改的需求。如果爬虫被网站封杀,最常用的方法就是修改http请求器,使得http请求可以使用代理池。这里重点说网页解析器。一些企业选择的方案就是在网页解析模块中,加上网页抽取的代码,使得在解析的同时,将数据插入mysql。
网页解析插件有2个作用:
1)抽取网页中的链接,后面被存放到hdfs中,作为待爬取的链接。
2)抽取网页中的一些信息,例如标题、描述,后面被存放到hdfs中,作为索引阶段提交给索引服务器的数据(用作搜索)。
网页解析的效率非常地高,而且在Nutch中是一个大量线程并行的操作。一秒可以对大量网页进行信息抽取、存放到hdfs文件中。但是如果非要在网页解析插件中,将结构化数据提交到mysql,会因为插入速度太快而导致mysql插入操作阻塞。而且网页抽取的业务经常变化,如果将抽取业务写到网页解析插件中,业务变化,就要重新爬取。
我个人比较喜欢的一种方法,是不修改Nutch的源码,只用Nutch作为爬取器。Nutch自动将网页url和源码都根据抓取时间存放在SequenceFile中。写一套独立于Nutch的程序,来读取SequenceFile,做网页抽取、结构化数据持久化,会使得程序更稳定。

版本:

Nutch的版本主要分为Nutch 1.x和Nutch 2.x,非常不建议使用Nutch 2.x,虽然说Nutch 2.x可以将数据放到HBASE、MYSQL等数据库中,但是目前Nutch 2.x一直处在开发阶段,我们官网上下到的Nutch 2.x (最新的是Nutch 2.3)都需要经过一定的修改才可以正常运行,而且官网并没有给出相关文档,官网的Nutch 2.x教程非常不负责任,相信以前学过Nutch的都知道,官方的Nutch 2.x教程并不能用,那是因为官网提供的下载是Nutch 2.2.1版本,而官网所谓的Nutch 2.x指的是在社区svn中维护的Nutch 2.3的未完成版。换句话说,Nutch 2.x还属于在社区中开发的阶段,社区还没有给出正式的文档和教程。

除了文档欠缺、版本不稳定之外,Nutch2.x的持久化也是一个大问题。先说Nutch2.x利用MySQL做持久化,这就是一个搞笑的设定。在hadoop上跑程序,用mysql作为输入输出,效率大家都懂得。而且选用Nutch作为爬虫,一般都是要处理几千万以上的数据。Mysql存一般多万网页已经可以崩溃了。其实我一直觉得官方也不想给出Nutch2.x持久化到mysql这种设定,我觉得官方只是想告诉大家,Nutch2.x使用的gora可以通过配置,将数据持久化到各种数据库。

很多人冲着Nutch 2.x可以持久化到Hbase,而选用Nutch 2.x,当然配成功的很少,最后使用的更少。对于Nutch2.x与hbase,需要了解下面几点:

1)hbase的宗旨是提供一个无穷大的存储,hbase中每行数据都有一个唯一的key,在hbase中对数据的查询最好是在已知key的情况下进行,但是很多用户的需求,是想通过与sql中select操作类似的方法来查询数据,这种不可取。

2)Nutch 2.x所谓的存储数据到hbase,是将一些爬取辅助信息(历史爬取历史)、网页源码和链接分析信息存储到hbase中。如果你想用爬虫完成一边爬去一边抽取精数据,然后放入hbase,你需要自己去写插入hbase的操作,并不能通过Nutch 2.x自带的功能完成。

3)hbase如果崩溃,修复并不是很容易。很有可能爬了一个月的数据就救不回来了。

根据我的经验,Nutch 1.x可以为企业提供一个非常稳定的爬虫。虽然他并没有使用数据库来维护数据,但是它的稳定性却远远高于目前的Nutch 2.x版本。Nutch使用文件来维护所有的爬取信息(hdfs中的文件),Nutch 1.x将每个任务的数据都分别新建一个(或者多个)文件夹来管理(默认文件夹名是当前时间),并且对文件有一定的备份机制,本身就很少出致命错误(导致文件损坏不能用的错误)。如果遇到极端情况,导致文件损坏,可以通过删除损坏文件来轻松恢复,因为每次任务只会影响到当时新建的文件夹(这里描述并不是非常准确,后面教程中解释)。

有一些工程师不能接受这种设定,他们原来是做基于关系型数据库的系统出生的,对于用文件存储数据这种设定不是很能接受。这种习惯要改改了,至少目前,做hadoop这套东西,基于hdfs中文件去存储、管理海量数据,还是一个比较稳定的方案。hdfs中有一种文件叫SequenceFile,这种文件将java对象保存到文件中,也就是说,可以利用文件存储结构化信息,所以不用担心用文件存储不了复杂结构的数据。Nutch 1.x中所有的数据都是用SequenceFIle的形式来存储的。

最后说个题外话,Nutch 2.x之所以用hbase作为存储,有一个很重要的原因是,Nutch是为搜索引擎设计的爬虫,用hbase可以完成mysql实现不了的链接分析的功能。我们知道互联网中的链接信息,用mysql无法实现大量的存储,门户网站一个页面就有几十个外链,随便几十万个网页就可以把mysql弄报废,而且数据量一大查询效率你懂得。但是hbase就可以很好地完成这个功能。Nutch 2.x的hbase中,有一个列族叫outlink,这个列族用来存储每个页面的所有外链信息,列名是链接的url,列值是链接的锚文本。例如一个网页http://www.abc.com有2个外链,一个指向百度首页,一个指向新浪首页。在hbase里就是:

row_key:"http://www.abc.com:   outlink:http://www.baidu.com:百度一下,你就知道

row_key:"http://www.abc.com:   outlink:http://www.sina.com:新浪首页

这里注意一下,http://www.baidu.com和http://www.sina.com并不是值,而是列名。hbase中列族不可以随便增加,但是列是可以随意添加的。可想而知,当爬虫爬取后,hbase的outlink列族中,会有几百万个列(有多少不同的链接url,就有多少列)。这样存储,我们就可以很快地查询互联网中两个页面之间的关系。例如我们想查询http://www.abc.com和http://ww.baidu.com这两个页面之间的关系,只需要查询hbase中,row_key为http://www.abc.com的行中,列族为outlink,列名为http://www.abc.com的单元的值即可。这种查询操作在搜索引擎的链接分析中有非常重要的作用。但是如果一个企业只是想对互联网中的新闻进行爬取、舆情分析,极少会有这种需求。

所以如果企业想使用分布式爬虫,并且不是为了专门做搜索引擎,最好使用Nutch 1.x。不要为了使用”高端“的nosql(hbase)

Nutch开发者网站提供各种Nutch教程、资讯,以及相关爬虫的资料、信息。

网站地址:http://nutcher.org/该网站已经不能打开,可以访问nutcher是nutch的中文教程

https://github.com/CrawlScript/nutcher 或

http://datahref.com/archives/category/nutch%E4%B8%AD%E6%96%87%E6%95%99%E7%A8%8B


阅读全文
0 0