Nutch 教程

2019-03-27 00:49|来源: 网路

英文原文:NutchTutorial

来源地址:http://www.oschina.net/translate/nutch-tutorial

介绍

Apache Nutch是一个用Java编写的开源网络爬虫。通过它,我们就能够自动地找到网页中的超链接,从而极大地减轻了维护工作的负担,例如检查那些已经断开了的链接,或是对所有已经访问过的网页创建一个副本以便用于搜索。接下来就是Apache Solr所要做的。Solr是一个开源的全文搜索框架,通过Solr我们能够搜索Nutch已经访问过的网页。幸运的是,关于Nutch和Solr之间的整合在下方已经解释得相当清楚了。

Apache Nutch对于Solr已经支持得很好,这大大简化了Nutch与Solr的整合。这也消除了过去依赖于Apache Tomcat来运行老的Nutch网络应用以及依赖于Apache Lucene来进行索引的麻烦。只需要从这里下载一个二进制的发行版即可。

kzjnet
kzjnet
翻译于 1年前

2人顶

 

 翻译的不错哦!

步骤

  • 这篇教程描述了Nutch 1.x(当前版本是1.6)的安装和使用。关于如何编译和安装Nutch 2.x,请查看Nutch2Tutorial

1.从二进制发行包安装Nutch

  • 这里下载二进制包(apache-nutch-1.X-bin.zip)。
  • 解压缩您的Nutch包。那应该会有一个新文件夹apache-nutch-1.X
  • cd apache-nutch-1.X/

从现在开始,我们将会使用${NUTCH_RUNTIME_HOME}来代替当前目录(apache-nutch-1.X/)。

从源代码安装Nutch

高级用户也可能会使用源代码发行包:

  • 下载一个源代码包(apache-nutch-1.X-src.tar.gz
  • 解压缩
  • 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将会移除这个目录(并保留被更改的配置文件的备份)
kzjnet
kzjnet
翻译于 1年前

1人顶

 

 翻译的不错哦!

2.检验您的Nutch安装

  • 运行”bin/nutch“。如果您能看见下列内容说明您的安装是正确的:

Usage: nutch [-core] COMMAND

一些解决问题的提示:

  • 如果您看见”Permission denied”那么请运行下列命令:

chmod +x bin/nutch

  • 如果您看见JAVA_HOME没有设置那么请设置JAVA_HOME环境变量。在Mac上,您可以运行下述命令或者把它添加到~/.bashrc里面去:

export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home

kzjnet
kzjnet
翻译于 1年前

1人顶

 

 翻译的不错哦!

3.抓取您的第一个网站

  • 将您的代理的名称添加到conf/nutch-site.xmlhttp.agent.name属性的Value字段里,例如:

<property>
<name>http.agent.name</name>
<value>My Nutch Spider</value>
</property>

  • mkdir -p urls
  • cd urls
  • touch seed.txt

这样子就在urls/目录下创建了一个文本文档seed.txt。它需要包含像下面这样的内容(每行一个网站URL来告诉Nutch您想要抓取的网站):

http://nutch.apache.org/

编辑文件conf/regex-urlfilter.txt并且替换

# accept anything else
+.

为一条与您要抓取的域名相对应的正则表达式。例如,如果您想要限制为抓取nutch.apache.org这一域名,这一行读起来应该像是这样子的:

+^http://([a-z0-9]*\.)*nutch.apache.org/

这会包括在nutch.apache.org下的任何URL。

3.1使用抓取命令

现在我们已经准备好开始一次抓取,可以使用以下的参数:

  • -dir dir 指定用于存放抓取文件的目录名称。
  • -threads threads 决定将会在获取是并行的线程数。
  • -depth depth 表明从根网页开始那应该被抓取的链接深度。
  • -topN N 决定在每一深度将会被取回的网页的最大数目
  • 运行下面的命令:

bin/nutch crawl urls -dir crawl -depth 3 -topN 5

  • 现在您应该能够看见下列目录被创建了:

crawl/crawldb
crawl/linkdb
crawl/segmentsThis

  • 请记住:如果您有一个已经设置好了的Solr并且想要建立索引到那里面去,您必须添加-solr <solrUrl>参数到您的crawl命令里面。例如:

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

  • 然后请直接跳到后面–为搜索设置Solr 。

通常一开始测试一个配置都是通过抓取在较浅深度来进行,大大地限制了每一级所获取的网页数(-topN),并且观察输出来检查所需要的页面是否已经得到以及不需要的页面是否被阻挡。要想查看某一配置是否正确,对于全文搜索来说较为适当的深度设置大约是10左右。每一级所获取的网页数 ( -topN)可以从几万上到几百万,这取决于您的资源。

kzjnet
kzjnet
翻译于 1年前

0人顶

 

 翻译的不错哦!

3.2使用特别的命令对整个网络进行抓取

  • 请记住:如果您先前更改并覆盖了文件conf/regex-urlfilter.txt在这里您需要将它改回去。

整个网络的抓取被设计成用来处理那些可能需要耗费几个星期来完成,在许多台机器上运行的非常大的抓取。这也允许在抓取的过程中进行更多的控制,还有增量抓取。最重要的是要记住整个网络的抓取并不一定意味着要抓取整个万维网。我们可以限制整个网络的抓取只是抓取我们列出的想要抓取的URL。这是通过使用一个就像我们用 crawl命令时一样的过滤器来完成的。

kzjnet
kzjnet
翻译于 1年前

0人顶

 

 翻译的不错哦!

循序渐进之–概念

Nutch数据是由这些组成的:

  • 抓取数据库,或者说是crawldb。它包含了关于每一个Nutch已知的URL的信息,包括它是否已经被获取,甚至是何时被获取的。
  • 链接数据库,或者说是linkdb。它包含了每一个已知URL的链接,包括源的URL以及链接的锚文本。
  • 一系列的分段,或者说是segments。每一个segments都是一组被作为一个单元来获取的URL。segments是它本身这个目录以及它下面的子目录:
    • 一个crawl_generate确定了将要被获取的一组URL;
    • 一个crawl_fetch包含了获取的每个URL的状态;
    • 一个content包含了从每个URL获取回来的原始的内容;
    • 一个parse_text包含了每个URL解析以后的文本;
    • 一个parse_data包含来自每个URL被解析后内容中的外链和元数据;
    • 一个crawl_parse包含了外链的URL,用来更新crawldb。
kzjnet
kzjnet
翻译于 1年前

0人顶

 

 翻译的不错哦!

循序渐进之–用一组URL列表确定crawldb
选择1:从DMOZ数据库自举。

由injector添加URL到crawldb里。让我们从DMOZ开放式分类目录添加URL吧。首先我们必须下载并且解压缩这个DMOZ所有网页的列表(这是一个200多MB的文件,所以这会消耗几分钟)。

wget http://rdf.dmoz.org/rdf/content.rdf.u8.gz
gunzip content.rdf.u8.gz

接下来我们选择这些网页当中随机的一些子集(我们使用随机的子集所以所有在跟着这一个教程做的人就不会伤害到同样的网站)。DMOZ包含了大约三百万个URL。我们从每5000个URL中选择出一个,因此我们就有大约1000个URL:

mkdir dmoz
bin/nutch org.apache.nutch.tools.DmozParser content.rdf.u8 -subset 5000 > dmoz/urls

这一分析器也需要几分钟来完成,因为它必须要分析整个文件。最后,我们用这些选出的URL来初始化crawldb。

bin/nutch inject crawl/crawldb dmoz

现在我们有了一个大约有1000个未被获取的URL的网络数据库。

选择2:从初始列表里自举。

这一选项不为人们所了解的地方在于创建初始列表并覆盖在urls/目录里。

bin/nutch inject crawl/crawldb urls

kzjnet
kzjnet
翻译于 1年前

0人顶

 

 翻译的不错哦!

循序渐进之–获取

要获取,我们首先要从数据库里产生一个获取的列表。

bin/nutch generate crawl/crawldb crawl/segments

这会为所有预定要被获取的网页产生一个获取列表。获取列表放在一个新创建的分段目录里。分段目录的名称取决于它被创建时的时间。

我们将这个分段的名字放在shell的变量s1里面:

s1=`ls -d crawl/segments/2* | tail -1`
echo $s1

现在我们能以下面的命令在这个分段里进行获取:

bin/nutch fetch $s1

然后我们就能解析条目:

bin/nutch parse $s1

当这一切完成以后,我们就以获取回来的结果更新数据库:

bin/nutch updatedb crawl/crawldb $s1

现在,数据库包含了刚刚更新的条目的所有初始页,除此之外,新的网页条目对于链接到初始的集合来进行新条目的发现是相符合的。
所以我们对包含得分最高的1000页提取出来产生一个新的分段:

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

通过这一点我们已经获取了几千页的网页。让我们索引它们吧!

kzjnet
kzjnet
翻译于 1年前

0人顶

 

 翻译的不错哦!

循序渐进之–反向链接

在我们进行索引之前,我们首先要反转所有的链接,以便我们能够以这些网页来索引进入的锚文本。

bin/nutch invertlinks crawl/linkdb -dir crawl/segments

我们现在准备好要用Apache Solr进行搜索了。

4.为搜索设置Solr

  • 这里下载二进制文件。
  • 解压缩到$HOME/apache-solr-3.X,从现在起,我们将会用${APACHE_SOLR_HOME}代替它。
  • cd ${APACHE_SOLR_HOME}/example
  • java -jar start.jar

5.检验Solr的安装

在您启动Solr管理员控制台以后,您应该能够访问下列这些链接:

http://localhost:8983/solr/admin/
http://localhost:8983/solr/admin/stats.jsp

kzjnet
kzjnet
翻译于 1年前

0人顶

 

 翻译的不错哦!

6.将Solr与Nutch进行整合

我们已经将Nutch和Solr正确地安装设置好了。并且Nutch已经从URL列表里创建并抓取了数据。以下步骤是一个以Solr来搜索要搜索的链接的代表:

  • cp ${NUTCH_RUNTIME_HOME}/conf/schema.xml ${APACHE_SOLR_HOME}/example/solr/conf/
  • 在目录${APACHE_SOLR_HOME}/example下使用命令”java -jar start.jar“来重启Solr
  • 运行Solr索引命令:

bin/nutch solrindex http://127.0.0.1:8983/solr/ crawl/crawldb -linkdb crawl/linkdb crawl/segments/*

运行solrindex的一些细节已经被改变了。linkdb现在是可选的,所以您需要在命令行中用一个”-linkdb”明确地表示它。
这会发送所有的抓取数据给Solr进行索引。更多信息请运行命令bin/nutch solrindex。
如果一切顺利,我们现在已经准备好在http://localhost:8983/solr/admin/进行搜索。如果您想要看到有Solr创建的原始HTML索引,您需要更改schema.xml当中定义的content字段为:

<field name="content" type="text" stored="true" indexed="true"/>


转自:http://www.cnblogs.com/AloneSword/p/3800696

相关问答

更多

关于Nutch配置问题

你应该是没配NUTCH_HOME,看来你是在linux上配置的,所以将NUTCH_HOME放在/etc/profile中就可以了,配上试试吧,应该是没什么问题的。

NUTCH与JAVA如何结合

有一本书比较好 叫做lucene+nutch搜索引擎开发 nutch本身就是用java写的开源项目 如果想用就是修改其源代码来做应用 我也在学 目前理解是这样的

Nutch在Elasticsearch上没有正确使用Mongodb的索引(Nutch does not Index on Elasticsearch correctly using Mongodb)

在经历了很多麻烦之后,我开始工作了。 我最终使用ES 1.4.4,nutch 2.3.1,mongodb 3.10和JDK 8。 我经历的许多问题在许多其他方面仍未得到解答: (这是一个容易的,但...)确保一切正在运行。 确保elasticsearch在正确的端口上运行在正确的机器上。 确保你可以跟它说话。 确保MongoDB已启动并在正确的端口上运行,请确保可以与之通话。 使用正确的索引命令。 对于Nutch 3.2.1而言,它是: ./bin/nutch index -all (在您获取并解 ...

获取Nutch 2.3.1提取的页面的原始html(Obtain the raw html of pages fetched by Nutch 2.3.1)

很高兴你发现视频很有用。 如果您只需要网页来训练NLP模型,为什么不使用CommonCrawl数据集? 它包含数十亿页,是免费的,可以省去大规模网页抓取的麻烦吗? 现在回答您的问题,您可以编写自定义的IndexWriter并将页面内容写入您想要的任何内容。 我不使用Nutch 2.x因为我更喜欢1.x因为它更快,功能更多并且更容易使用(说实话我实际上更喜欢StormCrawler但我更有偏见)。 Nutch 1.x有一个WARCExporter类,可以使用CommonCrawl使用的相同WARC格 ...

如何在伪分布模式下安装Hadoop中运行Nutch(How to run Nutch in Hadoop installed in pseudo-distributed mode)

确保你已经从源码构建Nutch,即不要使用只能在本地模式下工作的二进制版本。 一旦你编译完毕 蚂蚁干净的运行 转到运行时/ deploy / bin并像往常一样运行脚本。 注意,您需要在重新编译之前修改conf文件。 Make sure you have built Nutch from source i.e. don't use the binary release which works only in local mode. Once you've compile with ant clea ...

Nutch Crawler错误:预先拒绝(Nutch Crawler error: Premission denied)

这是一个权限问题。 您应该对文件夹(Hadoop配置文件core-site.xml中的<name>hadoop.tmp.dir</name>值)设置“读取”,“写入”和“执行”权限。 希望这个帮助, Le Quoc Do This is a permission problem. You should set Read,Write and Execute permission to the folder (<name>hadoop.tmp.dir</name> value in the Hadoo ...

Nutch错误:未设置JAVA_HOME(Nutch Error: JAVA_HOME is not set)

您以root用户身份运行该命令,因此应用程序看到的环境变量对于root用户而非您的用户是可见的。 只需检查root是否设置了JAVA_HOME环境变量,或者尽可能以您的用户身份运行该程序。 你可以尝试sudo -E bin/nutch inject urls 正如sudo手册所说,-E, - preserve-env向安全策略指示用户希望保留其现有环境变量。 如果用户没有保留环境的权限,则安全策略可能会返回错误。 You are running the command as root user, ...

Nutch 2.1 urls注入需要永远(Nutch 2.1 urls injection takes forever)

Ubuntu将主机中的环回IP地址默认为127.0.1.1。 HBase(根据此页面 )要求您的环回IP地址为127.0.0.1。 默认情况下,Ubuntu /etc/hosts文件包含(myComputerName是您的计算机名称): 127.0.0.1 localhost 127.0.1.1 myComputerName 使用sudo gedit /etc/hosts更新主机文件,如下所示: 127.0.0.1 localhost 127.0.0.1 myComputerNa ...

Nutch和Elasticsearch 1.1.1(Nutch and Elasticsearch 1.1.1)

主干包含一个补丁https://issues.apache.org/jira/browse/NUTCH-1745已经提交并将在Nutch-1.9中。 它应该解决您的问题 - 尽管您发布的消息无助于确定问题实际上是什么。 顺便说一下,你可以通过在Nutch用户列表上发布来获得更多相关的受众 The trunk contains a patch https://issues.apache.org/jira/browse/NUTCH-1745 which has been committed and w ...

如何从Java / Scala中读取Nutch内容?(How to read Nutch content from Java/Scala?)

斯卡拉: val conf = NutchConfiguration.create() val fs = FileSystem.get(conf) val file = new Path(".../part-00000/data") val reader = new SequenceFile.Reader(fs, file, conf) val webdata = Stream.continually { val key = new Text() val content = new Co ...