Scrapy使用中间件捕获Spider抛出的异常

docs

Spider中间件启用,setting.py文件

SPIDER_MIDDLEWARES = {
   'crawler.middlewares.CrawlerSpiderMiddleware': 543,
}
from scrapy import signals

class CrawlerSpiderMiddleware(object):
    # Not all methods need to be defined. If a method is not defined,
    # scrapy acts as if the spider middleware does not modify the
    # passed objects.

    @classmethod
    def from_crawler(cls, crawler):
        # 这个方法被Scrapy用来创建你的爬虫
        s = cls()
        crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
        return s

    def process_spider_input(self, response, spider):
        # 调用通过spider中间件并进入spide的每个响应
        spider.logger.info("process_spider_input")
        # 应该返回None或者抛出异常
        return None

    def process_spider_output(self, response, result, spider):
        # 在处理完响应后,使用Spider返回的结果调用。
        # 必须返回请求、dict或Item对象的iterable。
        for i in result:
            yield i

    def process_spider_exception(self, response, exception, spider):
        # 当spider或process_spider_input()方法(来自其他spider中间件)引发异常时调用。
        spider.logger.info("process_spider_exception")
        # 应返回响应、dict或Item对象的None或iterable。
        pass

    def process_start_requests(self, start_requests, spider):
        # 使用spider的start请求调用,其工作方式与process_spider_output()方法类似,只是它没有关联的响应。
        spider.logger.info("process_start_requests start")
        # 必须返回请求
        for r in start_requests:
            yield r
        spider.logger.info("process_start_requests end")

    def spider_opened(self, spider):
        spider.logger.info('Spider opened: %s' % spider.name)

注意

process_spider_input() 每个中间件的方法将按递增的中间件顺序(100、200、300,...)
process_spider_output() 被调用,而每个中间件的 方法将按递减的顺序调用。

posted @ 2020-10-21 17:07  呓语i  阅读(823)  评论(0编辑  收藏  举报