redis队列去重_scrapy 去重与 scrapy_redis 去重与布隆过滤器

本文详细介绍了Scrapy的去重机制,包括默认的内存去重和scrapy-redis的Redis去重,并讨论了Redis去重的优缺点。此外,还探讨了布隆过滤器在去重中的应用,虽然存在误判可能,但能有效节省存储空间。最后,提供了在Scrapy中集成scrapy-redis-bloomfilter的配置示例。
摘要由CSDN通过智能技术生成

这是从博客地址搬过来的

在开始介绍 scrapy 的去重之前,先想想我们是怎么对 requests 对去重的。requests 只是下载器,本身并没有提供去重功能。所以我们需要自己去做。很典型的做法是事先定义一个去重队列,判断抓取的 url 是否在其中,如下:

crawled_urls = set()

def check_url(url):

if url not in crawled_urls:

return True

return False

此时的集合是保存在内存中的,随着爬虫抓取内容变多,该集合会越来越大,有什么办法呢?

接着往下看,你会知道的。

scrapy 的去重

scrapy 对 request 不做去重很简单,只需要在 request 对象中设置dont_filter为 True,如

yield scrapy.Request(url, callback=self.get_response, dont_filter=True)

看看源码是如何做的,位置

_fingerprint_cache = weakref.WeakKeyDictionary()

def request_fingerprint(request, include_headers=None):

if include_headers:

include_headers = tuple(to_bytes(h.lower())

for h in sorted(include_headers))

cache = _fingerprint_cache.setdefault(request, {})

if include_headers not in cache:

fp = hashlib.sha1()

fp.update(to_bytes(request.method))

fp.update(to_bytes(canonicalize_url(request.url)))

fp.update(request.body or b'')

if include_headers:

for hdr in include_headers:

if hdr in request.headers:

fp.update(hdr)

for v in request.headers.getlist(hdr):

fp.update(v)

cache[include_headers] = fp.hexdigest()

return cache[include_headers]

注释过多࿰

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值