背景:

       要使用去重功能对重复的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数据结构进行去重。

敬请下一篇详细介绍布隆过滤器的实现。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐