【发布时间】:2021-01-07 10:59:32
【问题描述】:
我试图在RetryMiddleware 中的process_response 中不显示/获取由scrapy 引发的一些错误。超过最大重试限制时脚本遇到的错误。我在中间件中使用了代理。奇怪的是脚本抛出的异常已经在EXCEPTIONS_TO_RETRY 列表中。脚本有时可能会超过最大重试次数而没有任何成功,这是完全可以的。但是,我只是不希望看到该错误,即使它存在,这意味着抑制或绕过它。
错误是这样的:
Traceback (most recent call last):
File "middleware.py", line 43, in process_request
defer.returnValue((yield download_func(request=request,spider=spider)))
twisted.internet.error.TCPTimedOutError: TCP connection timed out: 10060: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond..
这是process_response 在RetryMiddleware 中的样子:
class RetryMiddleware(object):
cus_retry = 3
EXCEPTIONS_TO_RETRY = (defer.TimeoutError, TimeoutError, DNSLookupError, \
ConnectionRefusedError, ConnectionDone, ConnectError, \
ConnectionLost, TCPTimedOutError, TunnelError, ResponseFailed)
def process_exception(self, request, exception, spider):
if isinstance(exception, self.EXCEPTIONS_TO_RETRY) \
and not request.meta.get('dont_retry', False):
return self._retry(request, exception, spider)
def _retry(self, request, reason, spider):
retries = request.meta.get('cus_retry',0) + 1
if retries<=self.cus_retry:
r = request.copy()
r.meta['cus_retry'] = retries
r.meta['proxy'] = f'https://{ip:port}'
r.dont_filter = True
return r
else:
print("done retrying")
如何消除EXCEPTIONS_TO_RETRY 中的错误?
PS:无论我选择哪个站点,当达到最大重试限制时脚本遇到的错误。
【问题讨论】:
-
如果禁用该中间件,是否不会发生超时?
-
不。当我禁用自定义中间件 @Gallaecio 时,它不会发生。
-
如果你直接在你的蜘蛛中使用 UserAgent() 并从你的蜘蛛中设置
User-Agent会发生什么。这有效还是超时?
标签: python python-3.x web-scraping scrapy middleware