scrapy中request的指纹生成

130 阅读1分钟
    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]

第一步:在调用该函数的时候,只传来一个request, 建立一个字典的弱引用

第二步:运用sha1加密, 将请求方法(get, post) 转为为字节,再调用update方法,

第三步:运用canonicalize_url函数,将url进行格式化,具体这个函数是做什么的。可以参照下面的链接:点击打开链接

第四步:将请求参数字节话,最后进行加密。

经过这四步就生成了该request的指纹

因为include_headers是默认的,所以如果你在判断是不是重复的request的时候,需要用到部分headers中的东西,你可以定义一个include_headers。以达到更好的判重的目的。