`
biaowen
  • 浏览: 74427 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Nutch Crawler工作流程及文件格式详细分析

阅读更多

Crawler和Searcher两部分被尽是分开,其主要目的是为了使两个部分可以布地配置在硬件平台上,例如Crawler和Searcher分别被放置在两个主机上,这样可以极大的提高灵活性和性能。
一、总体介绍:

1、先注入种子urls到crawldb
2、循环:

    * generate 从crawldb中生成一个url的子集用于抓取
    * fetch 抓取上一小的url生成一个个segment
    * parse 分析已抓取segment的内容
    * update 把已抓取的数据更新到原先的crawldb

3、从已抓取的segments中分析出link地图
4、索引segment文本及inlink锚文本
二、相关的数据结构:
Crawl DB
● CrawlDb 是一个包含如下结构数据的文件:
<URL, CrawlDatum>
● CrawlDatum:
<status, date, interval, failures, linkCount, ...>
● Status:
{db_unfetched, db_fetched, db_gone,linked,
fetch_success, fetch_fail, fetch_gone}

  爬虫Crawler:
Crawler 的工作流程包括了整个nutch的所有步骤--injector,generator,fetcher,parseSegment, updateCrawleDB,Invert links, Index ,DeleteDuplicates, IndexMerger
Crawler涉及的数据文件和格式和含义,和以上的各个步骤相关的文件分别被存放在物理设备上的以下几个文件夹里,crawldb,segments,indexes,linkdb,index五个文件夹里。
那么各个步骤和流程是怎么,各个文件夹里又是放着什么呢?
观察Crawler类可以知道它的流程
./nutch crawl urls -dir ~/crawl -depth 4 -threads 10 -topN 2000

1、Injector injector = new Injector(conf);

Usage: Injector <crawldb> <url_dir>
首先是建立起始url集,每个url都经过URLNormalizers、filter和scoreFilter三个过程并标记状态。首先经过normalizer plugin,把url进行标准化,比如basic nomalizer的作用有把大写的url标准化为小写,把空格去除等等。然后再经过的plugin 是filter,可以根据你写的正则表达式把想要的url留下来。经过两个步骤后,然后就是把这个url进行状态标记,每个url都对应着一个 CrawlDatum,这个类对应着每个url在所有生命周期内的一切状态。细节上还有这个url处理的时间和初始时的分值。
  同时,在这个步骤里,会在文件系统里生成 如下文件 crawlDB\current\part-00000
  这个文件夹里还有.data.crc , .index.crc, data, index四个文件

● MapReduce1: 把输入的文件转换成DB格式
In: 包含urls的文本文件
Map(line) → <url, CrawlDatum>; status=db_unfetched
Reduce() is identity;
Output: 临时的输出文件夹
● MapReduce2: 合并到现有的DB
Input: 第一步的输出和已存在的DB文件
Map() is identity.
Reduce: 合并CrawlDatum成一个实体(entry)
Out: 一个新的DB
  

2、Generator generator = new Generator(conf);
//Generates a subset of a crawl db to fetch

Usage: Generator <crawldb> <segments_dir> [-force] [-topN N] [-numFetchers numFetchers] [-adddays numDays] [-noFilter]
在这个步骤里,Generator一共做了四件事情,
1、给前面injector完成的输出结果里按分值选出前topN个url,作为一个fetch的子集。
2、根据第一步的结果检查是否已经选取出一些url,CrawlDatum的实体集。
3、再次转化,此次要以url的host来分组,并以url的hash来排序。
4、根据以上的步骤的结果来更新crawldb(injector产生)。

● MapReduce1: 根据要求选取一些要抓取的url
In: Crawl DB 文件
Map() → if date≥now, invert to <CrawlDatum, url>
Partition 以随机的hash值来分组
Reduce:
compare() 以 CrawlDatum.linkCount的降序排列
output only top-N most-linked entries
● MapReduce2: 为下一步抓取准备
Map() is invert; Partition() by host, Reduce() is identity.
Out: 包含<url,CrawlDatum> 要并行抓取的文件



  3、Fetcher fetcher = new Fetcher(conf);
//The fetcher. Most of the work is done by plugins
Usage: Fetcher <segment> [-threads n] [-noParsing]
这个步骤里,Fetcher所做的事情主要就是抓取了,同时也完成一些其它的工作。首先,这是一个多线程的步骤,默认以10个线程去抓取。根据抓取回来后的结果状态来进行不同的标记,存储,再处理等等行为。输入是上一步骤Generator产生的segment文件夹,这个步骤里,考虑到先前已经按照ip 或host来patition了,所以在此就不再把input文件进行分割了。程序继承了SequenceFileInputFormat重写了 inputFormat来达到这点。这个类的各种形为都是插件来具体完成的,它只是一个骨架一样为各种插件提供一个平台。它先根据url来取出具体的 protocol,得到protocolOutput,进而得到状态status及内容content。然后,根据抓取的状态status来继续再处理。再处理时,首先会将这次抓取的内容content、状态status及它的状态标记进行存储。这个存储的过程中,还会记下抓取的时间,再把segment 存过metadata,同时在分析parsing前经过scoreFilter,再用parseUtil(一系列的parse插件)进行分析,分析后再经过一次score插件的处理。经过这一系列处理后,最后进行输出(url,fetcherOutput)。
之前讲到根据抓取回来的各种状态,进行再处理,这些状态一共包括12种,比如当抓取成功时,会像上刚讲的那样先存储结果,再判断是否是链接跳转,跳转的次数等等处理。

● MapReduce:抓取
In: <url,CrawlDatum>, 以host分区, 以hash值排序
Map(url,CrawlDatum) → <url, FetcherOutput>
多线程的, 同步的map实现
调用已有的协议protocol插件
FetcherOutput: <CrawlDatum, Content>
Reduce is identity
Out: 两个文件: <url,CrawlDatum>, <url,Content>


4、 ParseSegment parseSegment = new ParseSegment(conf);
//Parse content in a segment
Usage: ParseSegment segment
对于这个步骤的逻辑比较简单,只是对抓取后上一步骤存储在segment里的content进行分析parse。同样,这个步骤的具体工作也是由插件来完成的。

MapReduce: 分析内容
In: <url, Content> 抓取来的内容
Map(url, Content) → <url, Parse>
调用分析插件parser plugins
Reduce is identity.
Parse: <ParseText, ParseData>
Out: 分割成三个文件: <url,ParseText>, <url,ParseData> 和<url,CrawlDatum> 为了outlinks.


5、CrawlDb crawlDbTool = new CrawlDb(conf);
//takes the output of the fetcher and updates the crawldb accordingly.
Usage: CrawlDb <crawldb> (-dir <segments> | <seg1> <seg2> ...) [-force] [-normalize] [-filter] [-noAdditions]
这个类主要是根据fetcher的输出去更新crawldb。 map和reduce分别做了两方面的事情,在map里是对url的nomalizer,和filte,在reduce里是对新抓取进来的页面(CrawlDatum)和原先已经存在的进行合并。

MapReduce:合并抓取的和分析后的输出到crawldb里
In: <url,CrawlDatum>现有的db加上抓取后的和分析后的输出
Map() is identity
Reduce() 合并所有实体(entry)成一个,以抓取后的状态覆盖原先的db状态信息,统计出分析后的链接数
Out: 新的crawl db

6.LinkDb linkDbTool = new LinkDb(conf);
//Maintains an inverted link map, listing incoming links for each url.
Usage: LinkDb <linkdb> (-dir <segmentsDir> | <seg1> <seg2> ...) [-force] [-noNormalize] [-noFilter]
这个类的作用是管理新转化进来的链接映射,并列出每个url的外部链接(incoming links)。先是对每一个url取出它的outLinks,作map操作把这个url作为每个outLinks的incoming link,在reduce里把根据每个key来把一个url的所有incoming link都加到inlinks里。这样就把每个url的外部链接统计出来了。然后一步是对这些新加进来的链接进行合并。

● MapReduce: 统计每个链接的外部链接
In: <url,ParseData>, 包含所有链接的分析后的结果
Map(srcUrl, ParseData> → <destUrl, Inlinks>
为每个链出链接收集一个入链。
Inlinks: <srcUrl, anchorText>*
Reduce()加上外部入链数量
Out: <url, Inlinks>, 一个相关完整的链接地图


7.Indexer indexer = new Indexer(conf);
//Create indexes for segments
Usage: <index> <crawldb> <linkdb> <segment> ...
  这个类的任务是另一方面的工作了,它是基于hadoop和lucene的分布式索引。它就是为前面爬虫抓取回来的数据进行索引好让用户可以搜索到这些数据。这里的输入就比较多了,有segments下的fetch_dir,parseData和parseText,还有crawldb下的 current_dir和linkdb下的current_dir。在这个类里,map也不做,在reduce时处理。当然要把这些数据体组合成一个 lucene的document让它索引了。在reduce里组装好后收集时是<url,doc>,最后在输出的OutputFormat类里进行真正的索引。

● MapReduce: 生成lucene的索引文件
In: 外个文件, values 以 <Class, Object>包装
<url, ParseData> from parse, 有title, metadata, 等等信息.
<url, ParseText> from parse, 文本 text
<url, Inlinks> from invert, 锚文本anchors
<url, CrawlDatum> from fetch,用于抓取
Map() is identity
Reduce() 生成Lucene Document
调用index插件
Out: 建立Lucene 索引; 最后存储到文件系统上


8. DeleteDuplicates dedup = new DeleteDuplicates(conf);
//这个类的作用就是它的名字了。
Usage: DeleteDuplicates <indexes> ...
  这个类的作用就是这它的名字所写的意思--去重。前面索引后(当然不是一次时的情况)会有重复,所以要去重。为什么呢,在一次索引时是不重复的,可是多次抓取后就会有重复了。就是这个原因才要去重。当然去重的规则有两种一个是以时间为标准,一种是以内容的md5值为标准。
9.IndexMerger merger = new IndexMerger(conf);
IndexMerger [-workingdir <workingdir>] outputIndex indexesDir...
  这个类就比较简单了,把所有的小索引合并成一个索引。在这一步没有用到map-reduce。

  在这九大步骤中generator,fetcher,parseSegment,crawlDbTool会根据抓取的层数循环运行,当抓取的层数大于1时会运行linkInvert,index,dedup,和merge。

 

分享到:
评论
1 楼 guji528 2009-12-24  
解释很详细!

相关推荐

    Nutch爬虫工作流程及文件格式详细分析.doc

    本文主要分析Nutch爬虫的工作流程及其涉及的文件格式。 Nutch的爬虫部分主要负责从互联网上抓取网页并构建索引。这一过程可以分为几个关键步骤: 1. **生成Fetchlist**: - Nutch首先基于现有的Web数据库(WebDB...

    Nutch爬虫工作流程及文件格式详细分析

    本文将详细分析Nutch爬虫的工作流程和涉及的主要文件格式。 首先,Nutch爬虫(Crawler)的核心任务是抓取互联网上的网页,并构建一个链接结构的数据库,称为WebDB。WebDB包含两类实体:Page和Link。Page实体记录了...

    nutch帮助文档;nutch学习 入门

    - **运行Nutch流程**:执行`bin/nutch crawl`命令,依次进行抓取、解析、索引等步骤。 - **使用Solr或Elasticsearch**:Nutch可以将索引数据导出到Solr或Elasticsearch,以实现更强大的搜索功能。 - **学习源码**...

    Windows下配置nutch

    Crawler 的工作流程通常包括以下步骤: - 发起初始请求,通常是用户指定的种子 URL。 - 分析下载的网页,提取出链接。 - 根据策略(如频率、优先级等)决定下一步要抓取哪个页面。 - 存储抓取的页面,通常为原始...

    开发基于 Nutch 的集群式搜索引擎

    Nutch的架构设计可以分为两个主要部分:抓取器(Crawler)和搜索器(Searcher)。抓取器负责抓取网页内容,而搜索器则负责处理用户的查询请求。具体来说: 1. **抓取器**:抓取器的工作流程如下: - 从一个或多个...

    nutch1.2源码

    这个过程涉及的文件包括`conf`目录下的配置文件,如`nutch-site.xml`,以及`bin`目录下的脚本文件,如`nutch crawl`命令。 总的来说,Apache Nutch 1.2是构建大规模搜索引擎或进行网络数据分析的理想工具,它与...

    semantics:OWL本体描述BCube Nutch Crawler发现的Web服务

    在这个压缩包文件“semantics-master”中,可能包含了项目的源代码、配置文件、文档等资源,可以帮助我们深入了解如何将OWL本体与BCube Nutch Crawler结合,实现Web服务的语义发现。这可能涉及到以下知识点: 1. ...

    Nutch design and tutorial

    《Nutch入门教程》这本书是一个很好的起点,它详细介绍了Nutch的内部结构和算法,包括Nutch的配置、部署、爬虫工作原理、索引过程以及如何进行定制开发。通过阅读这本书,你可以深入理解Nutch的工作机制,并能够实际...

    apache-nutch-1.13-src.zip_nutch_网络爬虫

    网络爬虫(Web Crawler)是自动化地遍历互联网并抓取网页内容的程序。它们是搜索引擎背后的关键技术,用于收集和更新网络上的信息。 Apache Nutch 的核心功能包括以下几个方面: 1. **抓取**:Nutch 使用种子URL...

    nutch爬虫+java+eclipse

    下面将详细介绍Nutch爬虫、Java语言在爬虫开发中的应用以及如何在Eclipse中配置和运行Nutch。 一、Nutch爬虫 Nutch 是Apache软件基金会的一个项目,它的设计目标是成为一个可扩展、高性能的网络爬虫。Nutch的核心...

    apache nutch 2.2 linux

    三、Nutch 2.2 的工作流程 1. **种子 URL 添加**: 将初始的 URL 添加到待抓取队列。 2. **生成段(Segments)**: 抓取的网页会被分成多个段,每个段包含一组网页。 3. **解析和索引**: 对每个段中的网页进行解析,...

    Nutch 安装ppt

    - **Nutch 爬虫(Nutch Crawler)**:负责从网站上抓取网页,并对抓取的网页进行解析。 - **Hadoop**:用于存储爬虫解析后的数据。Hadoop 同样是 Apache 的顶级项目之一,最初起源于 Nutch 项目。 - **Solr**:这是...

    Nutch:一个灵活可扩展的开源web搜索引擎

    提供的压缩文件"CN-TR-04-04.pdf"可能包含了关于Nutch项目的详细技术文档或教程,它可能涵盖了Nutch的安装、配置、运行示例以及常见问题解答等内容。通过阅读这份文档,你可以更深入地了解如何使用Nutch,以及在实际...

    Nutch使用总结 信息检索 建立索引 搜索引擎

    在测试阶段,可以通过执行Nutch的命令行工具,如`nutch inject`(注入URL种子)、`nutch crawl`(启动抓取流程)等,来验证Nutch是否正常工作。 ### 3. Nutch 工具与插件 - **segread TOOL**: 这个工具用于读取...

    Open Source Web Crawler for Java.zip

    【标题】"Open Source Web Crawler for Java" 指的是一种开源的网络爬虫程序,它是用Java编程语言编写的。在IT领域,网络爬虫是自动化抓取互联网信息的重要工具,它能够遍历网页,提取所需数据,用于数据分析、搜索...

    03分布式采集系统总体设计方案100412[归纳].pdf

    6. 采集完成后,Crawler调用ResultSummiter模块,将采集结果和元信息转化为Nutch文件格式,Nutch是一种广泛使用的Web爬虫框架,其文件格式便于后续处理和分析。 7. ResultSummiter由JAVA程序实现,负责将数据上传回...

    基于Apache Nutch和Htmlunit的扩展实现AJAX页面爬虫抓取解析插件.zip

    爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的...

    Crawler.zip

    网络爬虫,也称为网页蜘蛛或网络机器人,是一种自动化程序,它遍历互联网上的页面,收集信息并存储在数据库中,以便于后续的数据分析或搜索引擎索引。这个压缩包可能包含了以下关键知识点: 1. **HTTP协议**:网络...

Global site tag (gtag.js) - Google Analytics