Python 实现分布式爬虫

构建分布式爬虫:

继承RedisSpider类,没有start_url,增加了一个redis_key用来作为在Redis中存储start_url的key,在配置文件中,指定去重类和调度器类,并把调度器的request设为持久化,多台机器共用一个Redis服务,从Redis中取出url进行请求
去重:先将url地址进行排序,通过对url,请求方法,请求头(默认是不计算的)进行计算(sha1)得出指纹,将指纹存入Redis集合中,每次有新的请求时都会进行比对,dont_filter参数默认为False,表示会过滤请求,如果对某个请求的dont_filter设置为True,那么就不会对此请求进行去重操作直接入队
持久化:调度器会对request进行持久化操作,表示程序会接着从上一次的请求任务开始请求,而不是从头开始

实现断点续爬的问题及对应的解决方案
断点续爬是指,当程序异常中断时,在启动时,会接着上次的请求爬取。
当实现了分布式爬虫实际就已经可以实现断点续爬了,因为分布式爬虫实现了request的持久化存储,但是这会出现一些问题,当程序异常中止或请求失败时可能会导致一些请求发送了但没有解析,从而导致request丢失。
解决方案1:备份一个request队列,当一个请求成功并完成数据解析时,从备份队列中删除对应的request,这样当请求队列执行完成后,备份队列中剩余的就是丢失的request,只需要将剩余的request重新添加到请求队列中即可
解决方案2:在方案一中,当一些request一直请求失败,就会导致死循环,避免这种情况可以添加一个最大请求次数,每请求一次就让请求次数加一,当大于规定的最大请求次数时,就不在请求,并将其从备份队列中删除

增量爬虫的实现
对于一些有实时性的数据,增量爬虫是非常必要的,实现增量的核心就是去重,对URL去重,对数据内容去重,
可以对数据的某些字段通过简单的哈希算法进行计算指纹(sha1,md5),在数据入库前对指纹进行判断,只对那些不存在的数据进行入库保存,而对于海量数据的去重可以考虑另外一种常用就是布隆过滤器,这种方式原始利用一种"特征值",应用场景是海量数据的去重(但具有一定几率的误判)
通常这种增量爬虫的实现配合定时任务的使用,即每隔一段时间就爬取一次

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值