首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >管道擦伤原因

管道擦伤原因
EN

Stack Overflow用户
提问于 2017-08-09 06:27:22
回答 1查看 1.6K关注 0票数 3

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

  1. 让spider_closed信号连接到蜘蛛方法中的spider_closed方法,并从中产生不起作用的项目。
  2. 在spider_closed内部,将一些蜘蛛变量设置为推理值,然后尝试在管道的close_spider方法中读取它。这里的问题是管道的close_spider在蜘蛛的spider_closed之前调用。此外,在管道的close_spider签名中也没有理由使用param : close_spider(self,spider)
  3. 我现在有一个工作解决方案--在蜘蛛的spider_closed中直接执行查询。但我想避免这种情况,并将db逻辑与蜘蛛逻辑分离开来。

那么,有谁能给我提供如何在管道内访问蜘蛛关闭原因呢?

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

代码语言:javascript
复制
@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))
EN

回答 1

Stack Overflow用户

发布于 2018-03-15 06:39:59

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

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45583079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档