nutch源代码阅读心得

  一、 org.apache.nutch.crawl.Injector

  注入url.txt

  url标准化

  拦截url,进行正则校验(regex-urlfilter.txt)

  对符合URL标准的url进行map对构造,在构造过程中给CrawlDatum初始化得分,分数可影响url host的搜索排序和采集优先级!

  reduce只做一件事,判断url是不是在crawldb中已经存在,如果存在则直接读取原来CrawlDatum,如果是新host,则把相应状态存储到里边(STATUS_DB_UNFETCHED(状态意思为没有采集过))

  二、org.apache.nutch.crawl.Generator

  过滤不及格url (使用url过滤插件)

  检测URL是否在有效更新时间里

  获取URL metaData,metaData记录了url上次更新时间

  对url进行打分

  将url载入相应任务组(以host为分组)

  计算url hash值

  收集url, 直至到达 topN 指定量

  三、 org.apache.nutch.crawl.Fetcher:

  从segment中读取,将它放入相应的队列中,队列以queueId为分类,而queueId是由 协议://ip 组成,在放入队列过程中,如果不存在队列则创建(比如javaeye的所有地址都属于这个队列:http://221.130.184.141) --> queues.addFetchItem(url, datum);

  检查机器人协议是否允许该url被爬行(robots.txt) --> protocol.getRobotRules(fit.url, fit.datum);

  检查url是否在有效的更新时间里 --> if (rules.getCrawlDelay() > 0)

  针对不同协议采用不同的协议采用不同机器人,可以是http、ftp、file,这地方已经将内容保存下来(Content)。 --> protocol.getProtocolOutput(fit.url, fit.datum);

  成功取回Content后,再次对HTTP状态进行识别(如200、404)。--> case ProtocolStatus.SUCCESS:

  内容成功保存,进入ProtocolStatus.SUCCESS区域,在这区域里,系统对输出内容进行构造。 --> output(fit.url, fit.datum, content, status, CrawlDatum.STATUS_FETCH_SUCCESS);

  在内容构造过程中,调取内容解析器插件(parseUtil),如mp3\html\pdf\word\zip\jsp\swf……。 --> this.parseUtil.parse(content); --> parsers[i].getParse(content);

  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对解析内容、包含所有链接的分析 后的结果 、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进行统计,

  记住javaeye.com和biaowen.javaeye.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里组装好后收集时是,最后在输出的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.javaeye.com],

  title=[biaowen - JavaEye技术网站],

  host=[biaowen.javaeye.com],

  segment=[20090725083125],

  digest=[063ba8430fa84e614ce71276e176f4ce],

  tstamp=[20090725003318265],

  url=[http://biaowen.javaeye.com/]}

  八、 org.apache.nutch.crawl.DeleteDuplicates:

  这个类的作用就是这它的名字所写的意思--去重。

  前面索引后(当然不是一次时的情况)会有重复,所以要去重。为什么呢,在一次索引时是不重复的,可是多次抓取后就会有重复了。

  就是这个原因才要去重。当然去重的规则有两种一个是以时间为标准,一种是以内容的md5值为标准。

  九、org.apache.nutch.indexer.IndexMerger:

  这个类就相对简单了,目的将多个indexes合并为一个index,直接调用lucene方法实现!

时间: 2024-08-04 02:10:19

nutch源代码阅读心得的相关文章

OpenJDK 源代码阅读之 Collections

概要 类继承关系 java.lang.Object java.util.Collections 定义 public class Collections extends Object 实现 sort public static <T extends Comparable<? super T>> void sort(List<T> list) { Object[] a = list.toArray(); Arrays.sort(a); ListIterator<T&g

Notepad++源代码阅读——窗口元素组织与布局

1.1 前言 这两天在看notepad++ 1.0版本的源代码.看了许久终于把程序的窗口之间的关系搞清楚了现在把其组织的要点写于此,希望对大家有所帮助. 1.2 窗口元素之间的关系 Notepad++主要有以下窗口元素(见下图). 其中Notepad_plus 是程序的主要窗口,其他:工具栏.状态栏.主次编辑窗口.主次选项卡窗口以及对话框窗口均为主窗口的子窗口.     _mainDocTab 和 _subDocTab 为 类:DocTabView 其成员_pView 分别指向 _mainEdi

Linux-0.11源代码阅读一 加载操作系统

x86系列CPU可以在16位实模式和32位保护模式下运行,实模式的特点是地址总线只有20位,也就是只有1MB的寻址空间,为了兼容老的CPU,Intel x86系列CPU包括最新的CPU在上电时都运行在16位的实模式下,同时在硬件上强行将CS置成0xF000,IP置成0xFFF0,那么CS:IP就指向0xFFFF0这个地址,也就是上电瞬间代码从该处开始执行,而BIOS恰恰就存储在这个地方,可以想象一下,如果连BIOS都没有将会是一个什么结果. BIOS程序被存储在计算机主板上的一块ROM芯片里,首

linux0.11 源代码阅读记录

*/--> pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;}

淘宝数据库OceanBase SQL编译器部分 源代码阅读--生成物理查询计划

SQL编译解析三部曲分为:构建语法树,制定逻辑计划,生成物理运行计划. 前两个步骤请參见我的博客<<淘宝数据库OceanBase SQL编译器部分 源代码阅读--解析SQL语法树>>和<<淘宝数据库OceanBase SQL编译器部分 源代码阅读--生成逻辑计划>>.这篇博客主要研究第三步,生成物理查询计划. 一. 什么是物理查询计划 与之前的阅读方法一致,这篇博客的两个主要问题是what 和how.那么什么是物理查询计划?物理查询计划可以直接运行并返回数据

commons-io源码阅读心得

FileCleanTracker: 开启一个守护线程在后台默默的删除文件. 1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ow

TLD matlab源代码阅读(2)

今天继续,下面是开始要生成正负例来训练分类器了,首先: // TRAIN DETECTOR ========================================================== // Initialize structures tld.imgsize = size(tld.source.im0.input); //为fern准备的训练集 tld.X = cell(1,length(tld.source.idx)); //training data for fern

Linux-0.11源代码阅读二 实模式到保护模式

bootsect部分已经执行完成,程序也跳转到setup部分: start: ! ok, the read went well so we get current cursor position and save it for ! posterity. mov ax,#INITSEG ! this is done in bootsect already, but... mov ds,ax mov ah,#0x03 ! read cursor pos xor bh,bh int 0x10 ! sa

【转】Tomcat总体结构(Tomcat源代码阅读系列之二)

本文是Tomcat源代码阅读系列的第二篇文章,我们在本系列的第一篇文章:在IntelliJ IDEA 和 Eclipse运行tomcat 7源代码一文中介绍了如何在intelliJ IDEA 和 Eclipse中运行Tomcat源代码,本文介绍一下Tomcat的总体结构. 本文没有特别指明的地方,源代码都是针对tomcat7.0.42来说. Tomcat的总体结构 Tomcat即是一个Http服务器也是一个Servlet容器,它的总体结构我们可以用下图来描述: 通过上图我们可以看出Tomcat中