如何在scrapy请求异常之后再设置代理IP,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
成都创新互联公司服务项目包括杞县网站建设、杞县网站制作、杞县网页制作以及杞县网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,杞县网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到杞县省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
我们都知道 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 的函数,并返回该请求
下面的设置 IP 的代码
def process_request_back(self, request, spider):
request.meta["proxy"] = xun.proxy
request.headers["Proxy-Authorization"] = xun.headers
注意不能使用 process_request()
方法, 如果代理添加在该方法下,就是常规的代理 IP 方法
同时对于 scrapy 出现 TimeoutError,TCPTimedOutError 等异常的时候,还可以通过以下几种方案来解决:
主要通过设置文件来更改
1、降低同时请求的数量
CONCURRENT_REQUESTS = 5
2、 增加超时时间
DOWNLOAD_TIMEOUT = 300
3、 增加异常重试次数
RETRY_TIMES = 5
关于如何在scrapy请求异常之后再设置代理IP问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联行业资讯频道了解更多相关知识。
新闻标题:如何在scrapy请求异常之后再设置代理IP
浏览地址:http://scgulin.cn/article/piepoe.html