Scrapy Request dont_filter参数

来源:8-3 Requests和Response介绍

JaydenJune

2020-11-19

Hi bobby:
dont_filter 是针对Request对象过滤,还是针对url过滤?

if url in urls:
	yield scrapy.Request(url=url,callback=callback,dont_filter=True)
这样设置dont_filter对吗? 我没弄明白到底在什么实际情况下使用dont_filter=True.
是碰到相同的Request对象不进行过滤?还是碰到相同的url不进行过滤?
请你给举例讲解一下.如果dont_filter使用不当的话,可能会进入死循环的爬取.谢谢!
        for question_data in question_json["data"]:
            if "question" in question_data["target"]:
                # 获取问题的ID
                question_id = question_data["target"]["question"]["id"]
                # https://www.zhihu.com/question/266668342
                question_url = "https://www.zhihu.com/question/{}".format(question_id)
                # 问题的创建时间
                question_created_time = question_data["target"]["question"]["created"]
                # 获取question url后,解析数据
                yield scrapy.Request(question_url, headers=self.headers,
                                     meta={"question_created_time": question_created_time},
                                     callback=self.parse_question)
比如我这段代码,需不需要添加dont_filter=True,不添加的话会出现什么情况?只会爬取第一个url吗?
再就是如果遍历出两个相同的url,设置为True的话,也不会被过滤吗?
dont_filter参数到底是去除重复的url呢?还是对某段时间内发送多个Request的时候进行过滤?

问的问题可能有些乱,中心思想是dont_filter到底怎么用?一头雾水.
写回答

1回答

bobby

2020-11-20

dont_filter是根据request来去重的,但是这里的request不是简单的url去重那么简单,而是scrapy有一套指纹的生成方法,比如同一个url但是是post的请求。post参数不一样也不能认为是同一个请求,后面的scrapy-redis源码分析中会讲解到这个的,如果你是get请求,那么你就简单的理解为通过url去重,这样的好处是这个数据爬取过你就不用再爬取了,不然重复爬取耗费性能啊,但是说到这里我得提出另一个需求:

    如果你的url相同的页面,可能数据每次访问都不一样,那么是不是该重复爬取呢? - 比如列表页

    如果你的url相同的页面,虽然数据都一样,但是有可能用户会更新里面的内容呢? -比如文章详情页

所以我们不能说: 这个页面没有必要重复抓取, 但是另一方面大量的情况确实: 大部分的详情页个不会更新或者更新概率极低,这个时候没有必要去抓取最新的数据,毕竟过滤抓取过的页面,这样效率高啊

    所以:具体请求具体分析,scrapy提供了这个参数就是让你自己去决定这个数据是应该过滤掉还是可以重复抓取

2
1
JaydenJune
非常感谢!
2020-11-20
共1条回复

Scrapy打造搜索引擎 畅销4年的Python分布式爬虫课

带你彻底掌握Scrapy,用Django+Elasticsearch搭建搜索引擎

5831 学习 · 6293 问题

查看课程