根据一些业务需求,在爬虫的过程中由于一些网络或者人为的原因终止了爬虫流程,下次发起爬虫请求时,会重新开始,导致原来爬虫过的数据会重复爬取。
为了解决重复爬取,同时也是为了对爬取的数据进行一个筛选,就需要用到增量式爬虫。
增量式爬虫的意义在于,当爬虫流程中断后,下次爬虫请求会紧接着上次中断的地方进行爬取,上次爬取的数据,就不会再发送请求,提高爬虫效率。
增量式爬虫的方法:
第一种: 启用scrapy_redis
scrapy_redis分布式爬虫,在settings.py添加对应的配置,即可实现增量式爬虫。
由于redis增量式的局限性以及适用性太差,除非特定的分布式爬虫,普通的scrapy爬虫不推荐。
第二种:使用scrapy-deltafetch插件实现增量式爬虫
scrapy-deltafetch简介
scrapy-deltafetch通过Berkeley DB来记录爬虫每次爬取收集的request和item,当重复执行爬虫时只爬取新的item,实现增量去重,提高爬虫爬取性能。
Berkeley DB简介
Berkeley DB是一个嵌入式数据库,为应用程序提供可伸缩的、高性能的、有事务保护功能的数据管理服务。
主要特点:
嵌入式:直接链接到应用程序中,与应用程序运行于同样的地址空间中,因此,无论是在网络上不同计算机之间还是在同一台计算机的不同进程之间,数据库操作并不要求进程间通讯。 Berkeley DB为多种编程语言提供了API接口,其中包括C、C++、Java、Perl、Tcl、Python和PHP,所有的数据库操作都在程序库内部发生。多个进程,或者同一进程的多个线程可同时使用数据库,有如各自单独使用,底层的服务如加锁、事务日志、共享缓冲区管理、内存管理等等都由程序库透明地执行。
轻便灵活:可以运行于几乎所有的UNIX和Linux系统及其变种系统、Windows操作系统以及多种嵌入式实时操作系统之下,已经被好多高端的因特网服务器、台式机、掌上电脑、机顶盒、网络交换机以及其他一些应用领域所采用。一旦Berkeley DB被链接到应用程序中,终端用户一般根本感觉不到有一个数据库系统存在。
可伸缩:Database library本身是很精简的(少于300KB的文本空间),但它能够管理规模高达256TB的数据库。它支持高并发度,成千上万个用户可同时操纵同一个数据库
scrapy-deltafetch插件的使用与安装
scrapy-deltafetch插件的使用是基于Berkeley DB数据库的,所以必须安装好Berkeley DB数据库。
windows下Berkeley DB数据库的安装流程如下:
首先下载好对应操作系统的压缩包压缩包:
https://www.lfd.uci.edu/~gohlke/pythonlibs/#bsddb3 windows系统中python的所有第三方插件网址
找好需要的Berkeley DB压缩包,下载,解压。
将解压好的文件拉入项目中,如下图所示:
这里使用的是python3.6,windows64位的。
在命令行中进入对应的路径,pip install bsddb3-6.2.6-cp36-cp36m-win_amd64.whl
安装bsddb3
pip install bsddb3
安装scrapy-deltafetch
pip install scrapy-deltafetch
安装scrapy-magicfields
pip install scrapy-magicfields
settings.py设置
SPIDER_MIDDLEWARES = { ‘scrapy_deltafetch.DeltaFetch’: 100 }
DELTAFETCH_ENABLED = True
此时爬虫框架已经变成了增量式的爬虫,运行代码进行测试。
第一次:
第二次:
通过对比发现,第一次发送过的请求,第二次就不会再次请求,实现了请求url的去重,以及断点续爬。
数据量有限,而且不方便停止,所以断点续爬,有兴趣的童鞋可以自己检测。
重置DeltaFetch
如果想重置某个页面的爬取数据缓存,执行命令:
scrapy crawl spider_name -a deltafetch_reset=1