【发布时间】:2017-06-08 09:15:05
【问题描述】:
我用 Scrapy 编写了一个爬虫。
管道中有一个函数,我将数据写入数据库。我使用日志记录模块来记录运行时日志。
我发现当我的字符串有中文logging.error()会抛出异常。但是爬虫一直在运行!
我知道这是一个小错误,但如果出现严重异常,如果爬虫继续运行,我会错过它。
我的问题是:有没有设置可以强制Scrapy在出现异常时停止?
【问题讨论】:
标签: web-scraping scrapy
我用 Scrapy 编写了一个爬虫。
管道中有一个函数,我将数据写入数据库。我使用日志记录模块来记录运行时日志。
我发现当我的字符串有中文logging.error()会抛出异常。但是爬虫一直在运行!
我知道这是一个小错误,但如果出现严重异常,如果爬虫继续运行,我会错过它。
我的问题是:有没有设置可以强制Scrapy在出现异常时停止?
【问题讨论】:
标签: web-scraping scrapy
一个整数,它指定要接收的最大错误数 在关闭蜘蛛之前。如果蜘蛛产生的不止这些 错误的数量,它将关闭原因 closespider_errorcount。如果为零(或未设置),蜘蛛将不会关闭 按错误数。
默认设置为 0
CLOSESPIDER_ERRORCOUNT = 0
如果您想在遇到第一个错误时退出,可以将其更改为 1。
更新
阅读this question的答案,也可以使用:
crawler.engine.close_spider(self, 'log message')
更多信息请阅读:
【讨论】:
在蜘蛛的 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引擎的一个功能。
我不知道有什么设置会在出现任何异常时关闭爬虫,但您至少有两个选择:
CloseSpider 异常,也许当您捕获到您提到的异常时crawler.engine.close_spider(spider, 'some reason')。请参阅how the CloseSpider extension is implemented(它与CloseSpider 异常不同)。
例如,您可以将其与 spider_error 信号挂钩。【讨论】: