这是半年前使用Nutch的时候写的.本文讲述了如何搭建一个可运行的Nutch系统.Nutch是个开源的建立搜索引擎的项目,功能很强大,有时间去研究研究还是很好的.
一.Nutch的安装
Nutch的安装比较简单,下面介绍在Linux下的安装步骤:(在Windows下也能运行,不过先得安装cygwin,一个在windows环境下模拟Linux的软件,具体安装步骤见 二.Cygwin的安装与使用,安装完之后的使用方法同Linux环境下使用)
下载:
可以去Apache的官方网页http://www.apache.org/dyn/closer.cgi/lucene/nutch/ 下载最新版的Nutch,目前最新版是nutch-0.7.1,45M大小。
解压:
下载的是一个压缩包,比如:nutch-0.7.tar.gz,由后缀名我们知道这是一个先经过打包再经过压缩的文件,所以在Linux下运行以下命令以解压:
gunzip nutch-0.7.tar.gz //解压缩,得到文件:nutch-0.7.tar
tar –xvf nutch-0.7.tar //解包,得到目录nutch-0.7
如果不出错的话,应该得到一个目录nutch-0.7,里面包含了nutch所有的源代码,文档等。
安装辅助软件(运行环境):
Nutch是用java写的一个开源项目,所以要使它正常运行必须安装JDK(也为了能修改nutch),Java 1.4.x以上版本,设置环境变量NUTCH_JAVA_HOME为java虚拟机的安装目录。
此外,还必须安装Apache's Tomcat 4.x 以上版本。
最后,想得到较好的运行效果,必须有至少1G的剩余空间和一个网速较快的网络。
运行以测试安装结果:
设置NUTCH_JAVA_HOME的值设为java的安装目录,即JAVA_HOME的值。(在JDK1.5中不设也能运行)
改变当前工作区为nutch-0.7(即:刚才的解包目录),运行以下命令:
bin/nutch
如果一切正常的话,会显示nutch的命令说明,比如:
Uage: nutch Commad ……
二.Cygwin的安装(使用Linux环境的用户可以直接阅读第三点)
cygwin 简介
(略)
cygwin下载
1. 下载setup.exe文件,然后运行选择“install from internet”,然后程序会自动从网上下载并安装。(考虑到网速问题,不推荐此方法)
2. 从北邮的ftp下载,地址:ftp:// openware.byr.edu.cn/mirro/cygwin
cygwin 安装
1. 双击“setup.exe”文件,出现如下安装界面:
2. 点击“下一步”
3. 假定你已经从ftp上下载了cygwin的安装镜像(见cygwin的下载),选择“install from Local Directory”。否则选择“install from internet”(不推荐)。然后点击“下一步”
4. 选择安装路径,比如我装在“C:\cygwin”,点击“下一步”
5. 选择本地镜像路径,就是你下载的cygwin的安装镜像的路径。点击“下一步”
6. 安装向导显示出所要安装的内容列表,用户可以根据自己的实际需要来决定安装哪些程序。点击循环箭头图标后面的文字,可以更改安装的方式,常用的方式有Default(表示只安装缺省的安装项)、Install(表示安装全部程序,空间要求较大)、Reinstall(表示重新安装程序)。推荐选择“Install”方式,一步到位,以免后扰,点击“下一步”后,就开始正式的安装了
7. 最后出现如下所示的窗口,点击“完成”后,Cygwin安装完毕。
8. 安装完毕,在桌面上生成一个快捷方式:cygwin,双击它就能运行程序了。
三.nutch 使用
总体上Nutch可以分为2个部分:抓取部分和搜索部分。抓取程序抓取页面并把抓取回来的数据做成反向索引,搜索程序则对反向索引搜索回答用户的请求。抓取程序和搜索程序的接口是索引。两者都使用索引中的字段。实际上搜索程序和抓取程序可以分别位于不同的机器上。
网页的抓取主要分为2种:Intranet crawling和 Whole-web crawling。从名字可以很容易明白他们抓取的范围。一般Whole-web crawling对配置要求高(面对海量数据,抓取数据和存储空间都至关重要),花费时间长(几天甚至是几周),我们没有必要做这样的测试。所以我已抓取我们学校内部网页为例子,来做一个测试。
抓取前的准备工作
输入需要抓取的网站地址
在Nutch的安装目录中建立一个名为myurl的文本文件,文件中写入要抓取网站的顶级网址,即要抓取的起始页。
以我要抓取的网页为例,输入:
注意:最后一个“/”不能少,否则和conf/crawl-urlfilter.txt中的内容不匹配,不能运行。
更改配置文件 crawl-urlfilter.txt
编辑conf/crawl-urlfilter.txt文件,修改MY.DOMAIN.NAME部分,把它替换为你想要抓取的域名(地址),即把
# accept hosts in MY.DOMAIN.NAME
+^http://([a-z0-9]*\.)*MY.DOMAIN.NAME/
修改为:
# accept hosts in MY.DOMAIN.NAME
+^http://([a-z0-9]*\.)* bupt.edu.cn /
运行 crawl命令抓取网站内容
运行的命令
按3.1做好抓取前的准备,接着就可以使用crawl命令抓取网页。Crawl命令的可选参数如下:
·-dir dirnames 设置保存所抓取网页的目录.
·-depth depth 表明抓取网页的层次深度
·-delay delay 表明访问不同主机的延时,单位为“秒”
·-threads threads 表明需要启动的线程数
实际使用
改变当前工作区为nutch安装目录,运行以下命令行:
bin/nutch crawl myurl -dir mydir -depth 2 -threads 4 >&logs/logs1.log
在上述命令的参数中,myurl就是刚才我们创建的那个文件,存放我们要抓取的网址,dir指定抓取内容所存放的目录,depth表示以要抓取网站顶级网址为起点的爬行深度,threads指定并发的线程数。最后的logs/logs1.log表示把显示的内容保存在文件logs1.log中,以便分析程序的运行情况。
实际运行时间:5分钟。如果抓取成功的话,那么在目录mydir下有3个目录:
1. db
2. segments
3. index
查看抓取结果
1. 查看所抓取的网页数和链接数:
bin/nutch readbd mydir/db stats
mydir是刚才抓取网页时的保存文件夹。
显示结果:
Nuber of pages: 1240
Nuber of links: 2598
可能发生的错误:
1. 如果mydir在运行前已存在,则运行时将报错:mydir already exist。建议先删除这个目录,或者指定其他的目录存放抓取的网页。
四.在Tomcat中运行查看结果(在Windows下部署成功,但是在LInux下总是出错)
如果已经抓取成功,则可以在Tomcat上部署了,具体步骤如下:
1. 复制mydir/segments文件夹到../tomcat5/bin/下
2. 删除/Tomcat/webapps/ROOT文件夹。
3. 复制nutch-0.7.war到到../tomcat5/webapps/下,改名为ROOT.war并解开(不解开也可以,Tomcat运行时将自动解开)
4. 修改/webapps/nutch/WEB-INF/classes/nutch-site.xml :
将
<nutch-conf>
</nutch-conf>
换成
<nutch-conf>
<property>
<name>searcher.dir</name>
<value>Your_crawl_dir_path</value>
</property>
</nutch-conf>
Your_crawl_dir_path指刚才抓取网页时网页保存的文件夹,比如我的就是:D:\nutch\mydir
(所有的文章,帮助上都有这一点,但是经过我的实践证明,第4点可以省略)
5. 在\Tomcat\conf\Catalina\localhost下新建立一个xml文件,该文件名跟你nutch文件夹名一样.例如:我的nutch的文件夹名为nutch-0.7我就建立一个nutch-0.7.xml文件.用记事本打开它加入以下文字:
<Context path="my_nutch_path" debug="5" privileged="true" docBase="nutch-0.7"/>
其中my_nutch_path为nutch的安装目录,比如我的为:D:\nutch\nutch-0.7
(只要完成第一步,则第四,五步都可以省略)
6. 最后在浏览器中输入 http://localhost:8080 查看结果(远程查看需要将 localhost 换成相应的IP):
7. 输入查询关键字,查询结果:(比如输入“北邮”,按“搜索”按钮)
结果出现乱码。不过不要紧,这不是nutch的问题,而是Tomcat不能正常显示中文的问题,我们只需修改一下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" />
重新启动Tomcat,输入“北邮”,出现如下界面,运行成功。
五.其他说明
Nutch VS Lucene
Lucene不是完整的应用程序,而是一个用于实现全文检索的软件库。Nutch 是一个应用程序,可以以 Lucene 为基础实现搜索引擎应用。
Nutch 是基于 Lucene的。Lucene为 Nutch 提供了文本索引和搜索的API。一个常见的问题是;我应该使用Lucene还是Nutch?最简单的回答是:如果你不需要抓取数据的话,应该使用Lucene。常见的应用场合是:你有数据源,需要为这些数据提供一个搜索页面。在这种情况下,最好的方式是直接从数据库中取出数据并用Lucene API建立索引。
Nutch 适用于你无法直接获取数据库中的网站,或者比较分散的数据源的情况下使用。