作业:暂停和恢复爬取¶
有时,对于大型网站,需要暂停爬取并在稍后恢复。
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 持久性支持,需要注意以下几点
请求序列化¶
为了使持久性工作,Request
对象必须可以使用 pickle
进行序列化,除了传递给其 __init__
方法的 callback
和 errback
值,这些值必须是正在运行的 Spider
类的的方法。
如果您希望记录无法序列化的请求,可以在项目的设置页面中将 SCHEDULER_DEBUG
设置设置为 True
。默认情况下为 False
。