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