
我们都知道 scrapy 可以设置代理 IP,但是不知道大家有没有遇到这样一个场景:
常规的代理 IP 设置,会对每个请求都生效,也就是说每个请求都会去使用代理
但是有些请求根本不需要代理,我希望当我的请求出现错误或超时的时候再去设置代理 IP
这样既节省了资源,又缩短了请求的时间,毕竟有些代理质量真的一言难尽
那么怎么才能让它请求超时的时候,再使用代理 IP 进行重新请求呢?
很容易就想到下载中间件,DowmloaderMiddleware
一个介于 request, response 中间的钩子,用于修改 request 和处理 response
首先我们需要捕获超时等异常的请求,在下载中间件中添加如下代码:
from twisted.internet.error import TCPTimedOutError, TimeoutError
def process_exception(self, request, exception, spider):
if isinstance(exception, TimeoutError):
self.process_request_back(request, spider) # 连接超时才启用代理ip机制
return request
elif isinstance(exception, TCPTimedOutError):
self.process_request_back(request, spider)
return request
复制代码
以上代码的作用就是捕获异常请求,同时调用设置代理 IP 的函数,并返回该请求
下面的设置

本文介绍了如何在Scrapy爬虫中,当请求出现错误或超时时,才启用代理IP进行重试。通过自定义下载中间件捕获异常请求,并在需要时设置代理,以节省资源并优化请求效率。此外,还分享了降低并发请求、增加超时时间和异常重试次数等解决超时问题的方法。
最低0.47元/天 解锁文章
6129

被折叠的 条评论
为什么被折叠?



