如何用scrapy过滤python爬虫中的多余内容?

如何用scrapy过滤python爬虫中的多余内容?,第1张

如何用scrapy过滤python爬虫中的多余内容?

我们在打印资料的时候,如果是多份一起打印就把其中重复的页面筛选出来进行归类,虽然极小的概率会有出错的可能性。那么我们的电脑也需要有对应地程序代码,教它如何去把获取数据中重复的内容给去除掉。在这里小编推荐大家使用scrapy框架,具体的代码可以接着往下看:


在分析之前,先看一下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方法中变更。


跟着以上的步骤 *** 作,我们就不同担心爬虫在遇到重复的数据会不会一并给带回来啦。当然前提是我们要先给它们下达了指令,小伙伴们赶紧试一下吧。更多Python学习推荐:PyThon学习网教学中心。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/zaji/3014374.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-28
下一篇 2022-09-28

发表评论

登录后才能评论

评论列表(0条)

保存