(六)——抓取结果分析

最后更新于:2022-04-01 02:00:25

本教程介绍如何使用Nutch的readdb,readlinkdb和readseg来对Nutch的数据进行分析 ## 1 readdb 用于读取或者导出Nutch的抓取数据库,通常用于查看数据库的状态信息,查看readdb的用法: ~~~ bin/nutch readdb Usage: CrawlDbReader <crawldb> (-stats | -dump <out_dir> | -topN <nnnn> <out_dir> [<min>] | -url <url>) <crawldb>directory name where crawldb is located -stats [-sort] print overall statistics to System.out [-sort]list status sorted by host -dump <out_dir> [-format normal|csv|crawldb]dump the whole db to a text file in <out_dir> [-format csv]dump in Csv format [-format normal]dump in standard format (default option) [-format crawldb]dump as CrawlDB [-regex <expr>]filter records with expression [-retry <num>]minimum retry count [-status <status>]filter records by CrawlDatum status -url <url>print information on <url> to System.out -topN <nnnn> <out_dir> [<min>]dump top <nnnn> urls sorted by score to <out_dir> [<min>]skip records with scores below this value. This can significantly improve performance. ~~~ 这里的crawldb即为保存URL信息的数据库,具体可参阅http://www.sanesee.com/article/step-by-step-nutch-crawl-by-step(Nutch 1.10入门教程(五)——分步抓取),-stats表示查看统计状态信息,-dump表示导出统计信息,url表示查看指定URL的信息,查看数据库状态信息: ~~~ bin/nutch readdb data/crawldb –stats ~~~ 得到的统计结果如下: ~~~ Statistics for CrawlDb: data/crawldb TOTAL urls: 59 retry 0: 59 min score: 0.001 avg score: 0.049677964 max score: 1.124 status 1 (db_unfetched): 34 status 2 (db_fetched): 25 CrawlDb statistics: done ~~~ TOTAL urls表示URL总数,retry表示重试次数,mins score为最低分数,max score为最高分数,status 1 (db_unfetched)为未抓取的数目,status 2 (db_fetched)为已抓取的数目。 导出crawldb信息: ~~~ bin/nutch readdb data/crawldb -dump crawldb_dump ~~~ 将数据导入到crawldb_dump这个文件夹中,查看导出的数据信息: ~~~ cat crawldb_dump/* ~~~ 可以看到,导出的信息类似以下格式: ~~~ http://www.sanesee.com/psy/pdp Version: 7 Status: 2 (db_fetched) Fetch time: Fri Aug 14 12:47:10 CST 2015 Modified time: Thu Jan 01 08:00:00 CST 1970 Retries since fetch: 0 Retry interval: 2592000 seconds (30 days) Score: 0.082285136 Signature: e567e99a1d008ae29266a7ef9ea43414 Metadata:    _pst_=success(1), lastModified=0 _rs_=205 Content-Type=text/html ~~~ 我们就可以清楚地看到crawldb是如何保存我们的URL的。 ## 2 readlinkdb readlinkdb用于导出全部URL和锚文本,查看用法: ~~~ bin/nutch readlinkdb Usage: LinkDbReader <linkdb> (-dump <out_dir> [-regex <regex>]) | -url <url> -dump <out_dir>dump whole link db to a text file in <out_dir> -regex <regex>restrict to url's matching expression -url <url>print information about <url> to System.out ~~~ 这里的dump和url参数与readdb命令同理,导出数据: bin/nutch readlinkdb data/linkdb -dump linkdb_dump 将数据导入到linkdb_dump这个文件夹中,查看导出的数据信息: ~~~ cat linkdb_dump /* ~~~ 可以看到,导出的信息类似以下格式: http://archive.apache.org/dist/nutch/ Inlinks:  fromUrl: http://www.sanesee.com/article/step-by-step-nutch-introduction anchor: http://archive.apache.org/dist/nutch/ 即记录了来源URL。 ## 3 readseg readseg用于查看或导出segment里面的数据,查看使用方法: ~~~ bin/nutch readseg Usage: SegmentReader (-dump ... | -list ... | -get ...) [general options] * General options: -nocontentignore content directory -nofetchignore crawl_fetch directory -nogenerateignore crawl_generate directory -noparseignore crawl_parse directory -noparsedataignore parse_data directory -noparsetextignore parse_text directory * SegmentReader -dump <segment_dir> <output> [general options]   Dumps content of a <segment_dir> as a text file to <output>. <segment_dir>name of the segment directory. <output>name of the (non-existent) output directory. * SegmentReader -list (<segment_dir1> ... | -dir <segments>) [general options]   List a synopsis of segments in specified directories, or all segments in   a directory <segments>, and print it on System.out <segment_dir1> ...list of segment directories to process -dir <segments>directory that contains multiple segments * SegmentReader -get <segment_dir> <keyValue> [general options]   Get a specified record from a segment, and print it on System.out. <segment_dir>name of the segment directory. <keyValue>value of the key (url). Note: put double-quotes around strings with spaces. ~~~ 导出segment数据: bin/nutch readseg -dump data/segments/20150715124521 segment_dump 将数据导入到segment_dump这个文件夹中,查看导出的数据信息: ~~~ cat segment_dump /* ~~~ 可以看到,里面包含非常具体的网页信息。 到此,本教程对Nutch最主要的命令就介绍完了,其它的命令读者可以自己去研究一下。
';

(五)——分步抓取

最后更新于:2022-04-01 02:00:23

如果要深入学习Nutch爬虫技术,仅仅会使用crawl命令是不够的,还需要对抓取的过程非常熟悉。本篇文章讲解分布抓取的详细步骤,这里需要用到上一教程中seed.txt所保存的URL信息,还需删除data/crawldb,data/linkdb和data/segments文件夹下的内容,因为我们要分步重新抓取数据。 上一教程[Nutch 1.10入门教程(四)——crawl命令](http://www.sanesee.com/article/step-by-step-nutch-crawl "Nutch 1.10入门教程(四)——crawl命令")这篇文章讲解了一站式抓取命令crawl的用法,然而,实际的抓取过程包含多个命令的,为了简化操作,crawl把多个命令组合到一起提供给用户使用的。如果要深入学习Nutch爬虫技术,仅仅会使用crawl命令是不够的,还需要对抓取的过程非常熟悉。本篇文章讲解分布抓取的详细步骤,这里需要用到上一教程中seed.txt所保存的URL信息,还需删除data/crawldb,data/linkdb和data/segments文件夹下的内容,因为我们要分步重新抓取数据。 ## 1 Nutch数据文件夹组成 执行crawl命令之后,会在Nutch的runtime/local下面生成一个TestCrawl文件夹,里面包含三个文件夹:crawldb、linkdb和segments。 crawldb:它包含Nutch所发现的所有URL,它包含了URL是否被抓取、何时被抓取的信息。 linkdb:它包含了Nutch所发现的crawldb中的URL所对应的全部链接,以及源URL和锚文本。 segments:里面包含多个以时间命名的segment文件夹,每个segment就是一个抓取单元,包含一系列的URL,每个segment又包含如下文件夹: ~~~ crawl_generate:待抓取的URL crawl_fetch:每个URL的抓取状态 content:从每个URL抓取到的原始内容 parse_text:从每个URL解析得到的文本 parse_data:从每个URL解析得到的外链和元数据 crawl_parse:包含外链URL,用来更新crawldb ~~~ ## 2 将URL列表注入到crawldb中 ~~~ bin/nutch inject data/crawldb urls ~~~ ## 3 抓取 ### 3.1 生成抓取列表 为了抓取指定URL的页面,我们需要先从数据库(crawldb)里生成一个抓取列表: ~~~ bin/nutch generate data/crawldb data/segments ~~~ generate命令执行之后,会生成一个待抓取页面的列表,抓取列表存放在一个新建的segment路径中。segment的文件夹根据创建的时间进行命名(本教程文件夹名为201507151245)。 generate还有很多可选参数,读者可以通过以下命令自行查看(其它命令的查看方法也一样): ~~~ bin/nutch generate ~~~ ### 3.2 开始抓取 根据generate生成的抓取列表抓取网页: ~~~ bin/nutch fetch data/segments/201507151245  #这里的201507151245为文件夹名,需要根据自己的情况进行更改,或者直接采用data/segments文件夹,这样的操作对segments文件夹下的所有子文件夹生效,后文同理。 ~~~ ### 3.3 解析 ~~~ bin/nutch parse data/segments/201507151245 ~~~ ### 3.4 更新数据库 根据抓取的结果更新数据库: ~~~ bin/nutch updated data/crawldb –dir data/segments/201507151245 ~~~ 现在,数据库里包含所有初始页面更新后的入口,以及从初始集合中新发现的页面的新入口。 ### 3.5 反转链接 在建立索引之前,我们首先对所有的链接进行反转,这样我们才可以对页面的来源锚文本进行索引。 ~~~ bin/nutch invertlinks data/linkdb –dir data/segments/201507151245 ~~~ ### 3.6 将抓取到的数据加入Solr索引 如果还没有安装Apache Solr,请参考[Nutch 1.10入门教程(三)——Solr安装与配置](http://www.sanesee.com/article/step-by-step-nutch-solr-settings "Nutch 1.10入门教程(三)——Solr安装与配置")安装好Solr服务器,并启动。 现在,我们对抓取到的资源建立索引: ~~~ bin/nutch index data/crawldb -linkdb data/linkdb -params solr.server.url=http://192.168.1.11:8983/solr -dir data/segments/201507151245 ~~~ ### 3.7 去除重复URL 一旦建立了全文索引,它必须处理重复的URL,使得URL是唯一的: ~~~ bin/nutch dedup ~~~ 这个命令基于签名查找重复的URL,对重复的URL标记为STATUS_DB_DUPLICATE,Cleaning和Indexing任务将会根据标记删除它们。 ### 3.8 清理 ~~~ bin/nutch clean –D solr.server.url=http://192.168.1.11:8983/solr data/crawldb ~~~ 从solr移除HTTP301、404以及重复的文档。 到此为止,我们使用分步抓取的方式完成了所有抓取步骤,正常抓取的情况下,可以在http://192.168.1.11:8983/solr进行搜索了
';

(四)——crawl命令

最后更新于:2022-04-01 02:00:21

Crawl为Nutch提供的用于一站式抓取的命令,用户只需要执行一条命令就可以完成抓取的全过程。 进入Nutch的主目录,今后我们大部分执行命令的操作都是在Nutch主目录完成的,而不是在Nutch的bin目录里,因为这样可以更方便地执行一些复杂的命令。查看一站式抓取命令: ~~~ bin/crawl ~~~ 查看nutch命令: ~~~ bin/nutch ~~~ 输入以上两个命令显示了它们各自的使用方法,后文会详细讲解一部分常用的命令。 查看crawl的使用方法: ~~~ bin/crawl Usage: crawl [-i|--index] [-D "key=value"] <Seed Dir> <Crawl Dir> <Num Rounds> -i|--indexIndexes crawl results into a configured indexer -DA Java property to pass to Nutch calls Seed DirDirectory in which to look for a seeds file Crawl DirDirectory where the crawl/link/segments dirs are saved Num RoundsThe number of rounds to run this crawl for ~~~ -i|index用于告知nutch将抓取的结果添加到配置的索引器中。 -D用于配置传递给Nutch调用的参数,我们可以将索引器配置到这里。 Seed Dir种子文件目录,用于存放种子URL,即爬虫初始抓取的URL。 Crawl Dir抓取数据的存放路径。 Num Rounds循环抓取次数 使用示例: 进入Nutch的runtime/local目录,新建一个urls文件夹: ~~~ cd apache-nutch-1.10/runtime/local mkdir urls ~~~ 在urls文件夹中新建一个存放url的种子文件: ~~~ touch urls/seed.txt ~~~ 向urls/seed.txt添加初始抓取的URL: ~~~ echo http://www.163.com >> urls/seed.txt ~~~ 开始抓取网页(这里需确保Solr已经启动,否则不能正常在Solr中建立索引,安装和配置参考[Nutch 1.10入门教程(三)——Solr安装与配置](http://www.sanesee.com/article/step-by-step-nutch-solr-settings "Nutch 1.10入门教程(三)——Solr安装与配置")): ~~~ bin/crawl -i -D solr.server.url=http://localhost:8983/solr/ urls/ TestCrawl/  2 ~~~ 这条命令中,-i告知爬虫将抓取的内容添加到给定的索引中,solr.server.url=http://localhost:8983/solr/是Solr索引器的地址,urls/为种子URL文件路径,TestCrawl为Nutch用于存储抓取数据的文件夹(包含URL、抓取的内容等数据),这里的参数2表示循环抓取两次。 通过执行上面一条命令,就可以开始抓取网页了。 在浏览器中输入http://:8983/solr,选择collection1,就可以在里面通过关键字搜索到已经建立索引的内容。这里需要注意的是,爬虫并没有将指定URL的全部页面抓取下来,查看抓取情况的具体方法请参考后续教程。
';

(三)——Solr安装与配置

最后更新于:2022-04-01 02:00:19

Solr是一款优秀的基于Lucene的全文检索服务器,它对Lucene进行了扩展,提供了非常丰富的查询语言,并对查询进行了性能优化。 ## 1 Solr是什么? Solr是一款优秀的基于Lucene的全文检索服务器,它对Lucene进行了扩展,提供了非常丰富的查询语言,并对查询进行了性能优化。 ## 2 下载与安装Solr 由于当前Solr已经到了5.x版本,而Nutch1.10支持的最高版本是4.x,因此,需要到http://archive.apache.org/dist/lucene/solr/下载Solr的4.x的历史版本。本教程使用的版本是4.10.4,下载的软件包名为solr-4.10.4.zip。下载Solr: ~~~ wget http://archive.apache.org/dist/lucene/solr/4.10.4/solr-4.10.4.zip ~~~ 解压: ~~~ unzip solr-4.10.4.zip ~~~ 得到文件夹solr-4.10.4,将Nutch目录下的runtime/local/conf/schema-solr4.xml拷贝到solr的配置文件目录example/solr/collection1/conf下: ~~~ cp apache-nutch-1.10/runtime/local/conf/schema-solr4.xml solr-4.10.4/example/solr/collection1/conf ~~~ 删除solr原schema.xml文件: ~~~ rm –f solr-4.10.4/example/solr/collection1/conf/schema.xml ~~~ 将schema-solr4.xml改名为schema.xml: ~~~ mv solr-4.10.4/example/solr/collection1/conf/ schema-solr4.xml solr-4.10.4/example/solr/collection1/conf/ schema.xml ~~~ 到此,Solr就配置完毕了,进入solr-4.10.4/example目录: ~~~ cd solr-4.10.4/example ~~~ 启动Solr: ~~~ java –jar start.jar ~~~ 此时就可以通过浏览器访问8983端口,查看Solr的控制界面: http://192.168.1.11:8983/solr
';

(二)——配置

最后更新于:2022-04-01 02:00:16

Nutch的编译安装需要JDK、Ant等环境,Nutch的主要配置项在nutch-default.xml这个文件中,自定义配置文件nutch-site.xml中配置的属性会覆盖nutch-default.xml中对应的属性,可以根据实际需要对其进行配置。 ## 1 安装JDK 在Oracle官网http://www.oracle.com/technetwork/java/javase/downloads/index.html下载JDK,本教程下载的是jdk-8u45-linux-x64.tar.gz。解压JDK包: ~~~ tar zxvf jdk-8u45-linux-x64.tar.gz ~~~ 解压后得到jdk1.8.0_45这个文件夹,先查看/usr/lib/路径下有没有jvm这个文件夹,若没有,则新建一个jvm文件夹: ~~~ mkdir /usr/lib/jvm ~~~ 将当前解压得到的jdk1.8.0_45复制到/usr/lib/jvm中: ~~~ mv jdk1.8.0_45 /usr/lib/jvm ~~~ 打开profile设置环境变量: ~~~ vim /etc/profile ~~~ 在profile的末尾加入以下内容: ~~~ export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_45 export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin ~~~ 然后使用以下命令使得环境变量生效: ~~~ source /etc/profile ~~~ 到此为止,JDK就安装完成了。查看JDK的版本: ~~~ java –version ~~~ 若以上命令没有成功显示版本信息,那有可能是之前的操作出现问题,请仔细检查之前的操作。 ## 2 安装Ant 到Ant官网http://ant.apache.org/bindownload.cgi下载最新版的Ant,本教程下载的包为apache-ant-1.9.6-bin.zip。使用以下命令解压安装包: ~~~ unzip apache-ant-1.9.6-bin.zip ~~~ 解压后可得到apache-ant-1.9.5这个文件夹,将其移动到/usr/local/文件夹中: ~~~ mv apache-ant-1.9.5 /usr/local/ ~~~ 打开profile设置环境变量: ~~~ vim /etc/profile ~~~ 在profile文件末尾加入以下内容: ~~~ export ANT_HOME=/usr/local/ant export PATH=$PATH:$ANT_HOME/bin ~~~ 使用以下命令使得环境变量生效: ~~~ source /etc/profile ~~~ 查看Ant版本: ~~~ ant -version ~~~ ## 3 安装配置Nutch 请参考[Nutch 1.10入门教程(一)——Nutch简介](http://www.sanesee.com/article/step-by-step-nutch-introduction "Nutch 1.10入门教程(一)——Nutch简介")下载Nutch1.10的源码,若官网最新版已经高于1.10,则需要在历史版本中进行下载。本教程下载的Nutch包为apache-nutch-1.10-src.zip。 使用以下命令解压源码包: ~~~ unzip apache-nutch-1.10-src.zip ~~~ 解压后得到apache-nutch-1.10这个文件夹,然后进入文件夹: ~~~ cd apache-nutch-1.10 ~~~ 打开Nutch的默认配置文件: ~~~ vim conf/nutch-default.xml ~~~ 找到http.agent.name这个属性,将其拷贝到conf/nutch-site.xml中,并修改value,修改后的nutch-site.xml如下: ~~~ <configuration> <property>   <name>http.agent.name</name>     <value>myNutch</value>       <description>HTTP 'User-Agent' request header. MUST NOT be empty -         please set this to a single word uniquely related to your organization.   NOTE: You should also check other related properties:     http.robots.agents         http.agent.description             http.agent.url                 http.agent.email                     http.agent.version   and set their values appropriately.   </description>   </property> </configuration> ~~~ http.agent.name这个属性是用于标记爬虫的,便于被爬的网站对其进行识别。 nutch-site.xml中配置的属性会覆盖nutch-default中的默认属性,在这里我们仅修改http.agent.name这个属性,其它的不作改变。 到此,我们就配置好Nutch了,接着,在Nutch的主目录使用以下命令对源码进行编译: ~~~ ant ~~~ 首次编译过程会耗费较多时间,因为需要下载较多的依赖包,具体时间根据实际网络情况而定,快的话需要5-10分钟,慢的话需要20分钟以上。 编译开始时会报如下警告: Could not load definitions from resource org/sonar/ant/antlib.xml. It could not be found. 这个警告不影响编译结果,因此可以忽略。 编译过程中也有可能因为网络问题而出现编译失败,只需要使用如下命令清除上次编译结果(不会删除已经下载好的依赖包): ~~~ ant clean ~~~ 然后再使用如下命令进行编译: ~~~ ant ~~~ 在网络较差的情况下,可能会重复上面两步操作多次。 当出现如下类似信息时,也就意味着编译成功了: ~~~ BUILD SUCCESSFUL Total time: 1 minute 7 seconds ~~~ ## 4 编译后的目录结构 Nutch编译成功之后,会在主目录下生成一个runtime文件夹。其中包含deploy和local两个子文件夹。deploy用于分布式抓取,而local用于本地单机抓取。本节内容先讲解使用本地单机抓取,分布式抓取放到后续教程。 进入local文件夹,再进入bin文件夹。这里包含两个脚本文件,一个是nutch,另一个是crawl。其中,nutch包含了所需的全部命令,而crawl主要用于一站式抓取。
';

(一)——Nutch简介

最后更新于:2022-04-01 02:00:14

> 原文出处:http://www.sanesee.com/ Nutch作为当今最流行的开源爬虫之一,已被企业广泛使用。Nutch的插件机制使得开发者可以灵活地定制网页抓取策略。Nutch有着悠久的历史,当今大名鼎鼎的Hadoop就是由Nutch发展而来。Nutch不仅可以运行在单机模式下,还可以运行在分布式模式下。 ## 1 认识Nutch 目前Nutch分为两个大版本1.x和2.x,Apache分别对这两个大版本进行独立开发和维护。其中,1.x和2.x最大的不同点在于,1.x是基于hadoop的HDFS文件系统的,而2.x将数据的存储层抽象出来,可以将数据保存在Hbase、MySQL等数据库中。还有一点很重要,Nutch在1.2以及之前,都是作为一个完整的搜索引擎进行发布的,而从1.3开始,Nutch本身就主要只有爬虫功能,若需要对抓取的数据建立索引并进行搜索,还要用到Solr全文检索服务器。由于Nutch和Solr都是基于Lucene开发的,因此Nutch抓取的数据可以轻松地在Solr中建立索引。Nutch官网可以下载到编译好的1.x包,但2.x只提供源码,需要自己编译。Nutch使用Ant来构建的,若自己编译的话,需要安装Ant来编译源码。 对于如何选择Nutch的版本,主要考虑一下以下问题:如果只需要抓取少量的网站,并对其建立索引,使用1.x和2.x都可以,甚至都可以使用单机的,而不需分布式。但如果要抓取大量网站,甚至是全网爬行,那么最好选择1.x,并且采用分布式,因为1.x是基于hadoop文件系统的,而hadoop又是专门为处理大数据而生。若抓取大量网站时采用2.x,可能会遇到一些性能问题,要是使用MySQL来存储数据,网页数据上百亿时,性能将是一个噩梦。 Nutch1.x不同的版本变化也比较大,执行命令发生过较大改变,因此,建议初学者下载本教程对应的版本1.10,等到熟悉使用Nutch的时候,那些改变对你而言就没太大影响了。 Nutch作为当今最流行的开源爬虫之一,已被企业广泛使用。Nutch的插件机制使得开发者可以灵活地定制网页抓取策略。Nutch有着悠久的历史,当今大名鼎鼎的Hadoop就是由Nutch发展而来。Nutch不仅可以运行在单机模式下,还可以运行在分布式模式下。 ## 2 Nutch工作环境 Nutch仅支持在Linux环境下工作,若要在Windows操作系统中使用Nutch,需要安装Cygwin。Cygwin是在Windows下模拟Linux操作系统的软件,它并非一个实际的操作系统。 最新版的Nutch 1.10需要JDK7运行环境,当然也可以使用最新版的JDK8。 若需要配置分布式运行环境,还需要下载hadoop-1.2.0的版本。Hadoop的历史版本下载地址为[http://archive.apache.org/dist/hadoop/core/](http://archive.apache.org/dist/hadoop/core/)。 本教程将演示编译Nutch源码的过程,因此还需要安装Ant。 ## 3 下载Nutch     在Nutch的官方网站[http://nutch.apache.org/downloads.html](http://nutch.apache.org/downloads.html)可以下载到最新版的Nutch,若需要下载历史版本,请在这里下载[http://archive.apache.org/dist/nutch/](http://archive.apache.org/dist/nutch/)。本教程下载的包为apache-nutch-1.10-src.zip,它是一个源码包,需要我们自己编译,具体的编译过程在后续教程中详细讲解。
';