nutch v1.9源码分析(3)——nutch基本爬取流程

来源:互联网 发布:windows 9 编辑:程序博客网 时间:2024/06/11 13:30

1      nutch基本爬取流程

         nutch是大名鼎鼎的Doug Cutting发起的爬虫项目,nutch孵化了现在大数据处理事实上的标准Hadoop。在nutch V 0.8.0 版本之前,Hadoop是nutch的一部分,从nutch V0.8.0开始,HDFS和MapReduce从nutch中剥离出成为Hadoop。v0.8.0之后,nutch就完全构建在Hadoop的基础之上了。

         既然是爬虫,那么其最核心的工作就是“将网上的资源下载到本地”。nutch采用了MapReduce分布式爬取和解析,具有良好的水平扩展性,此外,nutch还完成了诸如将爬取下来的工作建立lucene索引,建立网络拓扑图(web graph),链接分析等额外的工作。为了支持完成这些工作,nutch采用如下物化的数据结构来保存爬取过程中的数据。


图1 支撑nutch完成爬取的数据结构

      本系列分析文章主要关注nutch实现的基本爬虫的功能,即上图中黄框部分,由于图1中省略了injector部分,故用图2表示。


图2 nutch基本爬取流程——业务流

        图2是最基本的业务流视角的nutch爬取流程,流程含有inject、generate、fetch、parse、updatedb五个阶段(以下皆称之为“阶段”),一般情况下,inject阶段在整个爬取过程中只会执行一次,而generate、fetch、parse、updatedb四个阶段会组成一个“循环(crawl cycle)”,该循环一般会执行多次,该循环是“死循环”,一般需要外部指定条件(调用方),来终止该循环——这就是为什么nutch的bin/crawl脚本中会指定limit参数(nutch1.8之前叫depth参数,即从指定的种子url开始,爬取指定“深度(次数)”之后终止该循环)。当然,在不指定外部终止条件的情况下,该循环也可能终止,满足的条件是:在指定的最大爬取间隔(默认30天)时间内,所有要爬取的url全部爬取完毕,并且在crawldb中,所有的url的状态要么是“fetch_success”要么是“db_gone”。需要注意的是,如果不指定外部终止条件,如果url对应的html变化时间快于指定的最大爬取时间,该循环永远不会终止。

        如图3所示,该“循环”每次从各个阶段共享的crawldb[1]中取出一部分url,开始本轮循环,每轮循环nutch会下载url的html原始文件,通过解析url对应的html内容发现新的url地址(outlinks,外链),并将不断发现的url加入到crawldb中,然后再开始下次循环。

图3 nutch基本爬取流程——业务流+数据流

0 0
原创粉丝点击