Scrapy使用中间件捕获Spider抛出的异常
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() 被调用,而每个中间件的 方法将按递减的顺序调用。