1. 程式人生 > 實用技巧 >Scrapy使用中介軟體捕獲Spider丟擲的異常

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() 被呼叫,而每個中介軟體的 方法將按遞減的順序呼叫。