暂停和恢复自包含的scrapy脚本

Posted

技术标签:

【中文标题】暂停和恢复自包含的scrapy脚本【英文标题】:Pausing and resuming a self contained scrapy script 【发布时间】:2017-03-14 15:13:31 【问题描述】:

我正在运行一个独立的 Scrapy 蜘蛛,它存在于单个 .py 文件中。如果服务器发生故障/断电/脚本可能失败的任何其他原因,是否有一种优雅的方法可以确保我能够在恢复后恢复运行?

可能类似于内置的 JOBDIR 设置?

【问题讨论】:

【参考方案1】:

如果你有一个独立的脚本,你仍然可以使用 JOBDIR 选项,例如你可以在custom_settings属性中设置一个值:

class MySpider(scrapy.Spider):
    custom_settings = 
        'JOBDIR': './job',
    
    #...

或者,您可以在创建 CrawlerProcess 时设置此选项(如果您正在使用该选项在脚本中运行蜘蛛):

process = CrawlerProcess('JOBDIR': './job')
process.crawl(MySpider)
process.start()

【讨论】:

看来我得坚持scrapy的机制了,谢谢!【参考方案2】:

有一个完整的documentation page 涵盖了这个问题:

要启动一个启用了持久性支持的蜘蛛,运行它就像 这个:

scrapy crawl somespider -s JOBDIR=crawls/somespider-1

然后,您可以随时安全地停止蜘蛛(通过按 Ctrl-C 或发送信号),然后通过发出相同的命令恢复它:

scrapy crawl somespider -s JOBDIR=crawls/somespider-1

【讨论】:

我拥有的是一个自包含的蜘蛛模块,而不是由“startproject”关键字生成的整个项目,不幸的是这不适用于我的情况。另外,我正在寻找一种方法来持续保存蜘蛛的状态,以确保在服务器故障的情况下我有一种恢复方式,而不是在轻微暂停的情况下。 @m.livs 哦,对不起,我错过了那部分。为什么不只是有一个scrapy项目?将您拥有的任何项目放在一个模块中绝不是一个好主意,除非它少于 50 行代码左右。 我正在尝试仅使用 Scrapy 中我需要的部分。即使我确实使用了一个完整的项目, -S 机制在暴力停止的情况下也无济于事...... @m.livs 如果 JOBDIR 在暴力停止的情况下不起作用,那么在 scrapy 错误跟踪器 (github.com/scrapy/scrapy/issues) 中提出问题可能会有所帮助,或者可能对现有问题发表评论 (@987654323 @)【参考方案3】:

您可以使用supervisor。

[program:foo]
command=~/script_path/script.py

【讨论】:

我会调查的,谢谢!

以上是关于暂停和恢复自包含的scrapy脚本的主要内容,如果未能解决你的问题,请参考以下文章

scrapy框架爬虫的暂停和启动

用 Rhino 解释 Java 中的 JavaScript:暂停/恢复脚本

可以暂停 PHP 脚本,使用 HTML/JS 获取 GPS 位置,然后恢复 PHP?

在 JSContext 中暂停/停止评估脚本

Spider-scrapy断点续爬

暂停js脚本直到事件发生