scrapy关闭原因在管道中

时间:2017-08-09 06:27:23

标签: python scrapy

我使用scrapy管道来保存db中的项目,并且它可以正常工作。现在我尝试在db中写一个蜘蛛关闭原因的记录。当我提出CloseSpider异常时,我可以在raise之前产生特定项目(并将记录保存到db)。但如果蜘蛛关闭了"完成"我不能做同样的事情。 我尝试了什么:

  1. 将spider_closed信号连接到spider_closed方法里面 蜘蛛方法和产量项目 - 那是行不通的
  2. 在spider_closed里面设置一些蜘蛛变量到理由值和     然后尝试在管道的close_spider方法中读取它。问题     这是在蜘蛛之前调用的管道&close_spider     spider_closed。管道系统也没有理由     close_spider签名:close_spider(self,spider)
  3. 我现在使用的工作解决方案 - 直接在里面执行查询 蜘蛛的蜘蛛cl。但我想避免这种情况,并将我的数据库逻辑与蜘蛛逻辑分开
  4. 那么,有人能提供我如何在管道内访问蜘蛛关闭原因吗?

    UPD: 感谢Paul我在管道from_crawler方法中注册了信号处理程序(几乎就像蜘蛛内部一样),它对我有用

    @classmethod
    def from_crawler(cls, crawler):
        temp = cls()
        crawler.signals.connect(temp.spider_closed, signal=scrapy.signals.spider_closed)
        return temp
    
    def spider_closed(self, reason):
        logging.info("REASON: {}".format(reason))
    

1 个答案:

答案 0 :(得分:1)

这是我的解决方案。希望有利于你。

class SubJobPipeline(object):
    @classmethod
    def from_crawler(cls, crawler):
        ins = cls(crawler.settings)
        crawler.signals.connect(ins.customize_close_spider, signal=signals.spider_closed)
        return ins

    def customize_close_spider(self, **kwargs):
        _logger.warning("customize_close_spider kwargs: %s", kwargs)
        reason = kwargs.get("reason") # reason maybe finished, shutdown or others
        spider = kwargs.get("spider")
        if reason == "finished":
            # extract your item through spider
            # do what you want