JAVA爬虫Nutch、WebCollector的正则约束

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

最简单的,正则:

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.*");



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
SeimiCrawler An agile,powerful,distributed crawler framework. SeimiCrawler的目标是成为Java世界最好用最实用的爬虫框架。简介      SeimiCrawler是一个敏捷的,支持分布式的Java爬虫开发框架,希望能在最大程度上降低新手开发一个可用性高且性能不差的爬虫系统的门槛,以及提升开发爬虫系统的开发效率。在SeimiCrawler的世界里,绝大多数人只需关心去写抓取的业务逻辑就够了,其余的Seimi帮你搞定。设计思想上SeimiCrawler受Python的爬虫框架Scrapy启发很大,同时融合了Java语言本身特点与Spring的特性,并希望在国内更方便且普遍的使用更有效率的XPath解析HTML,所以SeimiCrawler默认的HTML解析器是JsoupXpath,默认解析提取HTML数据工作均使用XPath来完成(当然,数据处理亦可以自行选择其他解析器)。 原理示例基本原理集群原理快速开始 添加maven依赖(已经同步到中央maven库,最新版本参见项目主页):     cn.wanghaomiao     SeimiCrawler     0.1.0 在包crawlers下添加爬虫规则,例如:@Crawler(name = "basic") public class Basic extends BaseSeimiCrawler {     @Override     public String[] startUrls() {         return new String[]{"http://www.cnblogs.com/"};     }     @Override     public void start(Response response) {         JXDocument doc = response.document();         try {             List<Object> urls = doc.sel("//a[@class='titlelnk']/@href");             logger.info("{}", urls.size());             for (Object s:urls){                 push(new Request(s.toString(),"getTitle"));             }         } catch (Exception e) {             e.printStackTrace();         }     }     public void getTitle(Response response){         JXDocument doc = response.document();         try {             logger.info("url:{} {}", response.getUrl(), doc.sel("//h1[@class='postTitle']/a/text()|//a[@id='cb_post_title_url']/text()"));             //do something         } catch (Exception e) {             e.printStackTrace();         }     } } 然后随便某个包下添加启动Main函数,启动SeimiCrawler:public class Boot {     public static void main(String[] args){         Seimi s = new Seimi();         s.start("basic");     } } 以上便是一个最简单的爬虫系统开发流程。 更多文档      目前可以参考demo工程中的样例,基本包含了主要的特性用法。更为细致的文档移步SeimiCrawler主页中进一步查看 标签:爬虫

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值