【问题标题】:how to force scrapy exit when there is an exception出现异常时如何强制scrapy退出
【发布时间】:2017-06-08 09:15:05
【问题描述】:

我用 Scrapy 编写了一个爬虫。

管道中有一个函数,我将数据写入数据库。我使用日志记录模块来记录运行时日志。

我发现当我的字符串有中文logging.error()会抛出异常。但是爬虫一直在运行!

我知道这是一个小错误,但如果出现严重异常,如果爬虫继续运行,我会错过它。

我的问题是:有没有设置可以强制Scrapy在出现异常时停止?

【问题讨论】:

    标签: web-scraping scrapy


    【解决方案1】:

    您可以使用CLOSESPIDER_ERRORCOUNT

    一个整数,它指定要接收的最大错误数 在关闭蜘蛛之前。如果蜘蛛产生的不止这些 错误的数量,它将关闭原因 closespider_errorcount。如果为零(或未设置),蜘蛛将不会关闭 按错误数。

    默认设置为 0 CLOSESPIDER_ERRORCOUNT = 0 如果您想在遇到第一个错误时退出,可以将其更改1

    更新

    阅读this question的答案,也可以使用:

    crawler.engine.close_spider(self, 'log message')
    

    更多信息请阅读:

    Close spider extension

    【讨论】:

    • 我错过了那个!不错的选择。
    • 您好 parik,我认为您的答案正是我想要的。我在我的蜘蛛中添加了以下代码,但它不起作用,你能帮我吗?: EXTENSIONS = { # 'scrapy.extensions.telnet.TelnetConsole': None, 'scrapy.extensions.closespider.CloseSpider': 100, } CLOSESPIDER_ERRORCOUNT = 1
    • @scotthuang 更新您的问题并提出您尝试的内容和错误消息
    • 嗨 parik,我资助它确实有效!我用数据库异常对其进行了测试。当我使用 Out Of Index 异常测试此扩展时,Scrapy 停止。我会更深入地找出原因,谢谢你的建议。
    【解决方案2】:

    在蜘蛛的 process_item 函数中,您有一个 spider 的实例。

    为了解决您的问题,您可以在插入数据时捕获 异常,然后在遇到如下异常时巧妙地阻止蜘蛛:

     def process_item(self, item, spider):
        try:
            #Insert your item here
        except YourExceptionName:
            spider.crawler.engine.close_spider(self, reason='finished')
    

    【讨论】:

    • 这看起来很有希望,但是您如何使用close_spider() 中的YourExceptionName
    • 我不明白你的问题。在我的示例中,YourExceptionName 代表自定义异常,但它可以是任何异常,也可以没有。 close_spider()是scrapy引擎的一个功能。
    • 是的,我是新手,所以我想问题是自定义异常的外观如何,它在哪里定义?
    • 您可以查看此answer 以创建自定义异常。
    • 感谢阿德里安,该链接澄清了它。
    【解决方案3】:

    我不知道有什么设置会在出现任何异常时关闭爬虫,但您至少有两个选择:

    • 您可以在蜘蛛回调中引发 CloseSpider 异常,也许当您捕获到您提到的异常时
    • 如果您有对爬虫和蜘蛛对象的引用,例如在扩展中,您可以调用crawler.engine.close_spider(spider, 'some reason')。请参阅how the CloseSpider extension is implemented(它与CloseSpider 异常不同)。 例如,您可以将其与 spider_error 信号挂钩。

    【讨论】:

    • 你能提供第一个选项的例子吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多