zoukankan      html  css  js  c++  java
  • 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.*");



  • 相关阅读:
    【实践】mysql数据库表设计及存储过程设计
    # Java类链接模型
    java gc
    Spring Data Jpa
    Spring Security
    Amazon SQS 消息队列服务
    JMS概述
    jdk 7&8 new features
    java jri null
    java.lang.OutOfMemoryError: PermGen space
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/6984599.html
Copyright © 2011-2022 走看看