JAVA爬虫Nutch、WebCollector的正则约束

标签: java 爬虫 nutch | 发表时间:2014-08-28 21:08 | 作者:AJAXHu
出处:http://blog.csdn.net

爬虫爬取时,需要约束爬取的范围。基本所有的爬虫都是通过正则表达式来完成这个约束。

最简单的,正则:

http://www.xinhuanet.com/.*
代表"http://www.xinhuanet.com/"后加任意个任意字符(可以是0个)。

通过这个正则可以约束爬虫的爬取范围,但是这个正则并不是表示爬取新华网所有的网页。新华网并不是只有www.xinhuanet.com这一个域名,还有很多子域名,类似:news.xinhuanet.com

这个时候我们需要定义这样一个正则:

http://([a-z0-9]*\.)*xinhuanet.com/
这样就可以限制爬取新华网所有的网页了。

每种爬虫的正则约束系统都有一些区别,这里拿Nutch、WebCollector两家爬虫的正则系统做对比:

Nutch官网: http://nutch.apache.org/

WebCollector官网: http://crawlscript.github.io/WebCollector/

1.Nutch:

nutch的正则约束是依赖一个配置文件 conf/regex-urlfilter.txt 来实现的。例如:


+^http://www.xinhuanet.com/
+^http://news.xinhuanet.com/
-^http://blog.xinhuanet.com/

nutch的正则约束原则是:

1)逐行扫描,对每一行进行如下操作:

       去掉正则前面的加号或减号,获取正则式。看待爬取网页的url中是否包含当前正则的模式。如果包含,看正则前的符合。如果为+,则当前url无需过滤,返回当前url,如果为-,则当前url需要过滤,返回null。如果待爬取网页url中不包含当前正则的模式,则跳过(继续下一行操作)。

2)如果扫描到文件结尾,都没有返回:

       返回null。


有2个地方需要注意:

1)nutch的正则过滤时,采用的匹配函数式Patterm.matcher,而不是Patterm.matches。

   Patterm.mather在匹配时,只要找到待爬取网页的url的子串和正则匹配,就通过。

   Patterm.matcher要求待爬取网页的url和regex完全匹配。例如:

    待爬取网页的网址是  http://www.xinhuanet.com/index.html

    正则是^http://([a-z0-9]*\.)*xinhuanet.com

    这个正则用Patterm.matcher和网页url可以匹配。因为网页url的字串http://www.xinhuanet.com和正则能匹配。

    但是用Patterm.matches就不能匹配。正则需要改成^http://([a-z0-9]*\.)*xinhuanet.com.*才可以和网页的URL匹配。

    也就是说nutch的正则其实是和找url中是否有字串符合正则。所以做nutch的正则配置文件时,要在http前加入^符号,如果正则没有加^符号,例如+http://www.xinhuanet.com ,下面网址也是可以匹配的:

    http://www.abc.com/index.php?name=http://www.xinhuanet.com

   

2)nutch正则过滤时,是逐行扫描,一旦扫描到匹配行就返回结果。所以正则式的顺序很重要。例如可以通过下面的配置文件来完成全网爬取(需要过滤图片等文件为不爬取):

-\.(gif|GIF|jpg|JPG|ico|ICO|css|sit|eps|wmf|zip|ppt|mpg|xls|gz|rpm|tgz|mov|MOV|exe)$
+.
先扫描第一行,遇到gif、JPG等文件,会匹配正则,由于前面符号是-,所以返回null,url被过滤。

如果当前url不对应gif、JPG等文件,会继续扫描第二行,第二行可以匹配任意字符串。由于前面符号是+,所以返回当前url,当前url被接受。


2.WebCollector:

WebCollector的正则约束是直接通过程序指定的:

BreadthCrawler crawler=new BreadthCrawler();
.....
.....
crawler.addRegex("+http://www\\.xinhuanet\\.com/.*");
crawler.addRegex("-http://www\\.xinhuanet\\.com/special/.*");
crawler.addRegex("-http://www\\.xinhuanet\\.com/info/.*");

WebCollector中正则有两种,正例正则,和反例正则。url要被接受,需要符合下面2个条件。

1.至少符合一条正例正则。

2.不能符合任意一条反例正则。


正例正则以+开头,反例正则以-开头(如果前面不加符号,默认是正例正则)。

上面代码中,http://www.xinhuanet.com/auto/index.html就可以被接受。因为它符合一条正例http://www.xinhuanet.com/.* ,不符合任意一条反例正则(http://www.xinhuanet.com/special/.*和http://www.xinhuanet.com/info/.*)。

必须给出至少一条正例正则,才可以进行爬取,如果没有正例正则,不能符合上面的条件一。

WebCollector中正则匹配采用的是Patterm.matches,要求正则与URL完全匹配。如果上面代码中你的正则写成+http://www.xinhuanet.com/,而不是+http://www.xinhuanet.com/.*,那么只有网页http://www.xinhuanet.com/可以被接受,网页http://www.xinhuanet.com/index.html就不能被接收。


下面给出一个例子,爬取新华网的news.xinhuanet.com子域名,过滤掉gif和jpg图像:

BreadthCrawler crawler=new BreadthCrawler();
.....
.....
crawler.addRegex("+http://news\\.xinhuanet\\.com/.*");
crawler.addRegex("-.*gif.*");
crawler.addRegex("-.*jpg.*");



作者:AJAXHu 发表于2014-8-28 13:08:55 原文链接
阅读:63 评论:0 查看评论

相关 [java 爬虫 nutch] 推荐:

JAVA爬虫Nutch、WebCollector的正则约束

- - CSDN博客互联网推荐文章
爬虫爬取时,需要约束爬取的范围. 基本所有的爬虫都是通过正则表达式来完成这个约束. 代表"http://www.xinhuanet.com/"后加任意个任意字符(可以是0个). 通过这个正则可以约束爬虫的爬取范围,但是这个正则并不是表示爬取新华网所有的网页. 新华网并不是只有www.xinhuanet.com这一个域名,还有很多子域名,类似:news.xinhuanet.com.

开源爬虫Labin,Nutch,Neritrix介绍和对比

- - 开源软件 - ITeye博客
larbin是个基于C++的web爬虫工具,拥有易于操作的界面,不过只能跑在LINUX下,在一台普通PC下larbin每天可以爬5百万个页面(当然啦,需要拥有良好的网络). Larbin是一种开源的网络爬虫/网络蜘蛛,由法国的年轻人 Sébastien Ailleret独立开发. larbin目的是能够跟踪页面的url进行扩展的抓取,最后为搜索引擎提供广泛的数据来源.

基于Nutch+Hadoop+Hbase+ElasticSearch的网络爬虫及搜索引擎

- - zzm
网络爬虫架构在Nutch+Hadoop之上,是一个典型的分布式离线批量处理架构,有非常优异的吞吐量和抓取性能并提供了大量的配置定制选项. 由于网络爬虫只负责网络资源的抓取,所以,需要一个分布式搜索引擎,用来对网络爬虫抓取到的网络资源进行实时的索引和搜索. 搜 索引擎架构在ElasticSearch之上,是一个典型的分布式在线实时交互查询架构,无单点故障,高伸缩、高可用.

webmagic 0.3.0 发布,高性能Java爬虫框架

- - 开源中国社区最新新闻
webmagic的是一个无须配置、便于二次开发的爬虫框架,它提供简单灵活的API,只需少量代码即可实现一个爬虫. 之前两个版本的主题分别是"灵活","方便",而此次更新的主题是"性能". 重写了XPath解析器,替换了HtmlCleaner. 这个XPath解析器(我另外建立了一个项目 Xsoup)基于Jsoup完成,比HtmlCleaner性能好一倍以上,同时有更友好的错误提示.

微博爬虫“免登录”技巧详解及Java实现

- - SegmentFault 最新的文章
本文源地址: http://www.fullstackyang.com/...,转发请注明该地址或segmentfault地址,谢谢. 一、微博一定要登录才能抓取. 目前,对于微博的爬虫,大部分是基于模拟微博账号登录的方式实现的,这种方式如果真的运营起来,实际上是一件非常头疼痛苦的事,你可能每天都过得提心吊胆,生怕新浪爸爸把你的那些账号给封了,而且现在随着实名制的落地,获得账号的渠道估计也会变得越来越少.

nutch入门之本地安装运行

- - 开源软件 - ITeye博客
最近hadoop着实很火,平时玩hadoop没有数据也很头疼,还好有nutch这个开源框架,可以从网上爬取数据. 本身nutch也依赖hadoop来抓取数据,正好一举两得,. 在学习nutch的过程中也提高对hadoop的认识,下面我会在业余时间整体对nutch的安装部署使用做一个比较全的描述,希望大家也一起共同进步吧~~.

Java广度优先爬虫示例(抓取复旦新闻信息) - Hi_Amos

- - 博客园_首页
这个爬虫是近半个月前学习爬虫技术的一个小例子,比较简单,怕时间久了会忘,这里简单总结一下.主要用到的外部Jar包有HttpClient4.3.4,HtmlParser2.1,使用的开发工具(IDE)为intelij 13.1,Jar包管理工具为Maven,不习惯用intelij的同学,也可以使用eclipse新建一个项目..

Java豆瓣电影爬虫——抓取电影详情和电影短评数据

- - ImportNew
采集豆瓣电影数据包括电影详情页数据和电影的短评数据. 需要保存这些详情字段如导演、编剧、演员等还有图中右下方的标签. 需要保存的字段有短评所属的电影名称,每条评论的详细信息如评论人名称、评论内容等. 有了如上的需求,需要设计表,其实很简单,只需要一张电影详情表movie和一张电影短评表comments,另外还需要一张存储网页提取的超链接的记录表record.

Nutch相关框架安装使用最佳指南

- - ITeye博客
五、安装Hadoop Cluster(伪分布式运行模式)并运行Nutch. 六、安装Hadoop Cluster(分布式运行模式)并运行Nutch. 七、配置Ganglia监控Hadoop集群和HBase集群. 八、Hadoop配置Snappy压缩. 九、Hadoop配置Lzo压缩. 十、配置zookeeper集群以运行hbase.

Nutch Crawler抓取数据并存储到MySQL

- - 简单文本
Apache Nutch是在Java平台上开发的开源网络爬虫工具. 按照 Nutch官方网站给出的向导,通过使用Nutch命令,可以比较容易地抓取指定种子网站的数据. 不过,若是要通过它提供的Java API,以编程方式抓取数据,并存储到指定的数据存储,如MySQL,则有一些技巧或者说秘诀需要注意.