Scrapy_redis介绍

request对象什么时候入队

  • dont_filter = True
    • 构造请求的时候,吧dont_filter设置为True,该url会被反复抓取。
  • 一个全新的url地址被抓到的时候,构造request请求。
  • url地址在start_urls中的时候,会入队,不管之前是否请求过
    • 构造start_url地址的请求时候,dont_filter = True

request对象

    def enqueue_request(self, request):
        if not request.dont_filter and self.df.request_seen(request):
        		#dont_filter=False Ture True request指纹已经存在 #不会入队
          	#dont_filter=False Ture False request指纹已经存在全新的url #会入队
            #dont_filter=True False #会入队
            self.df.log(request, self.spider)
            return False
        if self.stats:
            self.stats.inc_value('scheduler/enqueued/redis', spider=self.spider)
        self.queue.push(request)       #会入队
        return True

scrapy-redis去重方法

  • 使用sha1加密,request得到指纹。
  • 把指纹存在redis的集合中。
  • 下一次新来一个request,同样的方式生成指纹,判断指纹是否存在redis集合中。

生成指纹

fp = hashlib.shal()                 
fp.update(to_bytes(request.method))   #请求方法
fp.update(to_bytes(canonicalize_url(request.url)))    #url地址
fp.update(request.body or b '')   #请求体
return fp.hexdigest()

判断数据是否存在redis的集合中,不存在插入

added = self.server.sadd(self.key,fp)
return added != 0
原文地址:https://www.cnblogs.com/i969639/p/11201035.html