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

nutch主流程代码阅读心得。

阅读更多

之前对nutch进行些分析,打算在基础上进行一些应用,不过最近忙着,也没弄出个所以然,先把阅读心得贴出来,里边可能有不少理解上的错误,仅供参考用,万一突然有人转载了,请保留blog出处 。也希望能认识跟多对此话题感兴趣的朋友。

 

主要类分析:
一、org.apache.nutch.crawl.Injector:
    1,注入url.txt
    2,url标准化
    3,拦截url,进行正则校验(regex-urlfilter.txt)
    4,对符URL标准的url进行map对构造<url, CrawlDatum>,在构造过程中给CrawlDatum初始化得分,分数可影响url host的搜索排序,和采集优先级!
    5,reduce只做一件事,判断url是不是在crawldb中已经存在,如果存在则直接读取原来CrawlDatum,如果是新host,则把相应状态存储到里边(STATUS_DB_UNFETCHED(状态意思为没有采集过))

二、org.apache.nutch.crawl.Generator:
    1,过滤不及格url (使用url过滤插件)
    2,检测URL是否在有效更新时间里
    3,获取URL metaData,metaData记录了url上次更新时间
    4,对url进行打分
    5,将url载入相应任务组(以host为分组)
    6,计算url hash值
    7,收集url, 直至到达 topN 指定量

三、org.apache.nutch.crawl.Fetcher:
    1,从segment中读取<url, CrawlDatum>,将它放入相应的队列中,队列以queueId为分类,而queueId是由 协议://ip 组成,在放入队列过程中,
        如果不存在队列则创建(比如javaeye的所有地址都属于这个队列:http://221.130.184.141)  --> queues.addFetchItem(url, datum);
    2,检查机器人协议是否允许该url被爬行(robots.txt) --> protocol.getRobotRules(fit.url, fit.datum);
    3,检查url是否在有效的更新时间里 --> if (rules.getCrawlDelay() > 0)
    4,针对不同协议采用不同的协议采用不同机器人,可以是http、ftp、file,这地方已经将内容保存下来(Content)。 --> protocol.getProtocolOutput(fit.url, fit.datum);
    5,成功取回Content后,在次对HTTP状态进行识别(如200、404)。--> case ProtocolStatus.SUCCESS:
    6,内容成功保存,进入ProtocolStatus.SUCCESS区域,在这区域里,系统对输出内容进行构造。 --> output(fit.url, fit.datum, content, status, CrawlDatum.STATUS_FETCH_SUCCESS);
    7,在内容构造过程中,调取内容解析器插件(parseUtil),如mp3\html\pdf\word\zip\jsp\swf……。 --> this.parseUtil.parse(content); --> parsers[i].getParse(content);
    8,我们现在研究html解析,所以只简略说明HtmlParser,HtmlParser中,会解析出text,title, outlinks, metadata。 
        text:过滤所有HTML元素;title:网页标题;outlinks:url下的所有链接;metadata:这东西分别做那么几件事情 首先检测url头部的meta name="robots" 看看是否允许蜘蛛爬行,
        其次通过对meta http-equiv refresh等属性进行识别记录,看页面是否需要转向。

四、org.apache.nutch.parse.ParseSegment:
    1,这个类逻辑就相对简单很多了哦,它对我们也是很有价值的,它只做一件事情,就是对爬行下来的Content(原始HTML)进行解析,具体解析通过插件来实现。
        比如我们要做的数据分析、数据统计都可以在这进行实现。
    2,执行完成后,输出三个Map对<url,ParseText>解析内容、<url,ParseData>包含所有链接的分析后的结果 、<url,CrawlDatum>outlinks

五、org.apache.nutch.crawl.CrawlDb:
    主要根据crawld_fatch输出更新crawldb。
    1,map对crawld_fatch、crawldb地址进行标准化(nomalizer)和拦截操作(filte);
    2,reduce在对两crawld_fatch和crawldb进行合并更新。

六、org.apache.nutch.crawl.LinkDb:
    这个类的作用是管理新转化进来的链接映射,并列出每个url的外部链接(incoming links)。
    1,先是对每一个url取出它的outLinks,作map操作把这个url作为每个outLinks的incoming link,
    2,在reduce里把根据每个key来把一个url的所有incoming link都加到inlinks里。
    3,这样就把每个url的外部链接统计出来了,注意,系统对只对外部链接进行统计,什么叫外部链接呢,就是只对不同host进行统计,
        记住iteye.com和biaowen.iteye.com是两个不同的host哦。 --> boolean ignoreInternalLinks = true;
    4,然后一步是对这些新加进来的链接进行合并。

七、org.apache.nutch.crawl.Indexer:
    这个类的任务是另一方面的工作了,它是基于hadoop和lucene的分布式索引。它就是为前面爬虫抓取回来的数据进行索引好让用户可以搜索到这些数据。
    这里的输入就比较多了,有segments下的fetch_dir,parseData和parseText,还有crawldb下的 current_dir和linkdb下的current_dir。
    1,在这个类里,map将所有输入都装载到一个容器里边,
    2,在到reduce进行分类处理,
    3,实现拦截 --> this.filters.filter(doc, parse, key, fetchDatum, inlinks);
    4,打分 --> this.scfilters.indexerScore(key, doc, dbDatum,fetchDatum, parse, inlinks, boost);
    5,当然要把这些数据体组合成一个 lucene的document让它索引了。
    6,在reduce里组装好后收集时是<url,doc>,最后在输出的OutputFormat类 里进行真正的索引。
        doc里有如下几个field
            content(正文)
            site    (所属主地址)
            title    (标题)
            host    (host)
            segement    (属于哪个segement)
            digest    (MD5码,去重时候用到)
            tstamp    (暂时不知道什么东西)
            url    (当前URL地址)
            载了一个例子:
                doc =
                    {content=[biaowen - JavaEye技术网站 首页 新闻 论坛 博客 招聘 更多 ▼ 问答 ………………(内容省略)………… biaowen 永NF/ICP备05023328号],
                    site=[biaowen.iteye.com],
                    title=[biaowen - JavaEye技术网站],
                    host=[biaowen.iteye.com],
                    segment=[20090725083125],
                    digest=[063ba8430fa84e614ce71276e176f4ce],
                    tstamp=[20090725003318265],
                    url=[http://biaowen.iteye.com/]}

八、org.apache.nutch.crawl.DeleteDuplicates:
    这个类的作用就是这它的名字所写的意思--去重。
    前面索引后(当然不是一次时的情况)会有重复,所以要去重。为什么呢,在一次索引时是不重复的,可是多次抓取后就会有重复了。
    就是这个原因才要去重。当然去重的规则有两种一个是以时间为标准,一种是以内容的md5值为标准。

九、org.apache.nutch.indexer.IndexMerger:
    这个类就相对简单了,目的将多个indexes合并为一个index,直接调用lucene方法实现!


附带些参考资料:

目录结构,参考自《Lucene+Nutch搜索引擎开发》
    一、crawldb    下载的url,以及下载日期,用来进行页面更新
    二、segements    存放抓取页面和分析结果
                        1、crawl_generate:待下载url
                        2、crawl_fetch:每个下载url的状态
                        3、content:每个下载页面的内容
                        4、parse_text:包含每个解析过的url文本内容
                        5、parse_data:每个url解析出的外部链接和元数据
                        6、crawl_parse:用来更新crawl的外部链接库
    三、linkdb    存放url的互联关系
    四、indexes:存放每次下载的独立索引目录
    五、index:符合lucene格式的索引目录,是indexes里所有index合并后的完整索引

分享到:
评论
2 楼 jerry.chen 2010-05-21  
望加QQ:519582864 想详细向你请教,谢谢!
1 楼 comsci 2010-03-18  
非常不错的东西,通过这个文章,我们可以对搜索引擎的建立有更加深入的了解

相关推荐

    nutch的源代码解析

    Nutch 的源代码解析对于深入理解搜索引擎的工作原理以及自定义搜索引擎的实现非常有帮助。下面我们将详细探讨 Nutch 的注入(Injector)过程,这是整个爬取流程的第一步。 Injector 类在 Nutch 中的作用是将输入的 ...

    分析Nutch的工作流程

    ### Nutch工作流程详解 #### 一、Nutch概述及工作流程概览 Nutch是一款开源的网络爬虫项目,其主要功能在于抓取互联网上的网页,并对其进行分析、索引,以便用户能够快速检索到所需的信息。Nutch的灵活性和可扩展...

    nutch开发工程代码2

    nutch开发工程代码2nutch开发工程代码2nutch开发工程代码2

    nutch-2.1源代码

    Nutch的源代码包含了整个项目的完整实现,包括爬虫、索引器、搜索器以及相关的配置和文档。这对于开发者和研究者来说是一个宝贵的资源,他们可以深入理解搜索引擎的工作原理,学习如何处理大规模的网络数据,或者对...

    nutch 0.9分页代码(粘贴可用)

    ### Nutch 0.9 分页代码解析与应用 #### 一、背景介绍 Nutch 是一个开源的网络爬虫项目,它提供了高度可扩展且可靠的网页抓取框架。随着互联网的发展,数据量日益增大,如何高效地处理这些数据成为了一个重要的...

    Nutch 1.2源码阅读

    ### Nutch 1.2 源码阅读深入解析 #### Crawl类核心作用与流程概览 在深入了解Nutch 1.2源码之前,我们先明确Nutch的架构和工作流程。Nutch作为一款开源搜索引擎框架,其功能涵盖网页抓取、索引构建以及查询处理。...

    nutch开发工程代码1

    nutch开发工程代码1,一些源代码,拿去看看吧,说不定能帮上忙

    nutch1.6压缩代码

    3. **启动爬取**:运行`bin/nutch inject`命令将种子URL注入到Nutch的工作流程中。 4. **抓取网页**:使用`bin/nutch fetch`命令下载网页,`bin/nutch parse`命令解析内容,`bin/nutch updatedb`更新数据库。 5. *...

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

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

    学习lucene和nutch爬虫代码

    通过阅读和理解这些代码,你可以深入了解Lucene如何建立索引、执行搜索,以及Nutch如何抓取和处理网页。动手实践是学习的最佳途径,尝试运行这些代码,根据日志分析爬虫和搜索引擎的工作流程,将是提升技能的有效...

    nutch使用&Nutch;入门教程

    在使用Nutch之前,你需要配置Nutch的运行环境,包括安装Java、设置Hadoop(如果需要分布式爬取)、下载和编译Nutch源代码。还需要配置Nutch的`conf/nutch-site.xml`文件,指定抓取策略、存储路径、爬虫范围等参数。 ...

    nutch crawl代码解析

    本文将解析 Nutch-0.9 版本中的 `Crawl` 类,它是 Nutch 抓取流程的起点。 `Crawl` 类位于 `org.apache.nutch.crawl` 包中,它包含了启动 Nutch 抓取程序的主要逻辑。`main` 函数是整个程序的入口点,它接收命令行...

    nutch开发资料 搜索引擎

    这个开发资料压缩包包含了与Nutch相关的源代码和可能的配置文件,可以帮助开发者深入了解和学习Nutch的工作原理以及如何进行定制化开发。以下是对Nutch及其相关知识点的详细介绍: 1. **Nutch介绍**:Nutch是一个...

    nutch 爬虫数据nutch 爬虫数据nutch 爬虫数据nutch 爬虫数据

    在Nutch的数据流程中,主要涉及以下几个关键步骤: 1. **种子URL生成**:爬虫的起点是种子URL列表,这些URL决定了Nutch将首先访问哪些网站。用户可以自定义种子URL,或者从已有的列表导入。 2. **发现阶段**:...

    nutch 1.5的源代码

    在`apache-nutch-1.5.1`这个压缩包中,你将找到源代码、构建脚本、文档、配置文件以及示例数据。通过对这些内容的阅读和实践,你可以深入了解搜索引擎的运作机制,进一步提升你的Java编程和分布式系统技能。同时,...

    Lucene+Nutch搜索引擎开发.王学松源代码

    《Lucene+Nutch搜索引擎开发:王学松源代码解析》 在信息技术日新月异的今天,搜索引擎已经成为了人们获取信息的重要工具。Lucene和Nutch是两个在开源社区广泛使用的搜索引擎技术,它们为开发者提供了构建高效、可...

    nutch 初学文档教材

    5. nutch工作流程分析...25 5.1 爬虫...25 5.1.1 工作策略...25 5.1.2 工作流程分析....25 5.1.3 其它..27 5.2 索引...27 5.2.1 索引主要过程....27 5.2.2 工作流程分析....28 5.2.3 倒排索引(inverted index)....29...

    nutch流程解析.doc

    Nutch 的工作流程主要包括六个主要步骤:Injector、Generator、Fetcher、ParseSegment、CrawlDb 更新和 LinkDb 更新,最后由 Indexer 创建索引。下面将对每个步骤进行详细解释。 1. Injector: Injector 是 Nutch ...

    如何通过java程序获得Nutch中网页的详细信息

    首先,我们需要理解Nutch的工作流程。Nutch分为多个阶段,包括抓取(Crawling)、解析(Parsing)、分割(Segmenting)和索引(Indexing)。抓取阶段,Nutch会按照种子URL抓取网页;解析阶段,它将HTML内容转换为...

    nutch的源码解读和nutch入门

    同时,直接阅读源码是理解 Nutch 工作原理的关键,因为代码简洁且没有复杂的技巧。 如果你想使用 Nutch 作为爬虫,但不需要其索引功能,可以参考 `Indexer` 类的实现,编写自己的版本,将 segments 中的内容直接...

Global site tag (gtag.js) - Google Analytics