dont_filter=True 能让请求绕过去重。什么情形必须用,什么情形用了会出事?这篇用有环的站点、重试、重定向和轮询四个场景实测:什么时候少了它会丢请求,什么时候多了它会停不下来。
默认(去重):服务器收到 3 个请求;finish_reason=finished;dupefilter/filtered=3;request_depth_max=2 dont_filter=True,CLOSESPIDER_PAGECOUNT=50:服务器收到 50 个请求;finish_reason=closespider_pagecount;dupefilter/filtered=0;request_depth_max=26 dont_filter=True,DEPTH_LIMIT=4:服务器收到 19 个请求;finish_reason=finished;dupefilter/filtered=0;request_depth_max=4 dont_filter=True,CLOSESPIDER_TIMEOUT=1:服务器收到 799 个请求;finish_reason=closespider_timeout;dupefilter/filtered=0;request_depth_max=400
去重是防止爬虫在环里打转的第一道防线;对所有请求关掉它,就必须有 DEPTH_LIMIT、CLOSESPIDER_PAGECOUNT 或 CLOSESPIDER_TIMEOUT 之类的刹车。
请求 dont_filter 已重试次数 重定向产生的 /robots.txt False 0 False /flaky False 0 False /go False 0 False /target False 0 True /flaky True 1 False /flaky True 2 False
重试请求会被设成 dont_filter=True,所以不会被去重吃掉;重定向沿用原请求的值;robots.txt 请求是 False。
/go 的请求 dont_filter=False(默认):服务器收到 ['/target', '/go'];/go 的回调没有被调用;dupefilter/filtered=1;finish_reason=finished /go 的请求 dont_filter=True:服务器收到 ['/target', '/go', '/target'];/go 的回调被调用;dupefilter/filtered=0;finish_reason=finished
重定向产生的请求同样经过去重。如果重定向目标之前已经抓过,默认会被过滤,回调不会被调用。想要这个响应就给原请求设 dont_filter=True。
不加 dont_filter:1 个请求(想轮询 5 次),dupefilter/filtered=1 dont_filter=True:5 个请求,dupefilter/filtered=0
反复请求同一个 URL 想拿最新数据时,每次都要 dont_filter=True,否则第二次起就被过滤。