在scrapy中,如果遇到一些类似中间件报错的问题,不是自己编写的内部代码问题,那么就需要在框架内进行处理:
比如将中间件的报错全部pass,代码如下,在middlewares.py中: (参考文章:https://www.cnblogs.com/zhaof/p/7198407.html)
from twisted.internet import defer
from twisted.internet.error import TimeoutError, DNSLookupError, \
ConnectionRefusedError, ConnectionDone, ConnectError, \
ConnectionLost, TCPTimedOutError
from twisted.web.client import ResponseFailed
from scrapy.core.downloader.handlers.http11 import TunnelError
class ProcessAllExceptionMiddleware(object):
ALL_EXCEPTIONS = (defer.TimeoutError, TimeoutError, DNSLookupError,
ConnectionRefusedError, ConnectionDone, ConnectError,
ConnectionLost, TCPTimedOutError, ResponseFailed,
IOError, TunnelError)
def process_response(self, request, response, spider):
# 捕获状态码为40x/50x的response
if str(response.status).startswith('4') or str(response.status).startswith('5'):
# 随意封装,直接返回response,spider代码中根据url==''来处理response
response = HtmlResponse(url='')
return response
# 其他状态码不处理
return response
def process_exception(self, request, exception, spider):
# 捕获几乎所有的异常
if isinstance(exception, self.ALL_EXCEPTIONS):
# 在日志中打印异常类型
print('Got exception: %s' % (exception))
# 随意封装一个response,返回给spider
response = HtmlResponse(url='exception')
return response
# 打印出未捕获到的异常,也就是超出我们预料的异常
print('not contained exception: %s' % exception)
以上是捕获到异常后,直接return response,进行接下来的请求处理,如果需要对该异常进行重新请求,则需要retrun request
(参考文章:https://www.cnblogs.com/zhaof/p/7198407.html)
以上示例,是捕获到异常后,添加代理,然后再次请求。