一、Heritrix 和Nutch 的区别
Heritrix 是个 "archival crawler"
(1)用来获取完整的、精确的、站点内容的深度复制。包括获取图像以及其他非文本内容。抓取并存储相关的内容。对内容来者不拒,不对页面进行内容上的修改。
(2)重新爬行对相同的URL不针对先前的进行替换。爬虫通过Web用户界面启动、监控、调整,允许弹性的定义要获取的URL。
Nutch 只获取并保存可索引的内容。可以修剪内容,或者对内容格式进行转换。保存内容为数据库优化格式便于以后索引;
二、Nutch主要分为两个部分:爬虫crawler和查询searcher。Crawler主要用于从网络上抓取网页并为这些网页建立索引。Searcher主要利用这些索引检索用户的查找关键词来产生查找结果。
三、nutch Crawler流程
初始化CrawlDb、生成抓取工作列表、抓取网页文件、更新CrawlDb、倒排Links、建立索引、复制索引文件、合并索引文件
1) 、inject urls
org.apache.nutch.crawl.Injector
注入抓取URL。因为Nutch的抓取程序要抓取网页,而定位到某个(或者某些)网页需要指定一个URL,在此基础上,Nutch按照广度遍历策略进行抓取,会根据一开始指定的URL(可以是一个URL集合:URLs),以此为基础进行抓取工作。
具体格式为<Text, CrawlDatum>。其中的key表示该URL的地址,而value则是Nutch自己定义的一个类型“CrawlDatum”,该类型实现了"Writable"接口,用来表示页面的一些属性。
“CrawlDatum"的类的具体形式如下:
package org.apache.nutch.crawl; public class CrawlDatum implementsWritableComparable<CrawlDatum>, Cloneable { privatebyte status; privatelong fetchTime = System.currentTimeMillis(); privatebyte retries; private intfetchInterval; privatefloat score = 1.0f; privatebyte[] signature = null; privatelong modifiedTime; private org.apache.hadoop.io.MapWritable metaData; }
其中包括了页面的状态,抓取时间,抓取间隔等属性。
在Nutch中”Injector“实现分为4步,其中前两步为两个MapReduce任务。
第一个M/R任务是用来把文本文件中的URL进行过滤,规范化,包装成“CrawlDatum”,并最终存成临时的Sequence类型文件。该临时文件的格式为<Key, CrawlDatum>。
第二个M/R任务是用来把排序后的结果和原“CrawlDb"中的数据(如果存在)进行合并,生成新的CrawlDb文件。
第三步,用新生成的CrawlDb来替换原有的文件。
第四步,删除之前产生的临时文件。
2)、generate segment
org.apache.nutch.crawl.Generator
生成segment。Nutch抓取程序需要抓取到很多的页面,那么具体是哪些页面的?当然,在互联网上是通过URL来定位的。
这一步骤主要是对上一步提交的URL集合进行分析,确定抓取任务的详细信息。
Path segment =generator.generate(crawlDb, segments, -1, topN, System.currentTimeMillis())。
在segments目录下新建一个System.currentTimeMillis()时间标识的文件,如20090806161707,
另外遍历crawlDb,
取出topN个需要fetch的urlList,
存放到segments/20090806161707/crawl_generate文件中,crawl_generate 为SequenceFile。
3)、fetch list
org.apache.nutch.fetcher.Fetcher
分析提交的URL集合之后,将页面内容抓取下来,存于segment目录下。
抓取过程中,页面的URL地址可能因为链接发生改变,从而需要更新URL地址;
抓取采用多线程方式进行,以提高抓取速度;
fetch操作过程中调用了parse操作。
Fetcher fetcher =new Fetcher(conf);
fetcher.fetch(segment,threads, parsing);
其中segment是path路径,即在generate中产生的一轮segment。默认有10个fetchthreads。并且在fetch过程中进行parse。
整个fetcher过程只有一个MapReduce的job:
Input:crawl_generate,即generator中生成的fetchList,在generator过程中用NumMapTask拆分最后生成的generator list,使得在fetcher过程中,每个mapper负责抓取一部分fetchlist。
4)、content parser
org.apache.nutch.parse.ParseSegment
内容解析器。抓取到的页面文件被提交到这里,实现对页面文件的处理,包括页面文件的分析和处理。
5)、parsed text &data
执行的结果是:将fetch得到的页面解析为text和data,存于segments目录下
解析segment中由fetch得到的页面,并进行整理,将页面分成为parse-date和parse-text;
parse-date中保存的是页面的题名、作者、日期、链接等内容;
parse-text中保存的是页面的文本内容。
通过上面几步操作,创建了如下几个目录
content、crawl_fetch、crawl_generate、crawl_parse、parse_data、parse_text
content
包含下载页面的原始数,存储为map文件,格式是<url,Content>。为了展示缓存也页的视图,这里使用文件存储数据,因为Nutch需要对文件做快速随机的访问。
crawl_generate
它包含将要爬取的URL列表以及从CrawlDb取到的与这些URL页相关的当前状态信息,对应的顺序文件的格式<url,CrawlDatum>。这个数据采用顺序文件存储原因有二:第一,这些数据是按顺序逐个处理的;第二,map文件排序值的不变性不能满足我们的要求。我们需要尽量分散属于同一台主机的URL,以此减少每个目标主机的负载,这就意味着激烈信息基本上是随机排列的。
crawl_fetch
它包含数据爬取的状态信息,即爬取是否成功相应码是什么,等等。这个数据存储在map文件里,格式是<url,CrawlDatum>。
crawl_parse
每个成功爬取并解析的页面的出链接列表都保存在这里,因此Nutch通过学习新的URL可以扩展它的爬取前端页。
parse_date
解析过程中收集的元数据,其中还有页面的出链接(frontier)列表。这些信息对于建立反向图(入链接-ink)是相当关键的。
parse_text
页面的纯文本内容适合用Lucene进行索引。这些纯文本存储成map文件,格式是<url,ParseText>,因此要展示搜索结果列表的概要信息(摘要)的时候,Nutch可以快速地访问这些文件。