scrapy分布式爬虫及scrapy_redis
分布式原理
在学习完scrapy基本知识后,大多数爬虫应用了scrapy框架的异步加多线程后,爬取会有显著提升。但还是局限于一台主机运行,爬取的效率始终有限,因此学习分布式爬虫就是将多台主机组合起来,共同完成一个爬取任务,可以进一步提升效率。
=
分布式实现原理:
首先先回顾一个scrapy的架构:
scrapy会将生成的request放在队列中,这个队列是有deque实现的本地爬取队列queue。放入队列后,调度器scheduler才会调度里面的request,将request交给downloader执行。
简单的调度架构如下图:
而分布式爬虫的简单架构如图:
从图中可以看出调度器scheduler可以扩展多个,因此download也可以扩展多个,而爬取队列queue始终为一个。这就是共享爬取队列。这就可以做到一个scheduler从队列中调度某个request时,其他的scheduler不会重复调度这个request,就可以做到多个scheduler同时爬取,这就是分布式爬虫的基本雌性。
理解了这个大概原理就可以进行下一步scrapy_redis和分布式的结合
=
=
scrapy——redis实现分布式
scrapy_redis是scrapy框架的一个组件,因为scrapy并不具备分布式的实现,因此scrapy_redis重写了一些scrapy框架里的类,让他能够支持分布式爬虫的创建。
scrapy_redis和scrapy示意图:
scrapy_redis的核心就是redis数据库,因为scrapy_redis改写了scrapy中的queue队列,用redis数据库代替了queue,让本不能共享的queue变成了可以共享的数据库redis
因此,scrapy_redis将每一个request存入redis数据库中,这样就可以多个spider同时访问一个redis,进行分布式爬取。
=
=