nutch v1.9源码分析(3)——nutch基本爬取流程
2014-12-03 18:29
274 查看
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基本爬取流程——业务流+数据流
相关文章推荐
- 【Nutch2.2.1源代码分析之5】索引的基本流程
- Nutch1.7源码再研究之---9 Fetch流程分析
- RxJava基本流程和lift源码分析
- 【Nutch2.2.1源代码分析之5】索引的基本流程
- quartz 2.2.x 源码学习 基本执行流程分析
- RxJava && Agera 从源码简要分析基本调用流程(1)
- 理解RxJava(一)基本流程源码分析
- 【Nutch2.2.1源代码分析之5】索引的基本流程
- x264源码分析与应用示例(一)——视频编码基本流程
- 【Nutch2.2.1源代码分析之5】索引的基本流程
- Android RxJava基本流程和lift源码分析
- libevent源码分析---基本使用场景和事件流程
- Nutch1.7源码再研究之---10 Fetch流程分析(续)
- RxJava基本流程和lift源码分析
- Volley源码分析之基本流程
- RxJava基本流程和lift源码分析
- RxJava && Agera 从源码简要分析基本调用流程(2)
- RxJava && Agera 从源码简要分析基本调用流程(2)
- RxJava基本流程和lift源码分析
- Nutch1.7学习笔记2:基本工作流程分析