Nutch 2.2.1目前性能没有Nutch 1.7好,参考这里,NUTCH FIGHT! 1.7 vs 2.2.1. 所以我目前还是使用的Nutch 1.8。
$ wget http://psg.mtu.edu/pub/apache/nutch/1.8/apache-nutch-1.8-bin.tar.gz
$ tar zxf apache-nutch-1.8-bin.tar.gz
将解压后的文件移到/usr中,存为nutch-1.8
也可下载tar.gz文件包,http://mirrors.cnnic.cn/apache/下载后解压。移到自己的安装目录:
$ sudo mv
apache-nutch-1.8 /usr/nutch-1.8
$ cd /usr/nutch-1.8
$ bin/nutch
如果出现”Permission denied”请运行下面的命令:
$ chmod +x bin/nutch
出现nutch使用帮助即可。
如果有Warning说 JAVA_HOME
没有设置,请设置一下JAVA_HOME
.jdk环境配置问题。
在nutch文件夹中
mkdir urls
sudo gedit /urls/seed.txt
添加要爬取的url链接,例如 http://www.tianya.cn/
如果只想抓取某种类型的URL,可以在 conf/regex-urlfilter.txt
设置正则表达式,于是,只有匹配这些正则表达式的URL才会被抓取。
例如,我只想抓取豆瓣电影的数据,可以这样设置:
#注释掉这一行
# skip URLs containing certain characters as probable queries, etc.
#-[?*!@=]
# accept anything else
#注释掉这行
#+.
+^http:\/\/movie\.douban\.com\/subject\/[0-9]+\/(\?.+)?$
+^表示可以匹配所有url链接
爬虫爬取时,需要约束爬取的范围。基本所有的爬虫都是通过正则表达式来完成这个约束。
最简单的,正则:
http://www.xinhuanet.com/.*代表"http://www.xinhuanet.com/"后加任意个任意字符(可以是0个)。
通过这个正则可以约束爬虫的爬取范围,但是这个正则并不是表示爬取新华网所有的网页。新华网并不是只有www.xinhuanet.com这一个域名,还有很多子域名,类似:news.xinhuanet.com
这个时候我们需要定义这样一个正则:
http://([a-z0-9]*\.)*xinhuanet.com/这样就可以限制爬取新华网所有的网页了。
每种爬虫的正则约束系统都有一些区别,这里拿Nutch、WebCollector两家爬虫的正则系统做对比:
Nutch官网: http://nutch.apache.org/
WebCollector官网: http://crawlscript.github.io/WebCollector/conf/nutch-site.xml:
http.agent.name
My Nutch Spider
这里的配置参考nutch-default.xml,给value赋值即可
由于建索引的时候需要使用Solr,因此我们需要安装并启动一个Solr服务器。
参考Nutch Tutorial 第4、5、6步,以及Solr Tutorial。
$ wget http://mirrors.cnnic.cn/apache/lucene/solr/4.8.1/solr-4.8.1.tgz
也可以下载tar.gz文件包。http://apache.fayea.com/lucene/solr/
$ tar -zxvf solr-4.8.1.tgz
$ sudo mv solr-4.8.1 /usr/solr4.8.1
cd /usr/solr4.8.1/example
java -jar start.jar
验证是否启动成功
用浏览器打开
http://localhost:8983/solr/#/
,如果能看到页面,说明启动成功。
NUTCH安装目录是:/usr/nutch1.8
SOLR安装目录是:/usr/solr4.8.1
将NUTCH-1.8/conf/schema-solr4.xml
拷贝到SOLR_DIR/exanple/solr/collection1/conf/
,重命名为schema.xml,并在
最后添加一行(具体解释见Solr 4.2 - what is _version_field?),
重启Solr,
# Ctrl+C to stop Solr
java -jar start.jar
Nutch自带了一个脚本,./bin/crawl
,把抓取的各个步骤合并成一个命令,看一下它的用法
$ bin/crawl
Missing seedDir : crawl
注意,是使用bin/crawl
,不是bin/nutch crawl
,后者已经是deprecated的了。
$ ./bin/crawl ~/urls/ ./TestCrawl http://localhost:8983/solr/ 2
~/urls
是存放了种子url的目录过了一会儿,屏幕上出现了一大堆url,可以看到爬虫正在抓取!
fetching http://music.douban.com/subject/25811077/ (queue crawl delay=5000ms)
fetching http://read.douban.com/ebook/1919781 (queue crawl delay=5000ms)
fetching http://www.douban.com/online/11670861/ (queue crawl delay=5000ms)
fetching http://book.douban.com/tag/绘本 (queue crawl delay=5000ms)
fetching http://movie.douban.com/tag/科幻 (queue crawl delay=5000ms)
49/50 spinwaiting/active, 56 pages, 0 errors, 0.9 1 pages/s, 332 245 kb/s, 131 URLs in 5 queues
fetching http://music.douban.com/subject/25762454/ (queue crawl delay=5000ms)
fetching http://read.douban.com/reader/ebook/1951242/ (queue crawl delay=5000ms)
fetching http://www.douban.com/mobile/read-notes (queue crawl delay=5000ms)
fetching http://book.douban.com/tag/诗歌 (queue crawl delay=5000ms)
50/50 spinwaiting/active, 61 pages, 0 errors, 0.9 1 pages/s, 334 366 kb/s, 127 URLs in 5 queues
$ bin/nutch readdb TestCrawl/crawldb/ -stats
14/02/14 16:35:47 INFO crawl.CrawlDbReader: Statistics for CrawlDb: TestCrawl/crawldb/
14/02/14 16:35:47 INFO crawl.CrawlDbReader: TOTAL urls: 70
14/02/14 16:35:47 INFO crawl.CrawlDbReader: retry 0: 70
14/02/14 16:35:47 INFO crawl.CrawlDbReader: min score: 0.005
14/02/14 16:35:47 INFO crawl.CrawlDbReader: avg score: 0.03877143
14/02/14 16:35:47 INFO crawl.CrawlDbReader: max score: 1.23
14/02/14 16:35:47 INFO crawl.CrawlDbReader: status 1 (db_unfetched): 59
14/02/14 16:35:47 INFO crawl.CrawlDbReader: status 2 (db_fetched): 11
14/02/14 16:35:47 INFO crawl.CrawlDbReader: CrawlDb statistics: done
上一节为了简单性,一个命令搞定。本节我将严格按照抓取的步骤,一步一步来,揭开爬虫的神秘面纱。感兴趣的读者也可以看看 bin/crawl
脚本里的内容,可以很清楚的看到各个步骤。
先删除第7节产生的数据,
$ rm -rf TestCrawl/
Nutch data is composed of:
crawldb
. This contains information about every URL known to Nutch, including whether it was fetched, and, if so, when.linkdb
. This contains the list of known links to each URL, including both the source URL and anchor text of the link.segments
. Each segment is a set of URLs that are fetched as a unit. Segments are directories with the following subdirectories:
crawl_generate
names a set of URLs to be fetchedcrawl_fetch
contains the status of fetching each URLcontent
contains the raw content retrieved from each URLparse_text
contains the parsed text of each URLparse_data
contains outlinks and metadata parsed from each URLcrawl_parse
contains the outlink URLs, used to update the crawldb$ bin/nutch inject TestCrawl/crawldb ~/urls
将根据~/urls
下的种子URL,生成一个URL数据库,放在crawdb
目录下。
$ bin/nutch generate TestCrawl/crawldb TestCrawl/segments
这会生成一个 fetch list,存放在一个segments/日期
目录下。我们将这个目录的名字保存在shell变量s1
里:
$ s1=`ls -d TestCrawl/segments/2* | tail -1`
$ echo $s1
$ bin/nutch fetch $s1
将会在 $1
目录下,生成两个子目录, crawl_fetch
和 content
。
$ bin/nutch parse $s1
将会在 $1
目录下,生成3个子目录, crawl_parse
, parse_data
和 parse_text
。
$ bin/nutch updatedb TestCrawl/crawldb $s1
这将把crawldb/current
重命名为crawldb/old
,并生成新的 crawldb/current
。
$ bin/nutch readdb TestCrawl/crawldb/ -stats
在建立索引之前,我们首先要反转所有的链接,这样我们就可以获得一个页面所有的锚文本,并给这些锚文本建立索引。
$ bin/nutch invertlinks TestCrawl/linkdb -dir TestCrawl/segments
$ bin/nutch solrindex http://localhost:8983/solr TestCrawl/crawldb/ -linkdb TestCrawl/linkdb/ TestCrawl/segments/20140203004348/ -filter -normalize
有时重复添加了数据,导致索引里有重复数据,我们需要去重,
$bin/nutch solrdedup http://localhost:8983/solr
如果数据过时了,需要在索引里删除,也是可以的。
$ bin/nutch solrclean TestCrawl/crawldb/ http://localhost:8983/solr
9.solr与tomcat整合
9.1 下载tomcat安装包,点这里下载:http://tomcat.apache.org/download-70.cgi
$ tar -zxvf apache-tomcat-7.0.57.tar.gz
$ sudo mv apache-tomcat-7.0.57 /usr/tomcat
这里我的安装目录是/usr/tomcat
9.2 整合solr与tomcat
假定$SOLR_HOME为/usr/tomcat/solr
步骤1,从solr-4.8.1/dist复制solr-4.8.1.war到$SOLR_HOME下的wabapps中,并重命名为solr.war;
步骤2,将solr-4.8.1/example/solr复制到$/usr/tomcat目录;
步骤3,在tomcat/conf/catalina/localhost下新建solr.xml,如下:
xml version="1.0" encoding="utf-8"?>
< Context docBase="/usr/tomcat/wabapps/solr.war" reloadable="true" >
< Environment name="solr/home" type="java.lang.String" value="/usr/tomcat/solr" override="true" />
Context >
|
步骤4,从solr-4.8.1/example/lib/ext复制所有的jar到tomcat/lib下,并复制solr-4.8.1/example/resources/log4j.properties到tomcat/lib下(有关日志的说明,见http://wiki.apache.org/solr/SolrLogging),须知,solr-4.8.1.jar并没有自带日志打印组件,因此这个步骤不执行,可能引起“org.apache.catalina.core.StandardContext filterStart SEVERE: Exception starting filter SolrRequestFilter org.apache.solr.common.SolrException: Could not find necessary SLF4j logging jars.”异常;
步骤五, 进入到 /tomcat/solr/collection1/conf/ 目录下的solrconfig.xml文件中,修改两处,一是注释掉文件中的这一部分代码,大致可以知道,这个简单的项目用不到这些配置:
${solr.data.dir:}
${solr.data.dir:/tomcat/solrindex}