Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 管道刮伤原因分析_Python_Scrapy - Fatal编程技术网

Python 管道刮伤原因分析

Python 管道刮伤原因分析,python,scrapy,Python,Scrapy,我使用scrapy管道将项目保存在db中,它可以很好地用于此目的。现在我尝试在db中写一条记录,原因是蜘蛛关闭。当我引发CloseSpider异常时,我可以在引发之前生成特定项(并将记录保存到db)。但如果蜘蛛以“完成”结尾,我就不能做同样的事情了。 我尝试的是: 将卡盘关闭信号连接到卡盘关闭方法内部 spider方法和由此产生的收益项-这不起作用 在spider_closed内部,将一些spider变量设置为原因值和 然后尝试用管道的close_spider方法读取它。问题 这是在spider

我使用scrapy管道将项目保存在db中,它可以很好地用于此目的。现在我尝试在db中写一条记录,原因是蜘蛛关闭。当我引发CloseSpider异常时,我可以在引发之前生成特定项(并将记录保存到db)。但如果蜘蛛以“完成”结尾,我就不能做同样的事情了。 我尝试的是:

  • 将卡盘关闭信号连接到卡盘关闭方法内部 spider方法和由此产生的收益项-这不起作用
  • 在spider_closed内部,将一些spider变量设置为原因值和 然后尝试用管道的close_spider方法读取它。问题 这是在spider's之前调用的管道的close_spider 蜘蛛门关上了。而且管道中的param也没有任何原因 close_spider签名:close_spider(自我,spider)
  • 我现在拥有的工作解决方案-直接执行内部查询 蜘蛛的蜘蛛门关上了。但我想避免这种情况,并将我的db逻辑与spider逻辑分开
  • 那个么,有谁能提供我如何访问管道内的蜘蛛关闭原因吗

    UPD: 感谢我从_crawler方法在管道内部注册信号处理程序(几乎像内部spider),它对我有效

    @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))
    

    这是我的解决办法。希望对你有所帮助

    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
    

    在管道中注册信号处理程序怎么样?这个信号有一个理由作为论据。谢谢!在管道中注册处理程序这是一个好主意,对我来说很有效。我用一小段工作解决方案编辑了这篇文章