Nutch 初体验之二


作者:Fenng
出处:http://www.dbanotes.net
日期:January 04, 2005

« Google PR 更新以及其他 | Blog首页 | Hint does NOT work , New myth ? »


前几天介绍了 Nutch 的基本信息 以及 如何使用 Nutch 进行 Intranet crawling。下面进行一下全网的爬行(Whole-web Crawling) 的操作测试。

Nutch 的数据包括两种类型:

注:如果发现有解释不清的地方,请参考这里,不过说实话,Nutch的文档远远不够完善,还存在很多语焉不详的地方。

创建相关的目录并创建一个空的 web 数据库:

[root@fc3 nutch]# mkdir db
[root@fc3 nutch]# mkdir segments
[root@fc3 nutch]# bin/nutch admin db -create
run java in /u01/app/oracle/product/10.1.0/db_1/jdk/jre
050104 122933 loading file:/u01/nutch/conf/nutch-default.xml
050104 122934 loading file:/u01/nutch/conf/nutch-site.xml
050104 122934 Created webdb at db
[root@fc3 nutch]# tree db
db
|-- dbreadlock
|-- dbwritelock
`-- webdb
    |-- linksByMD5
    |   |-- data
    |   `-- index
    |-- linksByURL
    |   |-- data
    |   `-- index
    |-- pagesByMD5
    |   |-- data
    |   `-- index
    `-- pagesByURL
        |-- data
        `-- index

5 directories, 10 files
[root@fc3 nutch]# 

接下来需要用“注射器(injector)”把网址"注入"到数据库中。Nutch 的文档中是从 DMOZ 获取一个 URL 集合,然后取一个子集进行处理。不过该文档实在是太大了。这里用了 http://rdf.dmoz.org/rdf/ 目录下的 content.example.txt 文件做测试。

[root@fc3 nutch]# bin/nutch inject db -dmozfile content.example.txt
run java in /u01/app/oracle/product/10.1.0/db_1/jdk/jre
050104 123105 loading file:/u01/nutch/conf/nutch-default.xml
050104 123106 loading file:/u01/nutch/conf/nutch-site.xml
050104 123106 skew = 1251308788
050104 123106 Begin parse
050104 123106 Using URL filter: net.nutch.net.RegexURLFilter
050104 123106 found resource regex-urlfilter.txt at file:/u01/nutch/conf/regex-urlfilter.txt
.050104 123106 Completed parse.  Added 40 pages.
......
[root@fc3 nutch]# 

还好,40 个 URL 而已。不算太多。


获取 URL

从数据库中创建 fetchlist :

[root@fc3 nutch]# bin/nutch generate db segments

segments 目录的基本信息:

[root@fc3 nutch]# tree segments
segments
`-- 20050104135736
    `-- fetchlist
        |-- data
        `-- index

2 directories, 2 files
[root@fc3 nutch]# 

接下来需要把 segments 目录“20050104135736”保存到一个环境变量中,供以后使用。

[root@fc3 nutch]# s1=`ls -d segments/2* | tail -1`

运行 fetcher,获取这些 URL 信息:

 
[root@fc3 nutch]# bin/nutch fetch $s1

之后需要更新数据库,把获取到的页面信息存入数据库中:

[root@fc3 nutch]# bin/nutch updatedb db $s1

进行链接分析(analyze: adjust database link-analysis scoring),深度这里设定为3 ,来决定下次 fetch 操作的优先权:

[root@fc3 nutch]# bin/nutch analyze db 3

创建新的 segment ,选择分值排在前 10 的URL(一个很小的子集)来进行第二次获取:

[root@fc3 nutch]# bin/nutch generate db segments -topN 10

把新的 segments 名字存到 $s2 变量中。

[root@fc3 nutch]# s2=`ls -d segments/2* | tail -1`
[root@fc3 nutch]# echo $s2
segments/20050104140654
[root@fc3 nutch]# echo $s1
segments/20050104135736
[root@fc3 nutch]# tree segments
segments
|-- 20050104135736
|   |-- content
|   |   |-- data
|   |   `-- index
|   |-- fetcher
|   |   |-- data
|   |   `-- index
|   |-- fetchlist
|   |   |-- data
|   |   `-- index
|   |-- parse_data
|   |   |-- data
|   |   `-- index
|   `-- parse_text
|       |-- data
|       `-- index
`-- 20050104140654
    `-- fetchlist
        |-- data
        `-- index

8 directories, 12 files
[root@fc3 nutch]# 

然后依样画葫芦,进行第二次获取,更新,以及分析:

[root@fc3 nutch]# bin/nutch fetch $s2
......
[root@fc3 nutch]# bin/nutch updatedb db $s2
......
[root@fc3 nutch]# bin/nutch analyze db 3
......

如法炮制,再来第三次:

[root@fc3 nutch]# bin/nutch generate db segments -topN 5
......
[root@fc3 nutch]# s3=`ls -d segments/2* | tail -1`
......
[root@fc3 nutch]# bin/nutch fetch $s3
......
[root@fc3 nutch]# bin/nutch updatedb db $s3
......
[root@fc3 nutch]# bin/nutch analyze db 3
......

创建索引并去掉重复的 URL

[root@fc3 nutch]# bin/nutch index $s1
......
[root@fc3 nutch]# bin/nutch index $s2
......
[root@fc3 nutch]# bin/nutch index $s3
......

去除重复页面:

[root@fc3 nutch]# bin/nutch dedup segments dedup.tmp

配置 Tomcat

[root@fc3 nutch]# rm -rf /opt/Tomcat/webapps/ROOT*
[root@fc3 nutch]# cp nutch*.war /opt/Tomcat/webapps/ROOT.war
[root@fc3 nutch]# cd /opt/Tomcat/webapps/
[root@fc3 webapps]# jar xvf ROOT.war
......
[root@fc3 nutch]# ../../opt/Tomcat/bin/catalina.sh start

注意:webapp 必须要在相对路径 ./segments 找到具体数据。否则在搜索的时候会报告如下异常信息:

java.lang.NullPointerException
   at net.nutch.searcher.NutchBean.init(NutchBean.java:82)
   at net.nutch.searcher.NutchBean.>init<(NutchBean.java:68)
   at net.nutch.searcher.NutchBean.>init<(NutchBean.java:58)
   at net.nutch.searcher.NutchBean.get(NutchBean.java:50)
   at org.apache.jsp.search_jsp._jspService(search_jsp.java:66)
   at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:137)

搜索测试:

Nutch Whole Web Search Test

其他想法

Nutch 的机器人还不如其他商业搜索引擎的那样灵活(需要“喂"给它URL)。但是比较适合一些特定应用。比如 Grassland 这样的小型特性目的的搜索引擎,可以用 Nutch + Lucene 来比较完美的实现。单独做一个收集 URL (RSS ?)信息的工具,然后 Nutch 进行处理,Lucene 来实现更为完善的全文搜索功能。希望能看到越来越多的实际项目应用到 Nutch 。

参考信息

后记:

很多朋友都遇到 Nutch 0.6 输入中文会出现乱码的问题。这个问题其实和 Nutch 关系不大,主要原因是使用 Tomcat 5.0 的问题。解决办法是修改 Tomcat 的server.xml 文件的connnector:

  <Connector port="8080"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true" 
               URIEncoding="UTF-8" useBodyEncodingForURI="true" /> 

黑色部分是需要添加的.之后乱码问题就解决了.


Posted by Fenng at January 4, 2005 12:24 PM
Last updated at 06:21 PM on August 20, 2005


相关文章

Trackback Pings

TrackBack URL for this entry:
http://www.dbanotes.net/mt/mt-tb.cgi/55

Listed below are links to weblogs that reference Nutch 初体验之二:

Comments


java.lang.NullPointerException
at net.nutch.searcher.NutchBean.init(NutchBean.java:82)
at net.nutch.searcher.NutchBean.>initinit<(NutchBean.java:58)
您好,我遇到了这样的错误,请问“webapp 必须要在相对路径 ./segments 找到具体数据”这个相对路径是如何配置的,我的可能有些问题,但一直查不出来,谢谢!

Posted by: fantastj at March 6, 2005 01:35 PM

搜索的时候会报告如下异常信息:

java.lang.NullPointerException
at net.nutch.searcher.NutchBean.init(NutchBean.java:82)
我遇到了这样的问题,您说的“webapp 必须要在相对路径 ./segments 找到具体数据”是怎么配置的,我的配置可能有些问题!谢谢,也可以直接给我邮件!

Posted by: fantastj at March 6, 2005 01:44 PM

ebapp 必须要在相对路径 ./segments 找到具体数据。否则在搜索的时候会报告如下异常信息:

java.lang.NullPointerException
at net.nutch.searcher.NutchBean.init(NutchBean.java:82)
at net.nutch.searcher.NutchBean.>initinit<(NutchBean.java:58)
at net.nutch.searcher.NutchBean.get(NutchBean.java:50)
at org.apache.jsp.search_jsp._jspService(search_jsp.java:66)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:137)
请问你的SEGMENTS相对路径是如何设置的?我就出现了这样的问题!怎么也调不好,请您指点!谢谢!

Posted by: fantastj at March 7, 2005 05:51 PM

你好,请教一个问题:
1、我crawl一个网站之后,在nutch-site.xml中指出了包括所生成目录的绝对路径,但总是报net.nutch.analysis.NutchAnalysis.compound(NutchAnalysis.java:250)错误,请问能帮忙解答吗?
谢谢!

Posted by: tom at June 6, 2005 08:30 PM

"webapp 必须要在相对路径 ./segments 找到具体数据"请问一下老师,这个是怎么设置的,我试验了很多方法都不行呀,急切盼望老师解答一下,thank you ~~~~~~~!

Posted by: p2p at June 10, 2005 04:43 PM

try to update the searcher.dir property in your conf/nutch-default.xml to point to the created directory where valid search/crawl place

Posted by: valouren at August 5, 2005 02:02 PM

请问nutch如何更新从网页上重新获取数据

Posted by: jimmy at September 19, 2005 01:10 PM

通过脚本定制抓取、处理

Posted by: Fenng at September 19, 2005 05:07 PM

In your free time, check out some relevant pages dedicated to visit .

Posted by: price at October 20, 2005 03:35 AM

汗,我何尝不想呢

Posted by: Fenng at October 20, 2005 06:24 PM

Nutch 0.8已经出来了,我测试了一下,效果不错,就是中文分词问题还是不行。我也是研究搜索,不过是视频搜索,有兴趣大家一起研究一下。www.eyesom.com

Posted by: vudei at July 30, 2006 07:36 AM

通过脚本定制抓取、处理

Posted by: asp.net源码 at May 16, 2007 06:22 PM

恩还可以

Posted by: pplove at May 16, 2007 07:37 PM

呵呵

Posted by: 加盟 at May 16, 2007 07:39 PM

不错

Posted by: 阿城 at May 16, 2007 07:41 PM

~!@#¥%……&*()——+|

Posted by: 阿城 at May 16, 2007 07:43 PM

请问nutch如何更新从网页上重新获取数据

Posted by: sd at May 29, 2008 03:31 PM

汗,我何尝不想呢

Posted by: dsaf at June 2, 2008 04:32 PM

Post a comment



Hint: 为避免您收到垃圾邮件,请尽量不用使用真实的邮件地址.


Remember Me?