作业:暂停并恢复抓取
有时,对于大型网站,最好暂停抓取,并能够在以后恢复。
Scrapy通过提供以下设施来支持此功能:
一个在磁盘上保留计划的请求的调度程序
一个在磁盘上持续访问请求的重复过滤器
一个在批次之间保持一些蜘蛛状态(密钥/值对)的扩展
作业目录
要启用持久性支持,您只需要通过JOBDIR设置定义作业目录。该目录将用于存储所有必需的数据,以保持单个作业的状态(即,一个蜘蛛运行)。重要的是要注意,这个目录不能由不同的蜘蛛共享,甚至不同于同一个蜘蛛的不同的作业/运行,因为它用于存储单个作业的状态。
如何使用它
要启动支持持久性的蜘蛛,请运行如下:
jobdir = crawl / somespider-1
然后,您可以随时安全地停止蜘蛛(通过按Ctrl-C或发送信号),然后通过发出相同的命令恢复它:
jobdir = crawl / somespider-1
在批次之间保持持续状态
有时你会想要在暂停/恢复批次之间保持一些持久的蜘蛛状态。你可以使用spider.state属性,这应该是一个dict。当蜘蛛启动和停止时,有一个内置的扩展,它负责序列化,存储和加载作业目录中的属性。
这是一个使用蜘蛛状态的回调示例(为简洁起见,省略了其他蜘蛛代码):
def parse_item(self,response):
#在这里解析项目
self.state \['items\_count'\] = self.state.get('items\_count',0)+ 1
持续的痛苦
如果您想要使用Scrapy持久性支持,请记住以下几点:
Cookie过期
Cookie可能会过期。所以,如果您不快速恢复您的蜘蛛,则安排的请求可能不再工作。如果蜘蛛不依赖饼干,这不会是一个问题。
请求序列化
请求必须由pickle模块序列化,以便持久性工作,因此您应该确保您的请求是可序列化的。
最常见的问题是在不能持久化的请求回调上使用lambda函数。
所以,例如,这不行:
def some_callback(self,response):
somearg ='测试'
return scrapy.Request('http://www.example.com',callback = lambda r:self.other\_callback(r,somearg))
def other_callback(self,response,somearg):
打印“传递的参数是:”,somearg
但这将:
def some_callback(self,response):
somearg ='测试'
return scrapy.Request('http://www.example.com',callback = self.other\_callback,meta = {'somearg':somearg})
def other_callback(self,response):
somearg = response.meta \['somearg'\]
打印“传递的参数是:”,somearg
如果要记录无法序列化的请求,可以在项目的设置页面中将SCHEDULER_DEBUG设置设置为True。默认为false。