scrapy 2.3 暂停和恢复爬行
有时,对于大型网站,暂停爬行并稍后恢复爬行是可取的。
Scrapy通过提供以下功能来支持此功能:
- 在磁盘上保持预定请求的计划程序
- 重复的筛选器,用于将访问的请求保持在磁盘上
- 在批处理之间保持某些蜘蛛状态(键/值对)持久的扩展。
作业目录
要启用持久性支持,只需定义 作业目录 通过 JOBDIR 设置。此目录将用于存储所有必需的数据,以保持单个作业(即spider运行)的状态。需要注意的是,该目录不能由不同的spider共享,甚至不能由同一spider的不同作业/运行共享,因为它是用来存储 单一的 工作。
如何使用它
要在启用持久性支持的情况下启动spider,请按如下方式运行:
scrapy crawl somespider -s JOBDIR=crawls/somespider-1
然后,您可以随时安全地停止蜘蛛(通过按ctrl-c或发送信号),然后通过发出相同的命令恢复蜘蛛:
scrapy crawl somespider -s JOBDIR=crawls/somespider-1
保持批之间的持久状态
有时您需要在暂停/恢复批处理之间保持一些持久的蜘蛛状态。你可以使用 spider.state 属性,它应该是dict。当spider启动和停止时,有一个内置扩展负责从作业目录序列化、存储和加载该属性。
下面是一个使用spider状态的回调示例(为了简洁起见,省略了其他spider代码):
def parse_item(self, response):
# parse item here
self.state['items_count'] = self.state.get('items_count', 0) + 1
持久性问题
如果您想使用零碎的持久性支持,需要记住以下几点:
cookies过期
Cookie可能过期。因此,如果你不尽快恢复你的蜘蛛,计划的请求可能不再有效。如果你的蜘蛛不依赖cookies,这就不是问题了。
请求序列化
为了坚持工作, Request
对象必须可以用序列化 pickle
,除了 callback
和 errback
传递给他们的值 __init__
方法,它必须是运行的方法
Spider
班级。
如果要记录无法序列化的请求,可以设置 SCHEDULER_DEBUG
设置为 True 在项目的“设置”页中。它是 False 默认情况下。
更多建议: