Nutch初体验全网的爬行

来源:百度文库 编辑:神马文学网 时间:2024/04/27 09:23:58
Nutch 初体验之二
作者:Fenng
出处:http://www.dbanotes.net
日期:January 04, 2005
几天介绍了Nutch 的基本信息 以及 如何使用 Nutch 进行 Intranet crawling。下面进行一下全网的爬行(Whole-web Crawling) 的操作测试。
Nutch 的数据包括两种类型:
Web 数据库。包含所有Nutch可以辨别的页面,以及这些页面间的链接信息。 段(segment)集合. 每个 segment 是作为一个单元(unit)被获取并索引的页面集合。Segment 数据包括如下类型: fetchlist:指定待获取的一个页面集合的文件 fetcher output:包含获取到的页面的文件集合 index:fetcher 输出的 Lucene 格式的索引
注:如果发现有解释不清的地方,请参考这里,不过说实话,Nutch的文档远远不够完善,还存在很多语焉不详的地方。
创建相关的目录并创建一个空的 web 数据库:
[root@fc3 nutch]# mkdir db[root@fc3 nutch]# mkdir segments[root@fc3 nutch]# bin/nutch admin db -createrun java in /u01/app/oracle/product/10.1.0/db_1/jdk/jre050104 122933 loading file:/u01/nutch/conf/nutch-default.xml050104 122934 loading file:/u01/nutch/conf/nutch-site.xml050104 122934 Created webdb at db[root@fc3 nutch]# tree dbdb|-- dbreadlock|-- dbwritelock`-- webdb|-- linksByMD5| |-- data| `-- index|-- linksByURL| |-- data| `-- index|-- pagesByMD5| |-- data| `-- index`-- pagesByURL|-- data`-- index5 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.txtrun java in /u01/app/oracle/product/10.1.0/db_1/jdk/jre050104 123105 loading file:/u01/nutch/conf/nutch-default.xml050104 123106 loading file:/u01/nutch/conf/nutch-site.xml050104 123106 skew = 1251308788050104 123106 Begin parse050104 123106 Using URL filter: net.nutch.net.RegexURLFilter050104 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 segmentssegments`-- 20050104135736`-- fetchlist|-- data`-- index2 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 $s2segments/20050104140654[root@fc3 nutch]# echo $s1segments/20050104135736[root@fc3 nutch]# tree segmentssegments|-- 20050104135736| |-- content| | |-- data| | `-- index| |-- fetcher| | |-- data| | `-- index| |-- fetchlist| | |-- data| | `-- index| |-- parse_data| | |-- data| | `-- index| `-- parse_text| |-- data| `-- index`-- 20050104140654`-- fetchlist|-- data`-- index8 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.NullPointerExceptionat 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)