Scrapy是一个比较好用的Python爬虫框架,你只需要编写几个组件就可以实现网页数据的爬取。但是当我们要爬取的页面非常多的时候,单个主机的处理能力就不能满足我们的需求了(无论是处理速度还是网络请求的并发数),这时候分布式爬虫的优势就显现出来。
一、分布式爬虫的原理
下面是单机版本的Scrapy框架:
Scrapy单机爬虫中只有一个本地爬取队列Queue,如果新的Request生成,就放到队列里面,随后Request被Scheduler调度。之后Request交给DownLoader执行爬取,简单的调度框架如下图所示:
如果两个Scheduler同时从消息队里里面取Request,每个Scheduler都有对应的DownLoader,那么在带宽足够、正常爬取切不考虑队列压力的情况下,爬虫效率就会翻倍。
这样,Sheduler可以扩展为多个,DownLoader也是多个,而爬取队列维持为一个,也就是所谓的共享爬虫队列。这样才能保证Scheduler从队列里面调度某个Request之后,其他的Scheduler不会重复调用该Request,就可以保证多个Scheduler同步爬取。
Scheduler进行调度,而要实现多台服务器共同爬取数据关键就是共享爬取队列。
我们需要做的是在多台主机上同时运行爬虫任务协同爬取,而协同爬取的的前提就是共享爬虫队列。这样各台主机不需要各自维护排重队列,各台主机还是有各自的Sheduler和Downloader,所以调度和下载功能在各自的主机上完成。
二、维护爬虫队列
这里一般我们通过Redis为维护,Redis,非关系型数据库,Key-Value形式存储,结构灵活;并且redis是内存中的数据结构存储系统,处理速度快;提供队列集合等多种存储结构,方便队列维护。
-
列表有lpush()、rpush()、lpop()、rpop()方法,可以实现先进先出式爬取队列,也可以实现先进后出堆栈式爬取队列;
-
集合的元素是