scrapy中遇到报错的处理方法(twisted的报错)

在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)

 

scrapy中遇到报错的处理方法(twisted的报错)_第1张图片

 

 

以上示例,是捕获到异常后,添加代理,然后再次请求。

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(scrapy中遇到报错的处理方法(twisted的报错))