Nutch 使用之锋芒初试
“工欲善其事,必先利其器。”经过前文的“ 细解 ”,我们已经完成了Nutch在Windows中的安装。接下来就让我们通过锋芒初试,来亲自体验一下Nutch的强大功能吧!
Nutch的爬虫抓取网页有两种方式,一种方式是Intranet Crawling,针对的是企业内部网或少量网站,使用的是crawl命令;另一种方式是Whole-web crawling,针对的是整个互联网,使用inject、generate、fetch和updatedb等更底层的命令。 本文将以使用Nutch为笔者在CSDN处的个人专栏( http://blog.csdn.net/zjzcl )文章内容建立搜索功能为例,来讲述Intranet Crawling的基本使用方法(假设用户电脑系统已安装好JDK、Tomcat和Resin,并做过相应的环境配置)。
1、设置Nutch的环境变量
在Windows系统的环境变量设置中,增加NUTCH_JAVA_HOME变量,并将其值设为JDK的安装目录。比如笔者电脑中JDK安装于D:/j2sdk1.4.2_09,因此将NUTCH_JAVA_HOME的值设为D:/j2sdk1.4.2_09。
2、Nutch抓取网站页面前的准备工作
(1)在Nutch的安装目录中建立一个名为url.txt的文本文件,文件中写入要抓取网站的顶级网址,即要抓取的起始页。笔者在此文件中写入如下内容:
http://blog.csdn.net/zjzcl
(2)编辑conf/crawl-urlfilter.txt文件,修改MY.DOMAIN.NAME部分:
# accept hosts in MY.DOMAIN.NAME
+^http://blog.csdn.net/zjzcl
<value>填上你的代理服务器名或IP</value>
<description>The proxy hostname. If empty, no proxy is used.</description>
</property>
<name>http.proxy.port</name>
<value>端口</value>
<description>The proxy port.</description>
</property>
3、运行Crawl命令抓取网站内容
双击电脑桌面上的Cygwin图标,在命令行窗口中输入:
cd /cygdrive/i/nutch-0.7.1
不明白此命令含义的读者请参见前 《细解》 一文,然后再输入:
bin/nutch crawl url.txt -dir crawled -depth 3 -threads 4 >& crawl.log
等待大约2分多钟后,程序运行结束。读者会发现在nutch-0.7.1目录下被创建了一个名为crawled的文件夹,同时还生成一个名为crawl.log的日志文件。利用这一日志文件,我们可以分析可能遇到的任何错误。另外,在上述命令的参数中,dir指定抓取内容所存放的目录,depth表示以要抓取网站顶级网址为起点的爬行深度,threads指定并发的线程数。
4、使用Tomcat进行搜索测试
(1)将tomcat/webapps下的ROOT文件夹名改成ROOT1;
(2)将nutch-0.7.1目录的nutch-0.7.1.war复制到tomcat/webapps下,并将其改名为ROOT;
(3)打开ROOT/WEB-INF/classes下的nutch-site.xml文件,修改成如下形式:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="nutch-conf.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<nutch-conf>
<property>
<name>searcher.dir</name>
<value>I:/nutch-0.7.1/crawled</value>
</property>
</nutch-conf>
其中的“<value>I:/nutch-0.7.1/crawled</value>”部分,读者应根据自己的设置进行相应修改。
(4)启动Tomcat,打开浏览器在地址栏中输入:http://localhost:8080,如图1所示:
在文本框中输入关键字,就可以进行搜索了。不过用户在使用时会发现,对于英文单词的搜索一切正常,而当要搜索中文词语时会出现乱码。其实这个问题是Tomcat设置的问题,解决办法是修改tomcat/conf下的server.xml文件,将其中的Connector部分改成如下形式即可:
<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true"
URIEncoding="UTF-8" useBodyEncodingForURI="true" />
现在我们可以对中文词汇进行搜索了。如在搜索框中输入“李开复”,点击搜索按钮后,会搜索到笔者之前写的两篇文章《从李开复换门庭开启的缝隙中窥视——试探Google的几招成功“秘诀”》与《从国内首例禽流感假疫苗大案说起——有感于李开复<做最好的自己>中的诚信观》,如图2所示:
如果点击show all hits按钮,则会列出更多相关的搜索结果了。
5、使用Resin进行搜索测试
由于笔者最近工作中经常使用Resin,因此在Tomcat上测试完毕后也想在Resin上测试一把,未曾想遇到了各种意想不到的情况。下面就将所遇到的问题以及解决方法列出,以供遇到相同问题的读者参考。
(1)将nutch-0.7.1目录的nutch-0.7.1.war复制到resin-3.0.17/webapps下;
(2)打开resin-3.0.17/conf下的resin.conf文件,把
<!-- configures the default host, matching any host name -->
下面的内容改成:
<host id="" root-directory=".">
<web-app id="/" document-directory="webapps/nutch-0.7.1"/>
<stderr-log path='logs/stderr.log' rollover-period='1W'/>
<stdout-log path='logs/stdout.log' rollover-period='1W'/>
</host>
(3)打开resin-3.0.17/webapps/nutch-0.7.1/WEB-INF/classes下的nutch-site.xml文件,修改成如下形式:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="nutch-conf.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<nutch-conf>
<property>
<name>searcher.dir</name>
<value>I:/nutch-0.7.1/crawled</value>
</property>
</nutch-conf>
其中的“<value>I:/nutch-0.7.1/crawled</value>”部分,读者应根据自己的设置进行相应修改。
(4)启动Resin,打开浏览器在地址栏中输入http://localhost:8080后,在Nutch的搜索框中输入关键字,点击“搜索”按钮会出现如图3所示的错误。
查看resin-3.0.17/logs下的stdout.log文件,会发现报空指针的错误。查阅相关资料后才知,原来Resin没有使用Xerces作为其默认的XML解析器,而Nutch又恰好用到了Xerces,因此应该在Resin的配置文件中明确告之要使用Xerces。打开resin-3.0.17/conf下的resin.conf文件,在<server>标签的上面加上两行内容:
<system-property javax.xml.parsers.DocumentBuilderFactory="org.apache.xerces.jaxp.DocumentBuilderFactoryImpl"/>
<system-property javax.xml.parsers.SAXParserFactory="org.apache.xerces.jaxp.SAXParserFactoryImpl"/>
同时,还要将tomcat/common/endorsed下的xercesImpl.jar、xmlParserAPIs.jar复制到resin-3.0.17/lib目录中。重新启动Resin,打开http://localhost:8080并输入要搜索的关键字后,这时终于不再出现空指针错误了,但是却出现了如图4所示的错误。
这个错误出得有些莫明其妙,同样的内容在Tomcat里安然无恙,但是在Resin中却会出现找不到/zh/include/footer.html文件的异常。没办法只好手工将resin-3.0.17/webapps/nutch-0.7.1/include下的footer.html文件复制到resin-3.0.17/webapps/nutch-0.7.1/zh/include目录中。重启Resin进行搜索,终于又见到了久违的如前图2所示的搜索结果了。
6、总结
Nutch目前对中文分词的支持还不够完善,从测试的结果来看它是将中文词语分成单独的字进行处理的。但是瑕不掩瑜,作为一个开源的搜索引擎项目,Nutch的功能不仅可圈可点,而且从对它源代码的解读中可以使我们对搜索引擎的运行机理和相关算法有了更加深入的了解。此外,Nutch优秀的设计架构使得用户能够非常容易的开发自己的插件,以实现个性化的需求与功能。相信随着Nutch不断的改进和成熟,在不久的将来,基于Nutch的个人搜索引擎以及行业垂直搜索引擎会不断的涌现出来。
参考资料:
1、Nutch tutorial
2、Getting Nutch Running With Windows
3、Getting Nutch Running With Resin
4、Nutch 初体验之二