任务:暂停和恢复爬取

有时,对于大型网站,暂停爬取并能够在稍后恢复是很有必要的。

Scrapy 通过提供以下功能开箱即用地支持此功能:

  • 一个调度程序,将调度的请求持久化到磁盘上

  • 一个重复过滤器,将访问过的请求持久化到磁盘上

  • 一个扩展,用于在批次之间保持某些蜘蛛状态(键/值对)持久化

工作目录

要启用持久化支持,您只需通过JOBDIR设置定义一个作业目录。该目录将用于存储保持单个作业(即蜘蛛运行)状态所需的所有数据。需要注意的是,此目录不得由不同的蜘蛛共享,甚至不能由同一蜘蛛的不同作业/运行共享,因为它旨在用于存储单个作业的状态。

如何使用它

要启动一个支持持久化的爬虫,请像这样运行它:

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

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

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

在批次之间保持持久状态

有时你可能希望在暂停/恢复批次之间保持一些持久的爬虫状态。你可以使用 spider.state 属性来实现这一点,它应该是一个字典。有一个内置扩展负责在爬虫启动和停止时从作业目录中序列化、存储和加载该属性。

这是一个使用蜘蛛状态的回调示例(为了简洁起见,省略了其他蜘蛛代码):

def parse_item(self, response):
    # parse item here
    self.state["items_count"] = self.state.get("items_count", 0) + 1

持久化陷阱

如果你想使用Scrapy的持久化支持,有几件事情需要注意:

Cookies 过期

Cookies可能会过期。因此,如果你不迅速恢复你的爬虫,预定的请求可能不再有效。如果你的爬虫不依赖cookies,这将不会是一个问题。

请求序列化

为了使持久化工作,Request 对象必须能够与 pickle 序列化,除了传递给它们的 __init__ 方法的 callbackerrback 值,这些值必须是正在运行的 Spider 类的方法。

如果您希望记录无法序列化的请求,您可以在项目的设置页面中将 SCHEDULER_DEBUG 设置为 True。 默认情况下,它是 False