WebMagic

作者: 七弦桐语 | 来源:发表于2019-06-08 22:32 被阅读0次

    WebMagic是一个简单灵活的Java爬虫框架。基于WebMagic,你可以快速开发出一个高效、易维护的爬虫。

    特性:

    • 简单的API,可快速上手
    • 模块化的结构,可轻松扩展
    • 提供多线程和分布式支持

    下载:

    最新版:WebMagic-0.7.3

    Maven依赖:

    <dependency>
        <groupId>us.codecraft</groupId>
        <artifactId>webmagic-core</artifactId>
        <version>0.7.3</version>
    </dependency>
    <dependency>
        <groupId>us.codecraft</groupId>
        <artifactId>webmagic-extension</artifactId>
        <version>0.7.3</version>
    </dependency>
    

    使用文档

    源码:

    上边是简单的介绍,相关使用参考作者编写的 中文文档

    下面是使用的相关拓展部分:

    URL 去重

    SchedulerWebMagic中进行 URL 管理的组件。一般来说,Scheduler包括两个作用:

    1. 对待抓取的URL队列进行管理。
    2. 对已抓取的URL进行去重。

    Scheduler的内部实现进行了重构,去重部分被单独抽象成了一个接口:DuplicateRemover,从而可以为同一个Scheduler选择不同的去重方式,以适应不同的需要,目前提供了三种去重方式。

    • HashSet
      • 使用 java 中 HashSet 不能重复的特点去重。占用内存大,性能低
    • Redis 去重
      • 使用 Redis 的 set 进行去重。优点是速度快,而且不会占用爬虫服务器的资源。可以处理更大数据量的数据爬取;缺点是需要 redis 服务器,增加开发和使用成本
    • 布隆过滤器(BloomFilter)
      • 优点是占用内存比 HashSet 小的多,也适合大数据量的去重操作。

    布隆过滤器的使用实例:

    @Scheduled(initialDelay = 1000, fixedDelay = 60 * 1000 * 60 * 12)
        public void start() {
            Spider.create(new BdProcessor())
                    .addUrl(URL)
                    .thread(10)
                    // 设置布隆过滤器去重操作(默认使用HashSet来进行去重,占用内存较大;使用BloomFilter来进行去重,占用内存较小,但是可能漏抓页面)
                    .setScheduler(new QueueScheduler().setDuplicateRemover(new BloomFilterDuplicateRemover(10000000)))
                    .addPipeline(dbPipeline)
                    .run();
        }
    

    网页去重

    1. 指纹码对比。

    最常见的去重方案是生成文档的指纹门。例如对一篇文章进行 MD5 加密生成一个字符串,我们可以认为这是文章的指纹码,再和其他的文章指纹码对比,一致则说明文章重复。

    但是这种方式是完全一致则是重复的,如果文章只是多了几个标点符号,那仍旧被认为是重复的,这种方式并不合理。

    BloomFilter

    这种方式就是我们之前对 url 进行去重的方式,使用在这里的话,也是对文章进行计算得到一个数,再进行对比,缺点和方法 1 是一样的,如果只有一点点不一样,也会认为不重复,这种方式不合理。

    KMP 算法。

    KMP 算法是一种改进的字符串匹配算法。KMP 算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。能够找到两个文章有哪些是一-样的,哪些不一样。。

    这种方式能够解决前面两个方式的“只要一点不一样就是不重复”的问题。但是它的时空复杂度太高了,不适合大数据量的重复比对。

    SimHash (主要)

    Google 的 simhash 算法产生的签名,可以满足上述要求。这个算法并不深奥,比较容易理解。这种算法也是目前 Google 搜索引擎所目前所使用的网页去重算法。

    1. 分词,把需要判断文本分词形成这个文章的特征单词。
    2. hash,通过 hash 算法把每个词变成 hash 值,比如“美国”通过 hash 算法计算为 100101,“51 区”通过 hash 算法计算为 101011。这样我们的字符串就变成了一串串数字。
    3. 加权,通过 2 步骤的 hash 生成结果,需要按照单词的权重形成加权数字串,。“美国”的 hash 值为“100101”,通过加权计算为“4-4-44-44”。“51 区”计算为‘“5-55-555”。
    4. 合并,把上面各个单词算出来的序列值累加,变成只有一一个序列串。。“美国”的“4-4-44-44”,“51 区”的“5-55-555”。

    代理的使用

    有些网站不允许爬虫进行数据爬取,因为会加大服务器的压力。其中一种最有效的方式是通过 ip+时间进行鉴别,因为正常人不可能短时间开启太多的页面,发起太多的请求。

    我们使用的 WebMagic 可以很方便的设置爬取数据的时间(参考第二天的的 3.1. 爬虫的配置、启动和终止)。但是这样会大大降低我们 J 爬取数据的效率,如果不小心 ip 被禁了,会让我们无法爬去数据,那么我们就有必要使用代理服务器来爬取数据。

    代理 L(英语:Proxy),也称网络代理,是一-种特殊的网络服务,允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接。

    提供代理服务的电脑系统或其它类型的网络终端称为代理服务器(英文:Proxy. Server)。一个完整的代理请求过程为:客户端首先与代理服务器创建连接,接着根据代理服务器所使用的代理协议,请求对目标服务器创建连接、或者获得目标服务器的指定资源。

    我们就需要知道代理服务器在哪里(ip 和端口号)才可以使用。网上有很多代理服务器的提供商,但是大多是免费的不好用,付费的还行。推荐个免费的服务网站:

    配置代理

    WebMagic的代理API ProxyProvider。因为相对于 Site 的“配置”,ProxyProvider定位更多是一个“组件”,所以代理不再从Site设置,而是由HttpClientDownloader设置。

    • 设置代理:HttpClientDownloader.setProxyProvider(ProxyProvider proxyProvider)

    ProxyProvider有一个默认实现:SimpleProxyProvider。它是一个基于简单Round-Robin的、没有失败检查的ProxyProvider。可以配置任意个候选代理,每次会按顺序挑选一个代理使用。它适合用在自己搭建的比较稳定的代理的场景。

    代理示例:

    设置单一的普通HTTP代理为101.101.101.101的8888端口,并设置密码为"username","password"

        HttpClientDownloader httpClientDownloader = new HttpClientDownloader();
        httpClientDownloader.setProxyProvider(SimpleProxyProvider.from(new Proxy("101.101.101.101",8888,"username","password")));
        spider.setDownloader(httpClientDownloader);
    

    设置代理池,其中包括101.101.101.101和102.102.102.102两个IP,没有密码

        HttpClientDownloader httpClientDownloader = new HttpClientDownloader();
        httpClientDownloader.setProxyProvider(SimpleProxyProvider.from(
        new Proxy("101.101.101.101",8888)
        ,new Proxy("102.102.102.102",8888)));
    

    其他相关资料

    相关文章

      网友评论

        本文标题:WebMagic

        本文链接:https://www.haomeiwen.com/subject/bqmwxctx.html