怎么用scrapy过滤python爬虫中的多余内容

小编给大家分享一下怎么用scrapy过滤python爬虫中的多余内容,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!

宣城网站建设公司成都创新互联,宣城网站设计制作,有大型网站制作公司丰富经验。已为宣城1000多家提供企业网站建设服务。企业网站搭建\外贸网站建设要多少钱,请找那个售后服务好的宣城做网站的公司定做!

在分析之前,先看一下scrapy的去重策略:

scrapy通过request_fingerprint函数,对Request对象生成指纹,看注释:

# 该函数在scrapy/utils/request.py文件中
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()
        """计算指纹时,请求方法(如GET、POST)被计算在内"""
        fp.update(to_bytes(request.method))
 
        """下面这句有意思,canonicalize_url()将url规范化,意味着
          http://www.example.com/query?id=111&cat=222
          http://www.example.com/query?cat=222&id=111
        这样参数位置变化,但参数值不变的网址,表示的仍是同一个网址,符合现实逻辑。
         """
        fp.update(to_bytes(canonicalize_url(request.url)))
 
        """request.body的属性是字符串:
        一般GET方法的body为空字符串,不考虑;
        而POST方法要上传一个字典data(类型是dict),
        要经过urllib.parse.urlencode()函数转换后才能变成request.body
       """
        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.meta的内容作为指纹计算的一部分"""

scrapy生成的唯一指纹,存在内存的一个集合里,即set。如果下一次请求产生的指纹在这个set里面,请求被判定为重复,这次请求就被忽略,也就是所谓的去重了。从上面可以可出,scrapy认为,如果url/POST data/method都一致,这个请求就是重复的,这适合绝大多数情况。

需要提一下:上述的处理方式,意味着想要变更request的指纹就要改变request,即是在downloaderMiddleware的process_request方法中变更。

看完了这篇文章,相信你对怎么用scrapy过滤python爬虫中的多余内容有了一定的了解,想了解更多相关知识,欢迎关注创新互联行业资讯频道,感谢各位的阅读!


分享文章:怎么用scrapy过滤python爬虫中的多余内容
本文地址:http://hbruida.cn/article/gjcgpj.html