我们在使用 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}。
【Scrapy爬虫中断后无法恢原本的爬取队列的解决方法】有一个内置的扩展,负责在蜘蛛启动和停止时从作业目录中序列化,存储和加载该属性。
下面是一个使用爬虫状态的回调,如下:
def parse_item(self, response):
self.state['items_count'] = self.state.get('items_count', 0) + 1
推荐阅读
- 爬虫|若想拿下爬虫大单,怎能不会逆向爬虫,价值过万的逆向爬虫教程限时分享
- python|尚硅谷python爬虫(二)-解析方法
- web挖洞|HACK学习黑帽子Python--漏洞检测脚本快速编写
- Pyecharts|Pyecharts 猎聘招聘数据可视化
- Python爬虫笔记|Python爬虫学习笔记_DAY_17_Python爬虫之使用cookie绕过登录的介绍【Python爬虫】
- Python爬虫笔记|Python爬虫学习笔记_DAY_19_Python爬虫之代理ip与代理池的使用介绍【Python爬虫】
- Python爬虫笔记|Python爬虫学习笔记_DAY_18_Python爬虫之handler处理器的使用【Python爬虫】
- python|用 Python 写一副春联&福字,把最好的祝福,送给重要的人
- 爬虫|淘宝商品数据爬取
- 爬虫学习历程小记