我们在使用 Scrapy框架进行大规模爬取网站数据时,总可能会遇到各种各样的问题导致我们不得不中断已经启动的爬虫。这时我们就需要考虑有没有一种方法可以恢复我们中断前的爬取队列,以至于能让爬虫的爬取具有连续性。
一、原理
Scrapy进行爬取的 Request 队列是存放在内存中的,在爬虫程序运行中断后,这个队列所占用的空间就被马上释放了,从而该队列就将不会存在了。 因此一旦爬虫运行中断了,当再次运行爬虫时就是相当于一个新的爬取队列进行爬虫爬取。 我们要是想要解决爬虫中断后能够继续它中断前的状态进行爬取,可以把爬虫队列里面的 Request 请求进行保存,就能够通过获取已经保存的数据来获得中断前进行爬取的队列。
二、解决方法
(1)我们只需要在启动爬虫时指定一个爬取队列的存储路径即可,使用如下命令来实现:
scrapy crawl somespider -s JOBDIR=crawls/somespider-1
然后,通过按Ctrl+C中断程序运行,然后通过发出相同如下的命令即可进行恢复:
scrapy crawl somespider -s JOBDIR=crawls/somespider-1
注意:somespider要替换成你自己的爬虫名称。
(2)在获取爬虫批次,保留持久的爬虫状态
如果我们还想要在暂停/恢复批次之间保留持久的爬虫状态,可以使用爬虫的state属性,该属性是一个字典结构,
如:{'items_count': 4}。
有一个内置的扩展,负责在蜘蛛启动和停止时从作业目录中序列化,存储和加载该属性。
下面是一个使用爬虫状态的回调,如下:
def parse_item(self, response):
self.state['items_count'] = self.state.get('items_count', 0) + 1