scrapy的去重机制

scrapy的去重机制

 

 1、scrapy是通过hashlib算法转成长度一致的url,然后再通过set集合去重的,有兴趣看源码

from scrapy.utils.request import request_fingerprint

def request_fingerprint(request, include_headers=None):

         fp = hashlib.sha1()  # 指纹是hashlib表示来生成一个固定长度的哈兮值

        fp.update(to_bytes(request.method))

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

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

 2、在scrapy框架中去重的中间件文件 dupefilters.py文件 :

# 封装去重类
class RFPDupeFilter(BaseDupeFilter):
    """Request Fingerprint duplicates filter"""

    def __init__(self, path=None, debug=False):
        self.file = None
        self.fingerprints = set() # 去重器
        self.logdupes = True #log日志
        self.debug = debug #调试
        self.logger = logging.getLogger(__name__)
   
   #有个函数叫 request_seen() 
   def request_seen(self, request):
       fp = self.request_fingerprint(request)
       if fp in self.fingerprints:
            return True
       self.fingerprints.add(fp)
       if self.file:
            self.file.write(fp + os.linesep)

# 被scrapy/core/scheduler.py调用这个是调度器
class Scheduler(object):
    # enqueue_request()的函数:spider的每来一个url就是通过这个函数来执行的
    def enqueue_request(self, request):
        if not request.dont_filter and self.df.request_seen(request):
            self.df.log(request, self.spider)
            return False

每次执行之前都会调用到    request_seen(request)   这个方法

这个方法就会生成一个指纹,指纹下面的掉用的就比较复杂了,简单的说就是要去执行       hashlib.sha1()       这个算法来生成一个固定长度的哈兮值

再然后就是在那个去重器中的

self.fingerprints = set() 

就是通过上句代码执行了set集合来去重了

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值