Scheduler三种去重实现方法

2022-05-13 10:16:57 浏览数 (1)

爬取重复的页面是没有任何意义的。

Scheduler(URL管理)最基本的功能是实现对已经爬取的URL进行标示。 可以实现URL的增量去重。 目前scheduler主要有三种实现方式:   1)内存队列QueueScheduler   2)文件队列FileCacheQueueScheduler   3)Redis队列RedisScheduler

1 内存队列

使用setScheduler来设置Scheduler

代码语言:javascript复制
     public static void main(String[] args) {
        Spider.create( new MyProcessor() )
                .addUrl("https://blog.csdn.net")
                .setScheduler(new QueueScheduler()) 
               .run();
    }
2 文件队列

使用文件保存抓取URL,可以在关闭程序并下次启动时,从之前抓取到的URL继续抓取 (1)创建文件夹E:scheduler (2)修改代码

代码语言:javascript复制
     public static void main(String[] args) {
        Spider.create( new MyProcessor() )
                .addUrl("https://blog.csdn.net")
                //.setScheduler(new QueueScheduler())//设置内存队列                
                .setScheduler(new FileCacheQueueScheduler("E:\scheduler"))//设置文件队列
                .run();
    }

运行后文件夹E:scheduler会产生两个文件blog.csdn.net.urls.txt和blog.csdn.net.cursor.txt

3 Redis队列

使用Redis保存抓取队列,可进行多台机器同时合作抓取 (1)运行redis服务端 (2)修改代码

代码语言:javascript复制
     public static void main(String[] args) {
        Spider.create( new MyProcessor() )
                .addUrl("https://blog.csdn.net")
                //.setScheduler(new QueueScheduler())//设置内存队列
                //.setScheduler(new FileCacheQueueScheduler("E:\scheduler"))//设置文件队列
                .setScheduler(new RedisScheduler("127.0.0.1"))//设置Redis队列
                .run();
    }

RedisScheduler是使用Redis的set进行去重, 其他的Scheduler默认都使用HashSetDuplicateRemover来进行去重。

三种去重方式

去重就有三种实现方式,那有什么不同呢?

  • HashSet 使用java中的HashSet不能重复的特点去重。优点是容易理解。使用方便。 缺点:占用内存大,性能较低。
  • Redis去重 使用Redis的set进行去重。优点是速度快(Redis本身速度就很快),而且去重不会占用爬虫服务器的资源,可以处理更大数据量的数据爬取。 缺点:需要准备Redis服务器,增加开发和使用成本。
  • 布隆过滤器(BloomFilter) 使用布隆过滤器也可以实现去重。优点是占用的内存要比使用HashSet要小的多,也适合大量数据的去重操作。 缺点:有误判的可能。没有重复可能会判定重复,但是重复数据一定会判定重复。

0 人点赞