细细品味 nutch - xiapistudio.com · 细细品味nutch ——nutch 搜索引擎(第5期) 精...
TRANSCRIPT
细细品味 Nutch ——Nutch 搜索引擎(第 5 期)
精
华
集
锦
csAxp
http://www.xiapistudio.com/
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
创建时间: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 作为一个搜索引擎,其基本组成也同其他搜索引擎一样。其中“网页信息抓取”
创建时间: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
创建时间: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
创建时间: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,以及下载的日期,用来页面更新检查时间。
创建时间: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
创建时间: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));
创建时间: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,而执行每
创建时间: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 中的生成数据。
命名:
类名:
创建时间: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。
创建时间: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 进行抓取。
命名:
类名:
创建时间: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
创建时间: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
输出:
创建时间: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”,然
创建时间: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
创建时间: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
创建时间: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
创建时间: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 年专接本录取结果
查询
创建时间: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”,将名字命名为
创建时间: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
创建时间: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
.......略........
第九步:计算反向链接。
命名:
创建时间: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 中的生成数据。
命名:
类名:
创建时间: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:
创建时间: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 的客户端查询。
创建时间:2012/4/19 修改时间:2012/4/21 修改次数:0
中国·北京——虾皮工作室(www.xiapistudio.com) 编辑:虾皮 25
在浏览器中输入:
http://localhost:8080/solr/admin/
查询条件为“欢迎光临河北工业大学”。
输出的 XML 结构为:
创建时间: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
创建时间: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 元皆可,多少并不重要,只要你感觉文章使你受益即可。
温馨提示:在转账时,可以写明“打赏虾皮”或者“打赏虾皮工作室”。我的支付宝已
经进行实名认证,支付宝是的个人头像,请认准后再支付。