Scrapy去重
背景:要使用去重功能对重复的URL进行处理,避免重复劳动。目前有三种方式进行去重,第一种是使用Python语言自带的set集合数据结构进行自动去重,第二种是使用Redis中间件中的set集合进行去重,第三种是使用BloomFilter过滤器进行去重。第一种去重:使用Python自带的set集合数据结构进行自动去重。https://github.com/scrapy/scrapy我们查看源代码 sc
背景:
要使用去重功能对重复的URL进行处理,避免重复劳动。目前有三种方式进行去重,第一种是使用Python语言自带的set集合数据结构进行自动去重,第二种是使用Redis中间件中的set集合进行去重,第三种是使用BloomFilter过滤器进行去重。 本篇仅介绍第一种和第二种,第三种在下一篇进行详细介绍。
第一种去重:使用Python自带的set集合数据结构进行自动去重。
https://github.com/scrapy/scrapy
我们查看源代码 scrapy/dupefilters.py/RFPDupeFilter类:
其中在__init__函数中对self.fingerprints进行了初始化,为一个空的set集合,容器中的类型为string
再看request_seen,首先计算这个request的指纹,算法在 scrapy/utils/request.py/request_fingerprint,是一个函数,通过对请求的method、请求的url,请求的body,请求的headers进行sha1计算得出指纹,其实就是对请求的数据进行哈希。
第二种去重:使用Redis自带的set集合数据结构进行自动去重。
GitHub - rmax/scrapy-redis: Redis-based components for Scrapy.
和第一种方式近乎一样,通过request_fingerprint来计算请求的哈希值,计算请求的算法还是一样的,都是使用scrapy/utils/request.py/request_fingerprint,不同的是将哈希值fp添加到了redis的set数据结构中。
这个set的key为 dupefilter+timestamp ,源码如下:
defaults.DUPEFILTER_KEY 在default.py模块中进行了定义
得出key为一个 'dupefilter:1640054446' 类似的值。
第二种方式是使用redis set作为去重的队列,而这种方式也应用于分布式爬虫,多个爬虫连接一个redis实例或集群中多个实例。
第三种去重:使用Bloom Filter数据结构进行去重。
敬请下一篇详细介绍布隆过滤器的实现。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)