fetcher 是生产者和消费者的模式,生产者是QueueFeeder 不断的读取文件,消费者是
FetcherThread 不断的抓取网址 map是输入是crawl/segments/具体的segment/crawl_generate
QueueFeeder
QueueFeeder 是一个线程类,主要做了一下事情
1 根据配置属性fetcher.timelimit.mins ,这个值表示将来的一个时间,如果这个值是-1 则表明这个线程没有过期时间,如果不是-1 则每次循环都判断是否过期,如果过期了就不往下操作,
2 QueueFeeder有一个FetchItemQueues 属性 是要抓取的url的容器,查看他的容量是不是超过设置的属性size,如果超过则sleep(1000),然后重新循环
3 如果还有数据就不断的读取数据放到FetchItemQueues 里面去,容器中的队列是按ip或者域名分组,是由fetcher.threads.per.host.by.ip 这个属性决定的
FetcherThread也是一个线程类
1 FetcherThread 从fetchQueues取出一条记录,这个记录不为空往下执行
2 根据url找到协议解析的插件
3 根据2得到的协议插件如果是http协议则通过socket 得到roboots.txt文件,这个是协议文件,规定哪些url是可以访问的哪些是不可以访问的 ,如果没有这个文件,则是没有协议的
4 查看当前的url是否允许访问,如果不允许,则写入(写入参考步骤7)
5 查看roboots.txt sCrawl-delay 这个属性是否有设置,如果有,和配置fetcher.max.crawl.delay属性比较,如果不超过这个值,往下执行,否则进入下一次数据的处理
6 更加3得到的插件发送请求。根据配置 protocol.plugin.check.robots查看是不是要坚持roboots协议,是,检查,不允许访问返回。如果roboots.txt有设置crawlDelayd大于0取这个crawlDelayd,否则取fetcher.server.delay配置的值,以秒为单位,如果设置protocol.plugin.check.robots 为true,并且设置fetcher.max.crawl.delay的值大于0,则比较fetcher.max.crawl.delay 值和crawlDelayd的大小,小于,则返回。如果protocol.plugin.check.blocking 为true,就会看是否delay,发送socket请求得到返回结果
7根据返回状态,解析结果,如果为ProtocolStatus.SUCCESS ,请求成功 ,设置CrawlDatum的状态为CrawlDatum.STATUS_FETCH_SUCCESS,设置fetchtime为当前时间,设置CrawlDatum 的元数据Nutch.WRITABLE_PROTO_STATUS_KEY为ProtocolStatus,设置content的segment metadata.set(Nutch.SEGMENT_NAME_KEY, segmentName);设置content的元数据的分数为CrawlDatum 元数据的分数,使用parseUtil解析content数据这个类会根据content的contentType,查找解析插件HtmlParser,这个会利用多线程Callable和FutureTask,返回解析结果,设置content的元数据的Nutch.FETCH_STATUS_KEY fetch—status,
写入数据key:Text 是url,value:NutchWritable ,new NutchWritable(datum)。在reduce的阶段会被写入特定的目录,如果设置fetcher.store.content
为true,写入content,key:Text 是url,value:NutchWritable ,new NutchWritable(content),设置Parse的元数据的 segment,fetchtime,签名,设置crawldatum的签名,设置parse的元数据的分数,为content的元数据的分数,key:Text 是url,value:NutchWritable : new NutchWritable(
new ParseImpl(new ParseText(parse.getText()),
parse.getData(), parse.isCanonical()))
9 没有显示的reduce,使用默认的reducer的,输出的目录为crawl_home/segments/当前的segment/ 下面,FetcherOutputFormat会根据不同的类型写入不同的目录,
代码如下 CrawlDatum会写在当前segment的crawl_fetch目录,Content会写在content目录,
if (w instanceof CrawlDatum)
fetchOut.append(key, w);
else if (w instanceof Content)
contentOut.append(key, w);
else if (w instanceof Parse)
parseOut.write(key, (Parse)w);
}
Parse 又会根据ParseOutputFormat 写到不同目录
parse_text 目录写入key:Text url value:ParseText
得到Parse 的签名,如果转换成二进制不为空,则在crawl_parse写入,key:Text为url,value:CrawlDatum,如果db.parsemeta.to.crawldb配置的值需要值,从ParseData的元数据取出也写入 crawl_parse目录,写入
CrawlDatum newDatum = new CrawlDatum();
newDatum.setStatus(CrawlDatum.STATUS_LINKED);
if (reprUrl != null && !reprUrl.equals(newUrl)) {
newDatum.getMetaData().put(Nutch.WRITABLE_REPR_URL_KEY,
new Text(reprUrl));
}
crawlOut.append(new Text(newUrl), newDatum);
根据外链计算分数,写入
if (adjust != null) crawlOut.append(key, adjust);
根据db.max.outlinks.per.page这个配置,允许的最大的外链调整,进去外链调整,并对外链做normalize和filter,写入parse_data 目录key:Text url value:ParseData
写入
if (!parse.isCanonical()) {
CrawlDatum datum = new CrawlDatum();
datum.setStatus(CrawlDatum.STATUS_FETCH_SUCCESS);
String timeString = parse.getData().getContentMeta().get(Nutch.FETCH_TIME_KEY);
try {
datum.setFetchTime(Long.parseLong(timeString));
} catch (Exception e) {
LOG.warn("Can't read fetch time for: " + key);
datum.setFetchTime(System.currentTimeMillis());
}
crawlOut.append(key, datum);
}
- 大小: 68.3 KB
- 大小: 252 KB
- 大小: 175.1 KB
分享到:
相关推荐
分布式搜索引擎Nutch开发详解 Nutch是一款开源的、基于Java实现的全文搜索引擎,它主要用于构建大规模的网络爬虫系统,并提供了对抓取的网页进行索引和搜索的功能。Nutch与Hadoop紧密集成,能够充分利用分布式计算...
【Nutch 0.8 知识点详解】 Nutch 是一个开源的、基于 Lucene 的网络搜索引擎项目,它提供了一套完整的搜索引擎解决方案,包括网页抓取、索引和搜索功能。Nutch 0.8 版本尤其值得关注,因为它完全使用 Hadoop 进行了...
Nutch的工作流程主要包括以下几个阶段:注入(Injector)、生成抓取URL(Generator)、网页抓取(Fetcher)、网页解析(ParseSegment)、数据库更新(CrawlDb)、链接数据库处理(LinkDb)以及索引构建(Indexer)。...
### Nutch工作流程详解 #### 一、Nutch概述及工作流程概览 Nutch是一款开源的网络爬虫项目,其主要功能在于抓取互联网上的网页,并对其进行分析、索引,以便用户能够快速检索到所需的信息。Nutch的灵活性和可扩展...
**Nutch搜索引擎配置详解** Nutch是一款开源的网络爬虫软件,主要用于收集、索引和搜索互联网上的数据。它在大数据领域中占有重要地位,尤其对于构建自定义搜索引擎的项目非常实用。Nutch的设计理念是模块化,允许...
**Nutch 命令详解** 1. **Crawl 命令** `bin/nutch crawl <urlDir> [-dir d] [-threads n] [-depth i] [-topN]` - `<urlDir>`: 包含初始 URL 列表的文件夹。 - `[-dir ]`: 指定爬取记录的工作目录,默认为 `./...
【Nutch入门学习资料详解】 Nutch是一款开源的网络爬虫软件,主要用于抓取和索引互联网上的网页,是大数据领域中的重要工具之一。本文将深入解析Nutch的基础知识,帮助初学者快速入门。 1. **Nutch简介** Nutch是...
### Nutch性能测试报告(单机模式)知识点详解 #### 一、测试概述与环境配置 **测试背景:** Nutch是一款开源的网络爬虫项目,它可以用来抓取互联网上的网页,并提供强大的搜索引擎功能。本报告针对Nutch在单机...
### IT知识点解析:Ubuntu下Nutch配置安装及使用详解 #### 一、环境搭建与配置 **1. Java环境安装** - **下载JDK**: 需要下载适合Ubuntu 10.0版本的JDK文件,本例中下载的是`jdk-6u24-linux-i586.bin.tar.gz`。 -...
### Nutch Param Set详解 Nutch 是一个高度可扩展且开放源码的网络爬虫项目,主要用于抓取和索引互联网上的数据。本篇将基于提供的文件内容对 Nutch 的参数设置进行深入解析,帮助读者更好地理解 Nutch 中各个组件...
- **Parser**:如Nutch、Droids和Tika等项目,常选择TagSoup和nekohtml,两者各有优缺点,具体使用需根据需求测试。 - **Handler**:适配SAX的contenthandler,处理Parser解析出的内容。 4. **优化与扩展**: - ...