Scrapy使用中介軟體捕獲Spider丟擲的異常
阿新 • • 發佈:2020-10-21
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() 被呼叫,而每個中介軟體的 方法將按遞減的順序呼叫。