Nutch介绍
Nutch是一个开源的用java实现的一个搜素引擎,它包含两个部分的内容:爬虫和搜索。
我们这里主要介绍nutch的爬虫部分,爬虫系统是由nutch爬虫工具Cralwer实现的,生成数据文件主要包括三类,分别是webdatabase,一系列的segment加上index,三者的物理文件分别存储在爬行结果目录下的db目录下webdb子文件夹内,segments文件夹和index文件夹。
Nutch安装
步骤1:从下面的网站中下载nutch包
http://lucene.apache.org/nutch
步骤2:在linux系统中解压nutch包(目前我用的版本1.2,不是最新的版本)
执行命令:tar zxvfapache-nutch-1.2-src.tar.gz
步骤3:为了方便我们可以更改解压后的nutch文件夹命名
执行命令:mv apache-nutch-1.2-srcnutch
步骤4:使用ant工具来编译执行nutch项目,确保你的机器上安装了ant,我们可以看到nutch目录下有个build.xml文件。
执行命令:ant–buildfile build.xml
步骤5:测试nutch是否成功安装了,执行下面的命令
bin/nutch
Nutch配置
1. 配置URL过滤器:
Nutch爬虫工具Crawler使用了过滤器来决定从哪些url中抓取数据。我们可以通过配置指定的正则表达式来限制爬行匹配的url模式,在conf/crawl-urlfilter.txt文件中进行配置。
以 http://www.aibang.com/ 为例配置如下:
+^http://( [a-z0-9]*\.)*aibang.com/ ([a-z0-9]*\.)*
2. 代理配置
有时候抓不到数据,发现是网络问题,需要设置代理,这时候我们可以在conf/nutch-default.xml文件中进行配置,配置如下:
<property> <name>http.proxy.host</name> <value>10.217.130.20</value> <description>The proxy hostname. If empty, no proxy is used.</description> </property> |
我们还需要编辑conf/nutch-site.xml file文件,增加代理属性,并编辑相应的属性值。
详细内容如下:
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Put site-specific property overrides in this file. --> <configuration> <property> <name>http.agent.name</name> <value>MyNutch</value> <description>test </description> </property> <property> <name>http.agent.description</name> <value>spider</value> <description> spider </description> </property> <property> <name>http.agent.url</name> <value>http://www.xxx.com </value> <description>http://www.xxx.com </description> </property> <property> <name>http.agent.email</name> <value>MyEmail</value> <description>[email protected] </description> </property> <property><name>http.timeout</name><value>80000</value></property> <property><name>http.max.delays</name><value>1000</value></property> </configuration> |
Nutch命令
1. 你可以直接执行下面的抓取命令
bin/nutch crawl urls/url.txt -dir crawled -depth 2 -threads 4 -topN 10>&logs/log1.log
crawl:通知 nutch.jar,执行抓取的main方法
urls: 存放需要抓取的url的文件目录,需要抓取的url都写在了url.txt文件中
dir: 抓取命令执行完后,存放结果的命令
depth: 爬行的深度
threads: 处理的线程数
topN:指在每层的深度上所要抓取的最大的页面数,完全抓取可设定为1万到100万,这取决于网站资源数量
2. 执行完crawl命令后,会生成一些数据文件,文件组成如下:
· crawldb: 爬行数据库,用来存储所要爬行的网址
· linkdb: 链接数据库,用来存储每个网址的链接地址,包括源地址和链接地址
· segments: 抓取的网址被作为一个单元,而一个segment就是一个单元。一个segments包括以下几个子目录:
¨ crawl_generate: 包含所抓取的网址列表
¨ crawl_fetch: 包含每个抓取页面的状态
¨ content: 包含每个抓取页面的内容
¨ parse_text: 包含每个抓取页面的解析文本
¨ parse_data: 包含每个页面的外部链接和元数据
¨ crawl_parse: 包含网址的外部链接地址,用于更新crawldb数据库
¨ indexes: 采用Lucene的格式建立索引集
3. 因为segment目录下的所有文件都是二进制文件,如果我们需要将其转换成我们可以知道的文件格式,可以使用nutch中提供的命令来查看。若需要获取网页的文本内容parse_data或parse_text,可以执行下面的命令
读segment的命令:
bin/nutch readseg -nocontent -noparsedata -dumpcrawled/segments/20150408144702 segdb
· readseg:为nutch读segments目录中的内容的命令
· -nocontent : 为可选参数 ,加上该参数后就不会导出content
· -noparsedata:为可选参数,加上该参数后就不会导出parse_data
加上上面两个参数后就会只导出parse_text,也就是去除网页格式后的文本信息
· crawled/segments/20150408144702: 为一个segment文件夹
· segdb:为存放转换之后的内容的文件夹
执行完该命令后我们可以得到包含文本的dump文件。
写一个shell脚本来跑nutch
在我们的项目中,我们整合了所有的nutch命令在一个shell脚本中,这样远程方法可以通过直接调用执行该脚本来跑一个nutch job。
Shell脚本的部分内容如下所示:
$path/bin/nutch crawl $url -dir $crawled -depth $2 -threads 10 -topN $3 >&$log if [ -d $crawled/segments ]; then mkdir $nutch_path/hdfs for file in $crawled/segments/*; do if [ -d $file ]; then $path/bin/nutch readseg -dump $file $nutch_path/segdb -nocontent -nofetch -nogenerate -noparse -noparsedata; cp $nutch_path/segdb/dump $nutch_path/segdb/$(date +%Y%m%d%H%M%S) fi done rm $nutch_path/segdb/dump cat $nutch_path/segdb/* > $nutch_path/hdfs/$destFileName hadoop fs -put $nutch_path/hdfs/* $hadoop_nutch_file_path/ rm $nutch_path/segdb/* rm $nutch_path/hdfs/* rm -rf $nutch_path fi |
远程方法所需执行该脚本的命令如下:
Nohup sh scriptName arg1 arg2 arg3 arg4 >/dev/null 2>log &
scriptName :你的脚本所在目录和名字
arg1: 你所需抓取的网页URL
arg2: depth
arg3: topN
arg4: timestamp, 这个将会作为nutch的id用来管理nutch job。
执行完上面的shell脚本后,将会生成一个Nutch_timestamp.txt的文件,该文件中包含所有网页中的文字信息,这个文件同样会上传到你所指定的hdfs文件系统中。
参考文献
2. Nutch官网http://nutch.apache.org/