细细品味 nutch - xiapistudio.com · 细细品味nutch ——nutch 搜索引擎(第5期) 精...

28
细细品味 Nutch ——Nutch 搜索引擎(第 5 期) csAxp http://www.xiapistudio.com/ 2012 年 4 月 19 日

Upload: docong

Post on 23-Apr-2018

251 views

Category:

Documents


11 download

TRANSCRIPT

Page 1: 细细品味 Nutch - xiapistudio.com · 细细品味Nutch ——Nutch 搜索引擎(第5期) 精 华 集 锦 csAxp  2012 年4 月19 日

细细品味 Nutch ——Nutch 搜索引擎(第 5 期)

csAxp

http://www.xiapistudio.com/

2012 年 4 月 19 日

Page 2: 细细品味 Nutch - xiapistudio.com · 细细品味Nutch ——Nutch 搜索引擎(第5期) 精 华 集 锦 csAxp  2012 年4 月19 日

创建时间:2012/4/19 修改时间:2012/4/21 修改次数:0

中国·北京——虾皮工作室(www.xiapistudio.com) 编辑:虾皮 1

目录

1、本期内容.................................................................................................................. 2

1.1 Nutch 基本原理 ................................................................................................ 2

1.1.1 Nutch 基本组成 ...................................................................................... 2

1.1.2 Nutch 工作流程 ...................................................................................... 3

1.2 Nutch 流程详解 ................................................................................................ 6

1.2.1 Nutch 数据流程 ...................................................................................... 6

1.2.2 Nutch 流程分析 ...................................................................................... 8

2、参考文献................................................................................................................ 26

3、打赏小编................................................................................................................ 27

Page 3: 细细品味 Nutch - xiapistudio.com · 细细品味Nutch ——Nutch 搜索引擎(第5期) 精 华 集 锦 csAxp  2012 年4 月19 日

创建时间:2012/4/19 修改时间:2012/4/21 修改次数:0

中国·北京——虾皮工作室(www.xiapistudio.com) 编辑:虾皮 2

Nutch 搜索引擎(第 5 期)

——Nutch 浅入分析

1、本期内容

1.1 Nutch 基本原理

1.1.1 Nutch 基本组成

搜索引擎系统通常是指互联网网页信息检索系统。搜索引擎收集了成百上千乃至几十

亿的网页。搜索引擎程序自动对网页内容进行分析,通过分词程序得到的语素关键词,经过

索引加载建立索引数据库。用户通过 Web 页面查询索引数据库,返回的结果中包含了所有

匹配检索关键词的页面。得到的搜索结果利用网页的重要性和关键字匹配的算法进行排序,

排序结果按照相关度高低依次排序。

互联网搜索引擎通常由 5 个主要环节构成。系统主要模块包括:网页信息的抓取、网页

内容分析、网页索引建立、网页检索结果排序、网页检索工具与接口。主要功能模块结合其

他中文信息处理和信息检索技术,完成整个网页搜素引擎。基本结构如图 1.1-1 所示。

图 1.1-1 搜索引擎技术框架

搜索引擎的 5 个组成部分功能如下:

网页信息抓取:从互联网上不断发现新的链接,采集页面作为建立索引的原材料。

网页内容分析:负责对采集的网页进行分析,提取其中的关键词。

网页索引建立:为网页和分析得到的文本建立一个可供检索的索引库。

网页索引结果排序:通过链接分析、PageRank 算法对检索结果排序。

页面检索工具与接口:为用户提供访问途径,帮助用户通过系统界面获得结果。

Nutch 作为一个搜索引擎,其基本组成也同其他搜索引擎一样。其中“网页信息抓取”

Page 4: 细细品味 Nutch - xiapistudio.com · 细细品味Nutch ——Nutch 搜索引擎(第5期) 精 华 集 锦 csAxp  2012 年4 月19 日

创建时间:2012/4/19 修改时间:2012/4/21 修改次数:0

中国·北京——虾皮工作室(www.xiapistudio.com) 编辑:虾皮 3

和“网页内容分析”由 Nutch 实现,而“网页索引建立”、“网页索引结果排序”和“页面检

索工具与接口”由 Solr 实现。

备注:在 Nutch1.3 之前,搜索引擎的 5 个部分都是由 Nutch 实现,在 Nutch1.3 之后,

把索引的建立以及搜索交由 Solr 实现。

1.1.2 Nutch 工作流程

在《第 3 期_Nutch 简单应用》和《第 4 期_Eclipse 开发配置》,我们已经按照 Nutch 工

作流程进行了抓取网页,并进行了检索。下面是 Nutch1.3 之前工作流程,对它分析对我们

理解新的 Nutch 依然有很好的帮助。下面,根据图中的流程将 Nutch 的工作流程分为两个部

分进行综述。以 index 为分隔线,因为第一部分,在左侧,是抓取网页并分析处理;第二部

分是基于 index 索引库提供检索功能。

图 1.2-1 Nutch 工作流程

Nutch 工作流程分析

第一部分流程综述:

1.)inject start urls

注入抓取 URL。因为 Nutch 的抓取程序要抓取网页,而定位到某个(或者某些)网页

需要指定一个 URL,在此基础上,Nutch 按照广度遍历策略进行抓取,会根据一开始指定的

URL(可以是一个 URL 集合:URLs),以此为基础进行抓取工作。

2.)generate segment

Page 5: 细细品味 Nutch - xiapistudio.com · 细细品味Nutch ——Nutch 搜索引擎(第5期) 精 华 集 锦 csAxp  2012 年4 月19 日

创建时间:2012/4/19 修改时间:2012/4/21 修改次数:0

中国·北京——虾皮工作室(www.xiapistudio.com) 编辑:虾皮 4

生成 segment。Nutch 抓取程序需要抓取到很多的页面,那么具体是哪些页面的?当然,

在互联网上是通过 URL 来定位的。这一步骤主要是对上一步提交的 URL 集合进行分析,确

定抓取任务的详细信息。

fetch list

分析提交的 URL 集合之后,建立一个抓取任务列表。在以后的抓取工作中就可以根据

预处理的此列表进行工作了。

www

这是通过访问万维网(www),实现抓取工作。

3.)fetch content

开始根据前面生成的抓取任务列表中指定的 URL 对应的页面,这时候开始抓取工作了。

fetched content

需要将抓取到的这些页面文件存放到指定的位置,这些页面文件可以是经过简单预处理

以后而被存储到文件系统中,也可以是原生的网页文件,以备后继流程基于这些文件来进一

步处理,比如分词,建立索引。

content parser

内容解析器。抓取到的页面文件被提交到这里,实现对页面文件的处理,包括页面文件

的分析和处理。

4.)parse content

当然,我们抓取的数据是结构和内容非常复杂的数据,而我们感兴趣的主要是文件的内

容,因为基于关键字检索的搜索引擎的实现,都是根据文本内容来实现的。

parsed text & data

通过 content parser 解析器,最终获取到的就是文本内容和其它一些可能需要用到的数

据。有了这些可以识别的文本内容和数据,就可以基于此来建立索引库,而且需要将本次抓

取任务的详细信息登录到 CrawlDB,为下次抓取任务提供有用的信息(比如:避免重复抓取

相同的 URL 指定的页面)。

因此接下来分为两个方向:一个是索引,一个是更新 CrawlDB 并继续执行抓取任务。

indexing

Page 6: 细细品味 Nutch - xiapistudio.com · 细细品味Nutch ——Nutch 搜索引擎(第5期) 精 华 集 锦 csAxp  2012 年4 月19 日

创建时间:2012/4/19 修改时间:2012/4/21 修改次数:0

中国·北京——虾皮工作室(www.xiapistudio.com) 编辑:虾皮 5

这是一个索引的过程,对分析处理完成并提交的文本及其数据建立索引,通过索引文件

就可以实现信息的检索功能了。建立索引过程中,由于是基于Lucene的,所以用到了Analyzer

分析器,对预处理的文件进行分析、过滤、分词等等,最后将写入到索引库,供搜索程序工

作使用。

update crawlDB with new extracted urls

根据网页分析处理获取到的信息,更新 CrawlDB(爬行数据库),并根据提取到的抓取

任务已经注入的 URLS 循环执行抓取任务。

第二部分流程综述:

这部分比较简单了,就是启动 Web 服务器,为用户提供检索服务。

这里,用户可以直接通过输入检索关键字,使用 Lucene 对用户检索关键字进行处理调

用 Nutch 的搜索程序,基于索引库中存储的信息,来提取满足用户检索需求的信息。

Nutch 工作流程总结

抓取程序工作流程

(1) 建立初始 URL 集

(2) 将 URL 集注入 crawldb 数据库---inject

这一步骤,上面的图中没有涉及到。既然需要维护一个 crawlDB,那么在任何时候只要

与抓取任务有关的而且是有用的信息都会被写入 crawlDB 的。

(3.) 根据 crawldb 数据库创建抓取列表---generate

(4.) 执行抓取,获取网页信息---fetch

(5.) 更新数据库,把获取到的页面信息存入数据库中---updatedb

(6.) 重复进行 3~5 的步骤,直到预先设定的抓取深度。---这个循环过程被称为“产生/抓取

/更新”循环

(7.) 根据 sengments 的内容更新 linkdb 数据库---invertlinks

(8.) 建立索引---index

搜索程序工作流程

(1.) 用户通过用户接口进行查询操作

(2.) 将用户查询转化为 lucene 查询

(3.) 从索引库中提取满足用户检索需求的结果集

(4.) 返回结果

Nutch 抓取目录分析

一共生成 5 个文件夹,分别是:

crawldb 目录存放下载的 URL,以及下载的日期,用来页面更新检查时间。

Page 7: 细细品味 Nutch - xiapistudio.com · 细细品味Nutch ——Nutch 搜索引擎(第5期) 精 华 集 锦 csAxp  2012 年4 月19 日

创建时间:2012/4/19 修改时间:2012/4/21 修改次数:0

中国·北京——虾皮工作室(www.xiapistudio.com) 编辑:虾皮 6

linkdb 目录存放 URL 的互联关系,是下载完成后分析得到的。

segments 目录存放抓取的页面,下面子目录的个数于获取的页面层数有关系,通常

每一层页面会独立存放一个子目录,子目录名称为时间,便于管理。比如我这只抓

取了一层页面就只生成了 20090508173137 目录。每个子目录里又有 6 个子文件夹

如下:

content:每个下载页面的内容。

crawl_fetch:每个下载 URL 的状态。

crawl_generate:待下载 URL 集合。

crawl_parse:包含来更新 crawldb 的外部链接库。

parse_data:包含每个 URL 解析出的外部链接和元数据。

parse_text:包含每个解析过的 URL 的文本内容。

indexs:存放每次下载的独立索引目录。

index:符合 Lucene 格式的索引目录,是 indexs 里所有 index 合并后的完整索引。

备注:上面是 Nutch1.3 之前的流程,在 Nutch1.3 之后改变比较大,从建立索引之后的

工作交由 Solr 来实现,并且在 Nutch 生成的目录中也只有 crawldb、linkdb 和 segments 三个

目录,而在 Solr 目录有 spellchecker 和 index 两个目录。之前的 indexs 和 index 已经不存在。

1.2 Nutch 流程详解

我们研究的 Nutch 版本为 1.4,本小节将以“全网爬行”分步骤分析 Nutch 流程,并对

每个过程产生的结果进行分析。

1.2.1 Nutch 数据流程

图 2.1-1 Nutch 数据流图

上面是执行下面命令时 Nutch 的数据走向。

urls Injector

segements

crawldb

time

crawl_generate

time

content

crawl_fetch

Generator

time

crawl_parseparse_dataparse_text

Fetcher

ParseSegment

CrawlDb::update

LinkDb::invert

linkdb

SolrIndexer::indexSolr

solrUrl

index

SolrDeleteDuplicates::dedup

1 2

4

5

6

3

7

8

CrawlDbUpdater

Page 8: 细细品味 Nutch - xiapistudio.com · 细细品味Nutch ——Nutch 搜索引擎(第5期) 精 华 集 锦 csAxp  2012 年4 月19 日

创建时间:2012/4/19 修改时间:2012/4/21 修改次数:0

中国·北京——虾皮工作室(www.xiapistudio.com) 编辑:虾皮 7

nutch crawl urls -dir crawl -depth 5 -threads 5 -topN 100

nutch solrindex http://localhost:8080/solr/ crawl/crawldb -linkdb crawl/linkdb crawl/segments/*

nutch crawl urls -solr http://localhost:8080/solr/ -depth 3 -topN 5

流程入口 org.apache.nutch.crawl 包中 Crawl.java 类,Crawl::run 里面的很多类中都使用

了 MapReduce 框架进行数据处理。

下面 Crawl::run 方法中一段代码:

Path tmpDir = job.getLocalPath("crawl"+Path.SEPARATOR+getDate());

Injector injector = new Injector(getConf());

Generator generator = new Generator(getConf());

Fetcher fetcher = new Fetcher(getConf());

ParseSegment parseSegment = new ParseSegment(getConf());

CrawlDb crawlDbTool = new CrawlDb(getConf());

LinkDb linkDbTool = new LinkDb(getConf());

//【1】initialize crawlDb

injector.inject(crawlDb, rootUrlDir);

int i;

for (i = 0; i < depth; i++) { //【2】generate new segment

Path[] segs = generator.generate(crawlDb, segments, -1, topN, System

.currentTimeMillis());

if (segs == null) {

LOG.info("Stopping at depth=" + i + " - no more URLs to fetch.");

break;

}

fetcher.fetch(segs[0], threads); //【3】fetch it

if (!Fetcher.isParsing(job)) {

parseSegment.parse(segs[0]); //【4】parse it, if needed

}

crawlDbTool.update(crawlDb, segs, true, true); //【5】update crawldb

}

if (i > 0) {

linkDbTool.invert(linkDb, segments, true, true, false); //【6】invert

links

if (solrUrl != null) {

//【7】index

FileStatus[] fstats = fs.listStatus(segments,

HadoopFSUtil.getPassDirectoriesFilter(fs));

Page 9: 细细品味 Nutch - xiapistudio.com · 细细品味Nutch ——Nutch 搜索引擎(第5期) 精 华 集 锦 csAxp  2012 年4 月19 日

创建时间:2012/4/19 修改时间:2012/4/21 修改次数:0

中国·北京——虾皮工作室(www.xiapistudio.com) 编辑:虾皮 8

SolrIndexer indexer = new SolrIndexer(getConf());

indexer.indexSolr(solrUrl, crawlDb, linkDb,

Arrays.asList(HadoopFSUtil.getPaths(fstats)));

//【8】dedup & merge

SolrDeleteDuplicates dedup = new SolrDeleteDuplicates();

dedup.setConf(getConf());

dedup.dedup(solrUrl);

}

下面是图 2.1-1 中出现标记注解。

ulrs:存放待爬取的 urls 种子列表。

Injector:使用 mapreduce 任务将 urls 列表放入 CrawlDb 数据库中(MapFile),期

间会使用配置文件配置的插件进行 url 的归一化和过滤操作。

crawldb:生成的 url 及元数据的 map 库。

Generator:从 crawldb 中逐步获取一部分 url 放入 fetchlist 中,并以 segments 的形

式存放,期间会根据时间戳更新 crawldb 中的 url 状态(CrawlDbUpdate),以避免

重复抓取,并且会给每个 url 打个分,低于配置的阈值的丢弃。

crawl_generate:生成的符合条件的待抓取 ulrs 和元数据。

Fetcher/ParseSegment:fetcher 使用一个生产者,多个消费者的模式,中间使用队

列,生产者(QueueFeeder)往队列里面塞待抓取的 url 数据,多个消费者

(FeatcherThread)从队列中取数据给 fetcher 去抓取 url 对应的网页数据,期间会

根据 robot 协议和 protocal 进行重试,重定向等操作,根据是否解析和存储网页数

据,进行 ParseSegment 操作和存储操作。

crawl_fetch,crawl_parse,parse_text,parse_data,content:抓取到的 url 对应的

网页数据,以不同的形式存放。

LinkDb::invert:根据 url 之间的链接,生成反向链接表 linkdb。

linkdb:生成的反向链接表。

CrawlDb::update:从 featcher 的输出,其中有新的 url,更新 crawldb。

SolrIndexer::indexSolr:调用 solr 的建索引接口,使用生成的 linkdb,crawldb,

segments数据以及 solr中的字段配置 solr/example/solr/conf/schema.xml信息建索引。

index:生成的索引。

SolrDeleteDuplicates::dedup:去重,同一 digest 的 doc,保持 boost 最高的,boost

最高的有多条,保留时间戳最新的。

1.2.2 Nutch 流程分析

下面我们将一步一步进行爬取网页,并最后建立索引,分析每一步产生的结果。在此之

前我们在项目的根目录下创建“urls”文件夹,并在里面创建文件“urls.txt”,写上我们的 URL

种子列表,我们这里仅仅为了说明 Nutch 工作流程,所以里面的内容只有一条,即:

http://www.hebut.edu.cn/

备注:为了使文档内容更全面,所以命名是在使用部署在 Linux 上的 Nutch,而执行每

Page 10: 细细品味 Nutch - xiapistudio.com · 细细品味Nutch ——Nutch 搜索引擎(第5期) 精 华 集 锦 csAxp  2012 年4 月19 日

创建时间:2012/4/19 修改时间:2012/4/21 修改次数:0

中国·北京——虾皮工作室(www.xiapistudio.com) 编辑:虾皮 9

一步却是在 Windows 上 Eclipse 中。

第一步:初始化 CrawlDB,注入初始 url。

命名:

类名:

package org.apache.nutch.crawl;

public class Injector extends Configured implements Tool

执行:

选中项目右击选择“Run AsRun Configurations”,从中找到“Java Application”,然

后右击选择“New”,在 Main Class 选择“org.apache.nutch.crawl.Injector”,将名字命名为

“Injector”。接着上面在“Arguments”选项卡中按下面进行填写,然后点击“Apply 与 Run”。

Program Arguments:crawl/crawldb urls

VM arguments:-Dhadoop.log.dir=logs -Dhadoop.log.file=hadoop.log

输出:

Injector: starting at 2012-04-21 16:22:08

Injector: crawlDb: crawl/crawldb

Injector: urlDir: urls

Injector: Converting injected urls to crawl db entries.

Injector: Merging injected urls into crawl db.

Injector: finished at 2012-04-21 16:22:14, elapsed: 00:00:05

效果:

第二步:查看刚才 crawldb 中的生成数据。

命名:

类名:

Page 11: 细细品味 Nutch - xiapistudio.com · 细细品味Nutch ——Nutch 搜索引擎(第5期) 精 华 集 锦 csAxp  2012 年4 月19 日

创建时间:2012/4/19 修改时间:2012/4/21 修改次数:0

中国·北京——虾皮工作室(www.xiapistudio.com) 编辑:虾皮 10

package org.apache.nutch.crawl;

public class CrawlDbReader implements Closeable

执行:

选中项目右击选择“Run AsRun Configurations”,从中找到“Java Application”,然

后右击选择“New”,在 Main Class 选择“org.apache.nutch.crawl.CrawlDbReader”,将名字

命名为“CrawlDbReader”。接着上面在“Arguments”选项卡中按下面进行填写,然后点击

“Apply 与 Run”。

Program Arguments:crawl/crawldb -stats -dump crawldb_info

VM arguments:-Dhadoop.log.dir=logs -Dhadoop.log.file=hadoop.log

输出:

CrawlDb statistics start: crawl/crawldb

Statistics for CrawlDb: crawl/crawldb

TOTAL urls: 1

retry 0: 1

min score: 1.0

avg score: 1.0

max score: 1.0

status 1 (db_unfetched): 1

CrawlDb statistics: done

CrawlDb dump: starting

CrawlDb db: crawl/crawldb

CrawlDb dump: done

效果:

http://www.hebut.edu.cn/ Version: 7

Status: 1 (db_unfetched)

Fetch time: Sat Apr 21 16:22:09 CST 2012

Modified time: Thu Jan 01 08:00:00 CST 1970

Retries since fetch: 0

Retry interval: 2592000 seconds (30 days)

Score: 1.0

Signature: null

Metadata:

第三步:产生新的抓取 urls。

Page 12: 细细品味 Nutch - xiapistudio.com · 细细品味Nutch ——Nutch 搜索引擎(第5期) 精 华 集 锦 csAxp  2012 年4 月19 日

创建时间:2012/4/19 修改时间:2012/4/21 修改次数:0

中国·北京——虾皮工作室(www.xiapistudio.com) 编辑:虾皮 11

命名:

类名:

package org.apache.nutch.crawl;

public class Generator extends Configured implements Tool

执行:

选中项目右击选择“Run AsRun Configurations”,从中找到“Java Application”,然

后右击选择“New”,在 Main Class 选择“org.apache.nutch.crawl.Generator”,将名字命名

为“Generator”。接着上面在“Arguments”选项卡中按下面进行填写,然后点击“Apply 与

Run”。

Program Arguments:crawl/crawldb crawl/segments

VM arguments:-Dhadoop.log.dir=logs -Dhadoop.log.file=hadoop.log

输出:

Generator: starting at 2012-04-21 16:47:25

Generator: Selecting best-scoring urls due for fetch.

Generator: filtering: true

Generator: normalizing: true

Generator: jobtracker is 'local', generating exactly one partition.

Generator: Partitioning selected urls for politeness.

Generator: segment: crawl/segments/20120421164730

Generator: finished at 2012-04-21 16:47:32, elapsed: 00:00:06

效果:

第四步:对上面产生的 url 进行抓取。

命名:

类名:

Page 13: 细细品味 Nutch - xiapistudio.com · 细细品味Nutch ——Nutch 搜索引擎(第5期) 精 华 集 锦 csAxp  2012 年4 月19 日

创建时间:2012/4/19 修改时间:2012/4/21 修改次数:0

中国·北京——虾皮工作室(www.xiapistudio.com) 编辑:虾皮 12

package org.apache.nutch.fetcher;

public class Fetcher extends Configured implements Tool,

MapRunnable<Text, CrawlDatum, Text, NutchWritable>

执行:

选中项目右击选择“Run AsRun Configurations”,从中找到“Java Application”,然

后右击选择“New”,在 Main Class 选择“org.apache.nutch.fetcher.Fetcher”,将名字命名为

“Fetcher”。接着上面在“Arguments”选项卡中按下面进行填写,然后点击“Apply 与 Run”。

Program Arguments:crawl/segments/20120421164730/

VM arguments:-Dhadoop.log.dir=logs -Dhadoop.log.file=hadoop.log

输出:

Fetcher: Your 'http.agent.name' value should be listed first in 'http.robots.agents' property.

Fetcher: starting at 2012-04-21 16:56:11

Fetcher: segment: crawl/segments/20120421164730

Using queue mode : byHost

Fetcher: threads: 10

Fetcher: time-out divisor: 2

QueueFeeder finished: total 1 records + hit by time limit :0

Using queue mode : byHost

Using queue mode : byHost

Using queue mode : byHost

Using queue mode : byHost

Using queue mode : byHost

Using queue mode : byHost

Using queue mode : byHost

Using queue mode : byHost

Using queue mode : byHost

Using queue mode : byHost

Fetcher: throughput threshold: -1

Fetcher: throughput threshold retries: 5

fetching http://www.hebut.edu.cn/

-finishing thread FetcherThread, activeThreads=1

-finishing thread FetcherThread, activeThreads=1

-finishing thread FetcherThread, activeThreads=1

-finishing thread FetcherThread, activeThreads=1

-finishing thread FetcherThread, activeThreads=1

-finishing thread FetcherThread, activeThreads=1

-finishing thread FetcherThread, activeThreads=1

-finishing thread FetcherThread, activeThreads=1

-finishing thread FetcherThread, activeThreads=1

Page 14: 细细品味 Nutch - xiapistudio.com · 细细品味Nutch ——Nutch 搜索引擎(第5期) 精 华 集 锦 csAxp  2012 年4 月19 日

创建时间:2012/4/19 修改时间:2012/4/21 修改次数:0

中国·北京——虾皮工作室(www.xiapistudio.com) 编辑:虾皮 13

-finishing thread FetcherThread, activeThreads=0

-activeThreads=0, spinWaiting=0, fetchQueues.totalSize=0

-activeThreads=0

Fetcher: finished at 2012-04-21 16:56:17, elapsed: 00:00:05

效果:

第五步:对上面的结果进行解析。

命名:

类名:

package org.apache.nutch.parse;

public class ParseSegment extends Configured implements Tool,

Mapper<WritableComparable, Content, Text, ParseImpl>,

Reducer<Text, Writable, Text, Writable>

执行:

选中项目右击选择“Run AsRun Configurations”,从中找到“Java Application”,然

后右击选择“New”,在 Main Class 选择“org.apache.nutch.parse.ParseSegment”,将名字命

名为“ParseSegment”。接着上面在“Arguments”选项卡中按下面进行填写,然后点击“Apply

与 Run”。

Program Arguments:crawl/segments/20120421164730/

VM arguments:-Dhadoop.log.dir=logs -Dhadoop.log.file=hadoop.log

输出:

Page 15: 细细品味 Nutch - xiapistudio.com · 细细品味Nutch ——Nutch 搜索引擎(第5期) 精 华 集 锦 csAxp  2012 年4 月19 日

创建时间:2012/4/19 修改时间:2012/4/21 修改次数:0

中国·北京——虾皮工作室(www.xiapistudio.com) 编辑:虾皮 14

ParseSegment: starting at 2012-04-21 17:08:12

ParseSegment: segment: crawl/segments/20120421164730

Parsing: http://www.hebut.edu.cn/

ParseSegment: finished at 2012-04-21 17:08:17, elapsed: 00:00:04

效果:

第六步:查看 segments 中的生成数据。

命名:

类名:

package org.apache.nutch.segment;

public class SegmentReader extends Configured implements

Reducer<Text, NutchWritable, Text, Text>

执行:

选中项目右击选择“Run AsRun Configurations”,从中找到“Java Application”,然

Page 16: 细细品味 Nutch - xiapistudio.com · 细细品味Nutch ——Nutch 搜索引擎(第5期) 精 华 集 锦 csAxp  2012 年4 月19 日

创建时间:2012/4/19 修改时间:2012/4/21 修改次数:0

中国·北京——虾皮工作室(www.xiapistudio.com) 编辑:虾皮 15

后右击选择“New”,在 Main Class 选择“org.apache.nutch.segment.SegmentReader”,将名

字命名为“SegmentReader”。接着上面在“Arguments”选项卡中按下面进行填写,然后点

击“Apply 与 Run”。

Program Arguments:-dump crawl/segments/20120421164730 segment_info

VM arguments:-Dhadoop.log.dir=logs -Dhadoop.log.file=hadoop.log

输出:

SegmentReader: dump segment: crawl/segments/20120421164730

SegmentReader: done

效果:

上面是把“crawl/segments/20120421164730”中所有的内容全部输出,但是并能解开我

们心中的疑团,我们要知道每个文件夹到底存的是什么内容。那么在“Program Arguments”

参数除了上面的命令之外再加上以下辅助参数。

-nocontent -nofetch -nogenerate -noparse -noparsedata -noparsetext

1)查看“crawl_generate”内容

参数设置:

Program Arguments:-dump crawl/segments/20120421164730 segment_info -nocontent -nofetch -

noparse -noparsedata -noparsetext

内容详情:

Recno:: 0

URL:: http://www.hebut.edu.cn/

CrawlDatum::

Version: 7

Status: 1 (db_unfetched)

Fetch time: Sat Apr 21 16:22:09 CST 2012

Modified time: Thu Jan 01 08:00:00 CST 1970

Retries since fetch: 0

Retry interval: 2592000 seconds (30 days)

Score: 1.0

Page 17: 细细品味 Nutch - xiapistudio.com · 细细品味Nutch ——Nutch 搜索引擎(第5期) 精 华 集 锦 csAxp  2012 年4 月19 日

创建时间:2012/4/19 修改时间:2012/4/21 修改次数:0

中国·北京——虾皮工作室(www.xiapistudio.com) 编辑:虾皮 16

Signature: null

Metadata: _ngt_: 1334998045804

2)查看“content”内容

参数设置:

Program Arguments:-dump crawl/segments/20120421164730 segment_info -nofetch -nogenerate

-noparse -noparsedata -noparsetext

内容详情:

Recno:: 0

URL:: http://www.hebut.edu.cn/

Content::

Version: -1

url: http://www.hebut.edu.cn/

base: http://www.hebut.edu.cn/

contentType: application/xhtml+xml

metadata: ETag="930a-8b3d67c0" Date=Sat, 21 Apr 2012 08:56:13 GMT Content-Length=26258

Last-Modified=Fri, 20 Apr 2012 23:21:11 GMT nutch.crawl.score=1.0 _fst_=33

nutch.segment.name=20120421164730 Accept-Ranges=bytes Connection=close Content-Type=

text/html Server=Apache/2.2.16 (Unix) PHP/5.3.3

Content:

<html xmlns="http://www.w3.org/1999/xhtml">

.....网页源代码略...............

</html>

3)查看“crawl_fetch”内容

参数设置:

Program Arguments : -dump crawl/segments/20120421164730 segment_info –nocontent -

nogenerate -noparse -noparsedata -noparsetext

内容详情:

Recno:: 0

URL:: http://www.hebut.edu.cn/

CrawlDatum::

Version: 7

Page 18: 细细品味 Nutch - xiapistudio.com · 细细品味Nutch ——Nutch 搜索引擎(第5期) 精 华 集 锦 csAxp  2012 年4 月19 日

创建时间:2012/4/19 修改时间:2012/4/21 修改次数:0

中国·北京——虾皮工作室(www.xiapistudio.com) 编辑:虾皮 17

Status: 33 (fetch_success)

Fetch time: Sat Apr 21 16:56:15 CST 2012

Modified time: Thu Jan 01 08:00:00 CST 1970

Retries since fetch: 0

Retry interval: 2592000 seconds (30 days)

Score: 1.0

Signature: null

Metadata: _ngt_: 1334998045804_pst_: success(1), lastModified=0

4)查看“crawl_parse”内容

参数设置:

Program Arguments:-dump crawl/segments/20120421164730 segment_info -nocontent -nofetch -

nogenerate -noparsedata -noparsetext

内容详情:

Recno:: 0

URL:: http://apps.hebut.edu.cn/bks_lqjg/2009zjb.asp

CrawlDatum::

Version: 7

Status: 67 (linked)

Fetch time: Sat Apr 21 17:08:16 CST 2012

Modified time: Thu Jan 01 08:00:00 CST 1970

Retries since fetch: 0

Retry interval: 2592000 seconds (30 days)

Score: 0.022222223

Signature: null

Metadata:

.......略.......

Recno:: 5

URL:: http://www.hebut.edu.cn/

CrawlDatum::

Version: 7

Status: 65 (signature)

Fetch time: Sat Apr 21 17:08:16 CST 2012

Modified time: Thu Jan 01 08:00:00 CST 1970

Retries since fetch: 0

Retry interval: 0 seconds (0 days)

Score: 0.0

Page 19: 细细品味 Nutch - xiapistudio.com · 细细品味Nutch ——Nutch 搜索引擎(第5期) 精 华 集 锦 csAxp  2012 年4 月19 日

创建时间:2012/4/19 修改时间:2012/4/21 修改次数:0

中国·北京——虾皮工作室(www.xiapistudio.com) 编辑:虾皮 18

Signature: 4000b8eb911bd610b1b74d18c35f7adf

Metadata:

.......略.......

备注:观察上面两个的不同,一个已经抓取,另一个没有没有抓取,其余省略的都和那

个没有抓取的大致一样。

5)查看“parse_data”内容

参数设置:

Program Arguments:-dump crawl/segments/20120421164730 segment_info -nocontent -nofetch -

nogenerate -noparse -noparsetext

内容详情:

Recno:: 0

URL:: http://www.hebut.edu.cn/

ParseData::

Version: 5

Status: success(1,0)

Title: ::欢迎光临河北工业大学::

Outlinks: 45

outlink: toUrl: http://eweb.hebut.edu.cn anchor: English Version

outlink: toUrl: http://www.hebut.edu.cn/html/tupianxinwen anchor: news_more2.jpg

outlink: toUrl: http://www.hebut.edu.cn/html/xiaonaxinwen/201204/20-3909.html anchor: 北京

航空航天大学等七所高校来我校交流...

outlink: toUrl: http://www.hebut.edu.cn/html/xiaonaxinwen/201204/19-3908.html anchor: 美国

圣克劳德州立大学商学院院长来访我...

outlink: toUrl: http://www.hebut.edu.cn/html/xiaonaxinwen/201204/19-3907.html anchor: 英国

伦敦布鲁耐尔大学代表来访我校...

outlink: toUrl: http://www.hebut.edu.cn/html/xiaonaxinwen/201204/19-3906.html anchor: 城市

学院召开迎接河北省学士学位授予权...

......略.......

outlink: toUrl: http://cxzy.hebut.edu.cn anchor: 创先争优活动专题网站

outlink: toUrl: http://xsc.hebut.edu.cn/jiuye/index.asp anchor: 就业网

outlink: toUrl: http://oa.hebut.edu.cn anchor: 校内办公网

outlink: toUrl: http://lib.hebut.edu.cn anchor: 图书馆

outlink: toUrl: http://apps.hebut.edu.cn/bks_lqjg/2009zjb.asp anchor: 2009 年专接本录取结果

查询

Page 20: 细细品味 Nutch - xiapistudio.com · 细细品味Nutch ——Nutch 搜索引擎(第5期) 精 华 集 锦 csAxp  2012 年4 月19 日

创建时间:2012/4/19 修改时间:2012/4/21 修改次数:0

中国·北京——虾皮工作室(www.xiapistudio.com) 编辑:虾皮 19

outlink: toUrl: http://xszcxx.hebut.edu.cn/ anchor: 电子学籍查询

Content Metadata: ETag="930a-6692-4be248b3d67c0" nutch.content.digest=4000b8eb98c35f7adf

Date=Sat, 21 Apr 2012 08:56:13 GMT Content-Length=26258 Last-Modified=Fri, 20 Apr 2012

23:21:11 GMT nutch.crawl.score=1.0 _fst_=33 nutch.segment.name=20120421164730 Accept-

Ranges=bytes Connection=close Content-Type=text/html Server=Apache/2.2.16 (Unix) PHP/5.3.3

Parse Metadata: CharEncodingForConversion=gb2312 OriginalCharEncoding=gb2312

6)查看“parse_text”内容

参数设置:

Program Arguments:-dump crawl/segments/20120421164730 segment_info -nocontent -nofetch -

nogenerate -noparse -noparsedata

内容详情:

Recno:: 0

URL:: http://www.hebut.edu.cn/

ParseText::

::欢迎光临河北工业大学:: English Version ? 北京航空航天大学等七所高校来我校交流...

[2012-04-20] ? 美国圣克劳德州立大学商学院院长来访我... [2012-04-19] ? 英国伦敦布鲁耐

尔大学代表来访我校... [2012-04-19] ? 城市学院召开迎接河北省学士学位授予权... [2012-04-

19] ? 空军选培办梁泽林主任一行到理学院交流... [2012-04-19] ? 理学院举行合唱比赛暨

2012 年优秀学生表... [2012-04-19] ?.........略........河北工业大学北辰校区体育中心综合布线工

程... [2012-03-26] ? 河北工业大学北辰校区学生公寓 9#水泵、水箱... [2012-03-26] ? 河北工

业大学北辰校区节能楼北侧水系植树、... [2012-03-08] ? 设备招标 更多... ? 三维位移及应变

侦测系统采购... [2012-04-12] ? 全谱直读等离子体发射光谱仪采购招标... [2012-04-12] ? 图

书采购招标... [2012-04-06] ? 电磁疲劳试验机招标... [2012-04-06] ? 核磁共振波谱仪的碳-氢

双核探头招标... [2012-04-06] ?

第七步:更新外链接数据库。

命名:

类名:

package org.apache.nutch.crawl;

public class CrawlDb extends Configured implements Tool

执行:

选中项目右击选择“Run AsRun Configurations”,从中找到“Java Application”,然

后右击选择“New”,在 Main Class 选择“org.apache.nutch.crawl.CrawlDb”,将名字命名为

Page 21: 细细品味 Nutch - xiapistudio.com · 细细品味Nutch ——Nutch 搜索引擎(第5期) 精 华 集 锦 csAxp  2012 年4 月19 日

创建时间:2012/4/19 修改时间:2012/4/21 修改次数:0

中国·北京——虾皮工作室(www.xiapistudio.com) 编辑:虾皮 20

“CrawlDb”。接着上面在“Arguments”选项卡中按下面进行填写,然后点击“Apply 与 Run”。

Program Arguments:crawl/crawldb/ -dir crawl/segments/

VM arguments:-Dhadoop.log.dir=logs -Dhadoop.log.file=hadoop.log

输出:

CrawlDb update: starting at 2012-04-21 19:18:56

CrawlDb update: db: crawl/crawldb

CrawlDb update: segments: [file:/ E:/NutchWorkPlat/nutch /crawl/segments/20120421164730]

CrawlDb update: additions allowed: true

CrawlDb update: URL normalizing: false

CrawlDb update: URL filtering: false

CrawlDb update: 404 purging: false

CrawlDb update: Merging segment data into db.

CrawlDb update: finished at 2012-04-21 19:19:00, elapsed: 00:00:04

效果:

观察“第二步”和“第八步”的效果,并进行对比。

第八步:再次查看刚才 crawldb 中的生成数据。

命名:

类名:

package org.apache.nutch.crawl;

public class CrawlDbReader implements Closeable

执行:

选中项目右击选择“Run AsRun Configurations”,从中找到“Java Application”,然

后右击选择“New”,在 Main Class 选择“org.apache.nutch.crawl.CrawlDbReader”,将名字

命名为“CrawlDbReader”。接着上面在“Arguments”选项卡中按下面进行填写,然后点击

“Apply 与 Run”。

Program Arguments:crawl/crawldb -stats -dump crawldb_info_new

VM arguments:-Dhadoop.log.dir=logs -Dhadoop.log.file=hadoop.log

输出:

CrawlDb statistics start: crawl/crawldb

Page 22: 细细品味 Nutch - xiapistudio.com · 细细品味Nutch ——Nutch 搜索引擎(第5期) 精 华 集 锦 csAxp  2012 年4 月19 日

创建时间:2012/4/19 修改时间:2012/4/21 修改次数:0

中国·北京——虾皮工作室(www.xiapistudio.com) 编辑:虾皮 21

Statistics for CrawlDb: crawl/crawldb

TOTAL urls: 44

retry 0: 44

min score: 0.022

avg score: 0.045227274

max score: 1.0

status 1 (db_unfetched): 43

status 2 (db_fetched): 1

CrawlDb statistics: done

CrawlDb dump: starting

CrawlDb db: crawl/crawldb

CrawlDb dump: done

效果:

http://cxzy.hebut.edu.cn/ Version: 7

Status: 1 (db_unfetched)

Fetch time: Sat Apr 21 19:19:00 CST 2012

Modified time: Thu Jan 01 08:00:00 CST 1970

Retries since fetch: 0

Retry interval: 2592000 seconds (30 days)

Score: 0.022222223

Signature: null

Metadata:

.......略........

http://www.hebut.edu.cn/ Version: 7

Status: 2 (db_fetched)

Fetch time: Mon May 21 16:56:15 CST 2012

Modified time: Thu Jan 01 08:00:00 CST 1970

Retries since fetch: 0

Retry interval: 2592000 seconds (30 days)

Score: 1.0

Signature: 4000b8eb911bd610b1b74d18c35f7adf

Metadata: _pst_: success(1), lastModified=0

.......略........

第九步:计算反向链接。

命名:

Page 23: 细细品味 Nutch - xiapistudio.com · 细细品味Nutch ——Nutch 搜索引擎(第5期) 精 华 集 锦 csAxp  2012 年4 月19 日

创建时间:2012/4/19 修改时间:2012/4/21 修改次数:0

中国·北京——虾皮工作室(www.xiapistudio.com) 编辑:虾皮 22

类名:

package org.apache.nutch.crawl;

public class LinkDb extends Configured implements Tool,

Mapper<Text, ParseData, Text, Inlinks>

执行:

选中项目右击选择“Run AsRun Configurations”,从中找到“Java Application”,然

后右击选择“New”,在 Main Class 选择“org.apache.nutch.crawl.LinkDb”,将名字命名为

“LinkDb”。接着上面在“Arguments”选项卡中按下面进行填写,然后点击“Apply 与 Run”。

Program Arguments:crawl/linkdb -dir crawl/segments/

VM arguments:-Dhadoop.log.dir=logs -Dhadoop.log.file=hadoop.log

输出:

LinkDb: starting at 2012-04-21 19:38:04

LinkDb: linkdb: crawl/linkdb

LinkDb: URL normalize: true

LinkDb: URL filter: true

LinkDb: adding segment: file:/ E:/NutchWorkPlat/nutch/crawl/segments/20120421164730

LinkDb: finished at 2012-04-21 19:38:07, elapsed: 00:00:03

效果:

第十步:查看刚才 linkdb 中的生成数据。

命名:

类名:

Page 24: 细细品味 Nutch - xiapistudio.com · 细细品味Nutch ——Nutch 搜索引擎(第5期) 精 华 集 锦 csAxp  2012 年4 月19 日

创建时间:2012/4/19 修改时间:2012/4/21 修改次数:0

中国·北京——虾皮工作室(www.xiapistudio.com) 编辑:虾皮 23

package org.apache.nutch.crawl;

public class LinkDbReader extends Configured implements Tool, Closeable

执行:

选中项目右击选择“Run AsRun Configurations”,从中找到“Java Application”,然

后右击选择“New”,在 Main Class 选择“org.apache.nutch.crawl.LinkDbReader”,将名字

命名为“LinkDbReader”。接着上面在“Arguments”选项卡中按下面进行填写,然后点击

“Apply 与 Run”。

Program Arguments:crawl/linkdb -dump linkdb_info

VM arguments:-Dhadoop.log.dir=logs -Dhadoop.log.file=hadoop.log

输出:

LinkDb dump: starting at 2012-04-21 19:44:35

LinkDb dump: db: crawl/linkdb

LinkDb dump: finished at 2012-04-21 19:44:39, elapsed: 00:00:03

效果:

http://apps.hebut.edu.cn/bks_lqjg/2009zjb.asp Inlinks:

fromUrl: http://www.hebut.edu.cn/ anchor: 2009 年专接本录取结果查询

http://cxzy.hebut.edu.cn Inlinks:

fromUrl: http://www.hebut.edu.cn/ anchor: 创先争优活动专题网站

http://eweb.hebut.edu.cn Inlinks:

fromUrl: http://www.hebut.edu.cn/ anchor: English Version

http://lib.hebut.edu.cn Inlinks:

fromUrl: http://www.hebut.edu.cn/ anchor: 图书馆

http://oa.hebut.edu.cn Inlinks:

fromUrl: http://www.hebut.edu.cn/ anchor: 校内办公网

http://xsc.hebut.edu.cn/jiuye/index.asp Inlinks:

fromUrl: http://www.hebut.edu.cn/ anchor: 就业网

http://xszcxx.hebut.edu.cn/ Inlinks:

Page 25: 细细品味 Nutch - xiapistudio.com · 细细品味Nutch ——Nutch 搜索引擎(第5期) 精 华 集 锦 csAxp  2012 年4 月19 日

创建时间:2012/4/19 修改时间:2012/4/21 修改次数:0

中国·北京——虾皮工作室(www.xiapistudio.com) 编辑:虾皮 24

fromUrl: http://www.hebut.edu.cn/ anchor: 电子学籍查询

http://zs.hebut.edu.cn/s/form/Index.php/Index/gaokao Inlinks:

fromUrl: http://www.hebut.edu.cn/ anchor: 河北工业大学高考招生录取结果查询

第十步:使用 Solr 为抓取的内容建立索引。(备注:先启动 Tomcat)

命名:

类名:

package org.apache.nutch.indexer.solr;

public class SolrIndexer extends Configured implements Tool

执行:

选中项目右击选择“Run AsRun Configurations”,从中找到“Java Application”,然

后右击选择“New”,在 Main Class 选择“org.apache.nutch.indexer.solr.SolrIndexer”,将名

字命名为“SolrIndexer”。接着上面在“Arguments”选项卡中按下面进行填写,然后点击

“Apply 与 Run”。

Program Arguments : http://localhost:8080/solr/ crawl/crawldb -linkdb crawl/linkdb

crawl/segments/*

VM arguments:-Dhadoop.log.dir=logs -Dhadoop.log.file=hadoop.log

输出:

SolrIndexer: starting at 2012-04-21 19:51:04

Adding 1 documents

SolrIndexer: finished at 2012-04-21 19:51:10, elapsed: 00:00:06

效果:

第十一步:在 Solr 的客户端查询。

Page 26: 细细品味 Nutch - xiapistudio.com · 细细品味Nutch ——Nutch 搜索引擎(第5期) 精 华 集 锦 csAxp  2012 年4 月19 日

创建时间:2012/4/19 修改时间:2012/4/21 修改次数:0

中国·北京——虾皮工作室(www.xiapistudio.com) 编辑:虾皮 25

在浏览器中输入:

http://localhost:8080/solr/admin/

查询条件为“欢迎光临河北工业大学”。

输出的 XML 结构为:

Page 27: 细细品味 Nutch - xiapistudio.com · 细细品味Nutch ——Nutch 搜索引擎(第5期) 精 华 集 锦 csAxp  2012 年4 月19 日

创建时间:2012/4/19 修改时间:2012/4/21 修改次数:0

中国·北京——虾皮工作室(www.xiapistudio.com) 编辑:虾皮 26

2、参考文献

感谢以下文章的编写作者,没有你们的铺路,我或许会走得很艰难,参考不分先后,贡

献同等珍贵。

(1)Nutch 安装

地址:http://www.cnblogs.com/kwklover/articles/445916.html

(2)剖析 Nutch 爬虫(一)

地址:http://www.cnblogs.com/kwklover/articles/445917.html

(3)剖析 Nutch 爬虫(二)

地址:http://www.cnblogs.com/kwklover/articles/445924.html

(4)剖析 Nutch 爬虫(三)

地址:http://www.cnblogs.com/kwklover/articles/445925.html

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

地址:http://www.cnblogs.com/kwklover/articles/445926.html

(6)Nutch 爬虫实验运行及抓取数据分析(一)

地址:http://www.cnblogs.com/kwklover/articles/445927.html

(7)Nutch 爬虫实验运行及抓取数据分析(二)

地址:http://www.cnblogs.com/kwklover/articles/445928.html

Page 28: 细细品味 Nutch - xiapistudio.com · 细细品味Nutch ——Nutch 搜索引擎(第5期) 精 华 集 锦 csAxp  2012 年4 月19 日

创建时间:2012/4/19 修改时间:2012/4/21 修改次数:0

中国·北京——虾皮工作室(www.xiapistudio.com) 编辑:虾皮 27

3、打赏小编

编辑简介:

高级软件工程师(T5),河北工业大学硕士研究

生,现在就职于百度在线网络技术(北京)有限公司。

专注于大数据以及其相关研究,在离线计算和实时计

算方面有较为深入的研究,积累了丰富的实战经验。

热衷于知识分享,其细细品味系列教程深受网友喜

爱。

姓名:解耀伟 网站:www.xiapistudio.com

笔名:虾皮 博客:http://www.cnblogs.com/xia520pi/

扣扣:461052034 邮箱:[email protected]

从高考复习开始养成了总结的习惯,习惯于在学习的过程中,把相关的文章融会贯通,

并加以实践,结合自己的实际情况把相关的内容整理成册,便于学习和总结。在这几年里陆

陆续续分享了很多细细品味系列文章。

每一期文章都耗费了不少的心血,很多时候都是在星期天业余的时间完成,现在也建立

了自己独立的网站:www.xiapistudio.com,需要一些资金来维持,同时也可以鼓励我写更多

的好东西来分享。如果你看了本文章对自己有用,可以通过支付宝的形式来进行打赏,1 元、

2 元、10 元皆可,多少并不重要,只要你感觉文章使你受益即可。

温馨提示:在转账时,可以写明“打赏虾皮”或者“打赏虾皮工作室”。我的支付宝已

经进行实名认证,支付宝是的个人头像,请认准后再支付。