如果出现异常,如何强制scrapy退出

时间:2017-06-08 09:15:06

标签: web-scraping scrapy

我用 Scrapy 编写了一个抓取工具。

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

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

我知道这是一个小错误,但如果存在严重异常,我会在爬行器继续运行时错过它。

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

3 个答案:

答案 0 :(得分:5)

您可以使用CLOSESPIDER_ERRORCOUNT

  

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

默认情况下,它设置为0 CLOSESPIDER_ERRORCOUNT = 0 如果您想在第一次出错时退出,可以更改为 1

<强>更新

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

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

了解更多信息:

Close spider extension

答案 1 :(得分: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')

答案 2 :(得分:1)

我不知道在任何异常情况下关闭抓取工具的设置,但您至少有几个选项:

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