看了若干的所谓的Nutch教程,要么版本太老,要么语焉不详,要么挂一漏万,还有直接用自动翻译机翻译的简直没法读。在此将nutch1.x的wiki教程在此翻译,加深自学印象。事实上wiki文档也不是很规范,上面的遗漏的地方比较多,本文经过实际验证通过,保证能够使用。
另外吐槽一下:wiki上面的1.x的nutch教程错误百出,我曹了。这也叫官方教程。
原文链接:https://wiki.apache.org/nutch/NutchTutorial
介绍
Nutch是一款成熟,可用于生产的网络爬虫。Nutch 1.x支持细粒度配置,依赖于Apache Hadoop数据结构,这对于批处理非常有用。可插拔和模块化当然有它的好处,Nutch提供可扩展的接口,如Parse,Index和ScoringFilter用于自定义实现,例如用于解析的Apache Tika。另外,Apache Solr,Elastic Search,SolrCloud等存在可插入索引。我们可以以自动方式查找网页超链接,减少大量维护工作,例如检查损坏的链接,并创建所有访问过的页面的副本以供搜索。 本教程解释了如何将Nutch与Apache Solr一起使用。Solr是一个开源的全文搜索框架,有了Solr,我们可以搜索Nutch获得的页面。Apache Nutch支持Solr开箱即用,简化了Nutch-Solr集成。它还消除了对运行旧Nutch Web应用程序的Apache Tomcat和Apache Lucene进行索引的遗留依赖性。只需从这里下载二进制版本。
学习结果
在本教程结束时,您将
- 将nutch配置完成,并开始爬取网页。
- 了解了如何理解和配置Nutch运行时配置,包括种子URL列表,URLFilters等。
- 执行Nutch获取周期,查看获取数据库的结果
- 使用Apache Sol对Nutch爬取记录进行索引并全文搜索
如对本教程有意见或者建议,请向Nutch user@报告。
目录
内容
1.介绍
2.学习结果
3.目录
4.学习步骤
5.环境需求
6.安装Nutch
1.选项1:从二进制分发中设置Nutch
2.选项2:从源分发中设置Nutch
7.验证您的Nutch安装
8.爬取第一个网站
1、自定义crawl属性
2、创建URL种子列表
1、 创建URL种子列表
2、(可选)配置正则表达式过滤器
3、使用单个命令爬取整个web
1、循序渐进:概念
2、循序渐进:使用URL列表为crawldb配置数据
3、循序渐进:获取
4、循序渐进:反向链接
5、循序渐进:使用Apache Solr进行索引
6、循序渐进:删除重复项
7、循序渐进:清理Solr
4、使用crawl脚本
9、配置Solr进行搜索
10、验证Solr安装
4.脚步
本教程描述了Nutch 1.x的安装和使用(例如,从主分支中释放的某个版本)。有关类似Nutch 2.x和HBase教程的信息,请参阅Nutch2Tutorial。
5.环境要求
- Unix环境,或Windows- Cygwin环境
- Java运行时/开发环境(JDK 1.8 / Java 8)
- (仅限源代码构建)Apache Ant:http://ant.apache.org/
6.安装Nutch
6.1 选项1:从二进制版本中配置Nutch
- 从这里下载二进制包(apache-nutch-1.X-bin.zip)。
- 将下载后的二进制包解压缩到apache-nutch-1.X文件夹中。
- cd apache-nutch-1.X /
从现在开始,我们将使用$ {NUTCH_RUNTIME_HOME}来表示当前目录(apache-nutch-1.X /)。
6.2 选项2:从源分发中设置Nutch
高级用户也可以使用源码版本进行安装配置:
- 下载源包(apache-nutch-1.X-src.zip)
- 解压缩
- cd apache-nutch-1.X /
- 在此文件夹中运行ant(参见教程RunNutchInEclipse)
- 现在有一个目录runtime / local,它包含一个可以立即使用的Nutch安装程序。
当使用源代码版本时,$ {NUTCH_RUNTIME_HOME}表示apache-nutch-1.X / runtime / local /。注意:
- 配置文件应该在apache-nutch-1.X / runtime / local / conf /中修改
- ant clean命令将删除此目录(请在使用该命令前保留修改后的配置文件的副本)
7.验证您的Nutch安装
- 运行“ bin / nutch ” - 如果您看到类似于以下内容的内容,则可以确认正确的安装:
Usage: nutch COMMAND where command is one of:
readdb read / dump crawl db
mergedb merge crawldb-s, with optional filtering
readlinkdb read / dump link db
inject inject new urls into the database
generate generate new segments to fetch from crawl db
freegen generate new segments to fetch from text files
fetch fetch a segment's pages
...
一些疑难解答提示:
- 如果您看到“权限被拒绝”,请运行以下命令:
chmod + x bin / nutch
- 如果你看到JAVA_HOME未设置设置JAVA_HOME。在Mac(苹果系统)上,您可以运行以下命令或将其添加到〜/ .bashrc:
export JAVA_HOME = / System / Library / Frameworks / JavaVM.framework / Versions / 1.8 / Home
#请注意,系统上的实际路径可能不同
在Debian或Ubuntu上,您可以运行以下命令或将其添加到〜/ .bashrc:
export JAVA_HOME = $(readlink -f / usr / bin / java | sed“s:bin / java ::”)
您可能还需要更新/ etc / hosts文件。如果是这样,您可以添加以下内容
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting. Do not change this entry.
##
127.0.0.1 localhost.localdomain localhost LMC-032857
::1 ip6-localhost ip6-loopback
fe80::1%lo0 ip6-localhost ip6-loopback
请注意,上面的LMC-032857应替换为您的机器名称。
8.抓取您的第一个网站
在爬取网站之前,Nutch需要进行两次配置更改:
- 定制crawl属性,至少为crawl起个名字,以供外部服务器识别
- 设置crawl的URL种子列表
8.1定制crawl属性
- 在conf / nutch-default.xml中 查看和编辑默认crawl属性- 其中大部分都可以在不进行修改的情况下使用
- 文件conf / nutch-site.xml用于自定义crawl属性,使用时会覆盖conf / nutch-default.xml。此文件唯一需要的修改是http.agent.name的value字段,即在conf / nutch-site.xml中的http.agent.name属性的value字段中添加代理名称,例如:
<property>
<name>http.agent.name</name>
<value>My Nutch Spider</value>
</property>
- 确保conf / nutch-site.xml中的plugin.includes属性包括索引器作为indexer-solr
8.2创建URL种子列表
- URL种子列表包括nutch进行爬取工作的网站列表,每行一个
- 文件conf / regex-urlfilter.txt中的正则表达式过滤和缩小crawl和下载的Web资源类型
8.2.1创建URL种子列表
- mkdir -p urls
- cd urls
- 使用touch命令在urls /下创建一个文本文件seed.txt,其中包含以下内容(每个网站需要一个网址,以便您希望Nutch抓取每个网站)。
http://nutch.apache.org/
8.2.2(可选)配置正则表达式过滤器
编辑文件conf / regex-urlfilter.txt,将下面的语句:
# accept anything else
+.
t替换成与希望抓取的域匹配的正则表达式。例如,如果您希望将crawl限制为nutch.apache.org域,则该行应为:
+^https?://([a-z0-9-]+\.)*nutch\.apache\.org/
这将包括域nutch.apache.org中的任何URL 。
注意:若在regex-urlfilter.txt中未指定任何域,将会爬取所有链接到种子URL文件的域。
8.2.3使用抓取命令
现在我们已经准备好开始一次抓取,可以使用以下的参数:
- -dir 指定用于存放爬取文件的目录名称。
- -threads 决定并行的线程数。
- -depth 表明从根网页开始的链接深度。
- -topN 决定在每一深度将会被取回的网页的最大数目
- 运行下面的命令:
bin/nutch crawl urls -dir crawl -depth 3 -topN 5
注:nutch1.7及2.2以上版本使用bin/crawl 取代 bin/nutch crawl。
- 现在您应该能够看见下列目录被创建了:
crawl/crawldb
crawl/linkdb
crawl/segmentsThis
- 请记住:如果您有一个已经设置好了的Solr并且想要建立索引,您必须添加-solr <solrUrl>参数到您的crawl命令里面。例如:
bin/nutch crawl urls -solr http://localhost:8983/solr/ -dir crawl -depth 3 -topN 5
注:在nutch1.15版本下,会提示错误:Command crawl is deprecated, please use bin/crawl instead,说明以上命令已经不成立了,.执行以下命令:
./crawl urls -solr http://localhost:8983/solr/ -dir crawl -depth 3 -topN 5 -once
- 然后请直接跳到后面–为搜索设置Solr 。
通常一开始测试一个配置都是通过抓取在较浅深度来进行,但这限制了每一级所爬取的网页数(-topN),并且难以观察输出来检查所需要的页面是否已经得到以及不需要的页面是否被阻挡。要想查看某一配置是否正确,对于全文搜索来说较为适当的深度设置大约是10左右。每一级所爬取的网页数 ( -topN)可以从几万上到几百万,这取决于您的资源。
8.3 使用专门命令爬取全网
注:如果您以前修改过conf/regex-urlfilter.txt,这里需要将它改回来。
全网爬取旨在处理非常大的抓取工作,这可能在多台计算机上运行,并且需要数周才能完成。这还允许更多地控制爬取过程和增量爬取。值得注意的是,全网爬取并不一定意味着抓取整个万维网。我们可以将范围限制为我们要抓取的URL列表。这是通过使用过滤器来完成的,就像我们在执行爬取命令时使用的那样(上面)。
8.3.1 Step-by-Step:概念
Nutch数据由以下部分组成:
crawl数据库或crawldb。其中包含有关Nutch已知的每个URL的信息,包括是否已爬取,何时爬取的(如果已爬取的话)。
链接数据库或linkdb。其中包含每个URL的已知链接列表,包括链接的源URL和锚文本。
一组segments。每个segments都是一组作为一个单元提取的URL。段是具有以下子目录的目录:
- crawl_generate 命名了要抓取的URL集合
- crawl_fetch 包含正在抓取的URL的状态
- content 包含了从每个URL返回的原始内容
- parse_text 包含了解析每个URL得到的文本
- parse_data 包含了解析每个URL得到的外链和元数据
- crawl_parse 包含了outlink网址,用于更新crawldb
8.3.2 Step-by-Step:确定crawldb
- 选项1:使用DMOZ创建爬取目录数据库。
injector 将URL添加到crawldb中。下面我们从DMOZ(开放式分类目录)中随机抽取URL添加到crawldb。首先,我们下载并解压缩DMOZ列表文件。(这是一个200多MB的文件,所以这需要几分钟。)
wget http://rdf.dmoz.org/rdf/content.rdf.u8.gz
gunzip content.rdf.u8.gz
接下来,我们选择这些页面的随机子集。(我们使用随机子集,以便运行本教程的每个人都不会攻击相同的站点。)DMOZ包含大约300万个URL。我们从每5,000个中选择一个,这样我们就会得到大约1,000个网址:
mkdir dmoz
bin / nutch org.apache.nutch.tools.DmozParser content.rdf.u8 -subset 5000> dmoz / urls
解析过程需要几分钟,因为它必须解析整个文件。最后,我们使用选定的URL初始化crawldb(将dmoz中的url注入到crawldb中)。
bin/nutch inject crawl/crawldb dmoz
现在我们有一个Web数据库,其中包含大约1,000个尚未爬取的URL。
- 选项2.从初始种子列表创建爬取目录数据库。
使用之前创建的urls初始化crawldb
bin/nutch inject crawl/crawldb urls
8.3.2 Step-by-Step:获取
要获取网页,我们首先从数据库生成一个获取列表:
bin/nutch generate crawl/crawldb crawl/segments
这将为所有要获取的页面生成一个获取列表。获取列表放在新创建的段目录中。段目录按创建时间命名。我们在shell变量s1中保存该段的名称:
s1=`ls -d crawl/segments/2* | tail -1`
echo $s1
现在我们在这个segment 上运行fetcher:
bin/nutch fetch $s1
然后我们解析条目:
bin/nutch parse $s1
完成后,我们使用fetch的结果更新数据库:
bin/nutch updatedb crawl/crawldb $s1
现在,数据库包含所有初始页面的更新条目以及与从初始集合链接的新发现页面相对应的新条目。
现在我们生成并获取包含排名最高的1,000页的新segment:
bin/nutch generate crawl/crawldb crawl/segments -topN 1000
s2=`ls -d crawl/segments/2* | tail -1`
echo $s2
bin/nutch fetch $s2
bin/nutch parse $s2
bin/nutch updatedb crawl/crawldb $s2
让我们再来一轮:
bin/nutch generate crawl/crawldb crawl/segments -topN 1000
s3=`ls -d crawl/segments/2* | tail -1`
echo $s3
bin/nutch fetch $s3
bin/nutch parse $s3
bin/nutch updatedb crawl/crawldb $s3
到目前为止,我们已经获得了几千页。让我们反转链接并索引它们!
8.3.3 Step-by-Step:反向链接
在建立索引之前,我们首先反转所有链接,以便我们可以使用页面索引传入的锚文本。
bin/nutch invertlinks crawl/linkdb -dir crawl/segments
注:锚文本又称锚文本链接,是链接的一种形式。和超链接类似,超链接的代码是锚文本,把关键词做一个链接,指向别的网页,这种形式的链接就叫作锚文本。
我们现在准备使用Apache Solr进行搜索。
8.3.4 Step-by-Step:索引到Apache Solr
注意:对于此步骤,您应该安装Solr。如果你没有将Nutch与Solr整合在一起。你应该先阅读后面的设置solr部分。
现在我们准备好继续索引所有资源。有关更多信息,请参阅命令行选项。
Usage: Indexer <crawldb> [-linkdb <linkdb>] [-params k1=v1&k2=v2...] (<segment> ... | -dir <segments>) [-noCommit] [-deleteGone] [-filter] [-normalize] [-addBinaryContent] [-base64]
Example: bin/nutch index crawl/crawldb/ -linkdb crawl/linkdb/ crawl/segments/20131108063838/ -filter -normalize -deleteGone
8.3.5 Step-by-Step:删除重复项
重复(相同内容但不同的URL)可在CrawlDb中标记,稍后在Solr索引中删除。
MapReduce “重复数据删除”工作:
- 映射:标识映射,其中键是摘要,值是CrawlDatum记录
- 删除:具有相同摘要的CrawlDatums被标记为(除了其中一个)重复。目前有多种启发式方法用来选择未标记为重复的项目 - 如判断是否具有最短URL,最近获取或具有最高分数等特征。
Usage: bin/nutch dedup <crawldb> [-group <none|host|domain>] [-compareOrder <score>,<fetchTime>,<urlLength>]
索引中的删除操作由清理作业执行(请参见下文),或者使用命令行标志-deleteGone调用索引作业。
欲了解更多信息,请参阅dedup documentation。
8.3.6 Step-by-Step:清理Solr
该类扫描crawldb目录,查找状态为DB_GONE的条目(404),并向Solr发送删除请求以获取这些文档。Solr收到请求后,上述文件将被正式删除。这使得Solr指数更健康。
Usage: bin/nutch clean <crawldb> <index_url>
Example: /bin/nutch clean crawl/crawldb/ http://localhost:8983/solr
欲了解更多信息,请参阅clean documentation.。
8.4使用crawl脚本
如果您已完成上面的工作,您可能想知道如何编写bash脚本以自动执行上述所有过程。
Nutch开发人员为您编写了一个:),它可以在bin / crawl中使用。这里是最常见的选项和参数:
Usage: crawl [-i|--index] [-D "key=value"] [-s <Seed Dir>] <Crawl Dir> <Num Rounds>
-i|--index Indexes crawl results into a configured indexer
-D... A Java property to pass to Nutch calls
-s <Seed Dir> Directory in which to look for a seeds file
<Crawl Dir> Directory where the crawl/link/segments dirs are saved
<Num Rounds> The number of rounds to run this crawl for
Example: bin/crawl -i -s urls/ TestCrawl/ 2
crawl脚本设置了大量参数,您可以根据需要修改参数。在开始大的crawl工作之前理解参数是有意义的。
9.设置Solr进行搜索
Nutch的每个版本都是针对特定的Solr版本构建的,但您也可以尝试“临近”版本。
Nutch | Solr |
1.15 | 7.3.1 |
1.14 | 6.6.0 |
1.13 | 5.5.0 |
1.12 | 5.4.1 |
要安装Solr 7.x:
- 从这里下载二进制文件
- 解压缩到$ HOME / apache-solr,我们现在将其称为$ {APACHE_SOLR_HOME}
- 为新的nutch solr core 创造资源
mkdir -p ${APACHE_SOLR_HOME}/server/solr/configsets/nutch/
cp -r ${APACHE_SOLR_HOME}/server/solr/configsets/_default/* ${APACHE_SOLR_HOME}/server/solr/configsets/nutch/
将nutch schema.xml复制到conf目录中
cp ${NUTCH_RUNTIME_HOME}/conf/schema.xml ${APACHE_SOLR_HOME}/server/solr/configsets/nutch/conf/
如果在使用此架构启动Solr时出现问题,您可以尝试使用最新的schema.xml。
- 确保没有挡路的managed-schema:
rm ${APACHE_SOLR_HOME}/server/solr/configsets/nutch/conf/managed-schema
- 启动solr服务器
${APACHE_SOLR_HOME}/bin/solr start
- 创建nutch核心(core)
${APACHE_SOLR_HOME}/bin/solr create -c nutch -d ${APACHE_SOLR_HOME}/server/solr/configsets/nutch/conf/
注意:在创建core之前,我们需要指定以上复制的目录为solr_home目录,否则创建的时候会出错。core有两个必要的组成元素,即schema.xml和solrconfig.xml这两个文件。然后由这两个文件衍生出两者依赖的其他配置文件。core的目录结构也有要求,schema.xml和solrconfig.xml必须放置在solr_home\core_name\conf目录下面。solr_home即solr的主目录,所有core都存放在solr_home目录下,solr_home可以通过web.xml的<env_entry>元素指定,如下所示:
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>C:/soengine/NutchWorkPlat/solr-7.3.1/server/solr/configsets/nutch</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
我这里指定的是和上面的目录一致的地方,比较繁琐。
之后你需要将Nutch指向Solr实例:
- (Nutch 1.15及更高版本)编辑文件conf / index-writers.xml,参见IndexWriters
- (直到Nutch 1.14)将核心名称添加到Solr服务器URL: -Dsolr.server.url=http://localhost:8983/solr/nutch
10.验证Solr安装
启动Solr管理控制台后,您应该能够访问以下链接:
http://localhost:8983/solr/#/
您应该能够导航到nutch核心并查看托管模式等。