关闭

Nutch核心流程

标签: nutch搜索
143人阅读 评论(0) 收藏 举报
分类:

一、 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合并后的完整索引

0
0
查看评论

深入分析nutch的抓取流程

分析Nutch的工作流程 Nutch爬虫工作策略 Nutch爬虫的工作策略一般则可以分为累积式抓取(cumulative crawling)和增量式抓取(incrementalcrawling)两种。 累积式抓取是指从某一个时间点开始,通过遍历的方式抓取系统所能允许存储和处理的...
  • yeahi
  • yeahi
  • 2015-11-09 14:08
  • 4362

Nutch抓取流程

nutch抓取流程 注入起始url(inject)、生成爬取列表(generate)、爬取(fetch)、解析网页内容(parse)、更新url数据库(updatedb) 1:注入起始url(inject) org.apache.nutch.crawl.Injector 注入待抓取URL,因...
  • gywtzh0889
  • gywtzh0889
  • 2017-03-03 17:52
  • 260

【Nutch】Nutch的抓取流程

Nutch的抓取流程。 N.B. 本文最重要的部分在第三节对比部分!
  • moqihao
  • moqihao
  • 2015-08-22 17:10
  • 2462

【Nutch2.2.1基础教程之6】Nutch2.2.1抓取流程

一、抓取流程概述 1、nutch抓取流程 当使用crawl命令进行抓取任务时,其基本流程步骤如下: (1)InjectorJob 开始第一个迭代 (2)GeneratorJob (3)FetcherJob (4)ParserJob (5)DbUpdaterJob (6)SolrIndexerJob ...
  • jediael_lu
  • jediael_lu
  • 2014-08-15 21:39
  • 7853

nutch v1.9源码分析(3)——nutch基本爬取流程

1      nutch基本爬取流程 nutch是大名鼎鼎的Doug Cutting发起的爬虫项目,nutch孵化了现在大数据处理事实上的标准Hadoop。在nutch V 0.8.0 版本之前,Hadoop是nutch的一部分,从nut...
  • spacewalkman
  • spacewalkman
  • 2014-12-03 18:29
  • 2646

nutch的基本工作流程理解

(一):Nutch的工作流程: Crawdb、linkdb 是web link目录,存放url及url的互联关系,作为爬行与重新爬行的依据。 segments 是主目录,存放抓回来的网页。页面内容有bytes[]的raw content 和 parsed ...
  • gaokao2011
  • gaokao2011
  • 2013-12-02 09:53
  • 623

Nutch爬虫引擎使用分析

Nutch2.X主要执行流程: 1)InjectorJob: 从文件中得到一批种子网页,把它们放到抓取数据库中去 2)GeneratorJob:从抓取数据库中产生要抓取的页面放到抓取队列中去 3)FetcherJob:   对抓取队列中的网页进行抓取,在reducer中使用...
  • fjssharpsword
  • fjssharpsword
  • 2016-04-08 17:19
  • 2965

Nutch Crawler工作流程

Nutch Crawler工作流程及文件格式详细分析Crawler和Searcher两部分被尽是分开,其主要目的是为了使两个部分可以布地配置在硬件平台上,例如Crawler和Searcher分别被放置在两个主机上,这样可以极大的提高灵活性和性能。 一、总体介绍:    ...
  • kauu
  • kauu
  • 2007-10-14 09:58
  • 13554

Spring MVC 核心处理流程

一、SpringMVC简介 是一种基于JAVA实现了Web MVC设计模式的请求驱动类型的轻量级Web框架。 解析: 1、MVC架构模式的思想:将Web层进行指责解耦 2、基于请求驱动:请求-相应模型 3、框架的目的:简化开发 二、web.xml配置说明 1...
  • lzxadsl
  • lzxadsl
  • 2015-11-29 10:56
  • 3936

Spring_MVC基本核心流程

Spring_MVC基本核心流程:1. HttpRequest1.1 请求传送 (DispatcherServlet)1.1.1 请求分发 (SimpleUrlHandlerMapping)1.1.1.1 数据绑定与验证 (Act...
  • zxr85
  • zxr85
  • 2010-05-01 15:48
  • 5098
    个人资料
    • 访问:2535次
    • 积分:62
    • 等级:
    • 排名:千里之外
    • 原创:3篇
    • 转载:4篇
    • 译文:0篇
    • 评论:2条
    文章分类
    文章存档
    最新评论