现在的位置: 首页 > 综合 > 正文

Nutch整体抓取过程

2013年08月19日 ⁄ 综合 ⁄ 共 3178字 ⁄ 字号 评论关闭

一、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;

privateorg.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可以快速地访问这些文件。

抱歉!评论已关闭.