zoukankan      html  css  js  c++  java
  • 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() 被调用,而每个中间件的 方法将按递减的顺序调用。

  • 相关阅读:
    C++ 友元(friend关键字)、类中的重载、操作符重载(operator关键字)
    C++ 二阶构造模式
    C++ 对象构造顺序、构析函数、临时对象。
    C++ 初始化列表
    C++ 对象的构造
    C++ 类学习笔记 :: 作用域限定符
    linux和window下生成任意大小的文件
    RobotFramework和Eclipse集成-安装和使用说明
    Linux中判断一个命令是否执行成功
    xpath 轴定位表达方式
  • 原文地址:https://www.cnblogs.com/iFanLiwei/p/13853468.html
Copyright © 2011-2022 走看看