爬取重复的页面是没有任何意义的。
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要小的多,也适合大量数据的去重操作。 缺点:有误判的可能。没有重复可能会判定重复,但是重复数据一定会判定重复。