(三)分布式爬虫(1)——scrapy-redis简介
scrapy-redis并不算是一套框架,是scrapy框架的部分功能通过redis进行实现,是一种组件。
scrapy-redis.png
首先分析一下这张图,和scrapy的流程图很像,
Scrapy运行流程:1.Spider把需要爬取的页面URL给Engine。
2.Engine把URL放入Scheduler中,给Scheduler处理。
3.Scheduler把请求放入redis中,进行指纹比对,保证url不重复。如果有指纹,则url被舍弃,反之进队列。
4.Scheduler从redis的请求队列取出url。
5.Scheduler把取出的url请求传入Engine中。
5.Engine把request传入Downloader中,让它发送请求到目标网站。
5.Downloader把从服务器上接收到的response传入Engine中。
6.Engine把接收到的response传入Spider中,供其提取数据。
7.Spider把提取到的数据和下一条待爬取的URL传入Engine中。
8.Engine把接收到的数据传递给Item Pipelines、把下一条待爬取的URL传入Scheduler中进行处理。
9.Item Pipeline把需要入库的数据,统一存储到redis数据库中。
10.Item Process从redis数据库中取数据,然后再进行数据的持久化操作。这个流程一直循环运行,直到redis中没有任何一条待爬取的URL,整个程序会停止。
上述过程中,redis需要三个库:
第一个是url库,存放待爬取的url。
第二个是指纹库,用来进行url指纹比对,保证url唯一性。
第三个是item数据库,以便进行数据统一存储。
scrapy-redis中有四个重要的组件:
1.Scheduler:由于scrapy本身的scheduler与scrapy queue不支持分布式,需要通过redis数据库进行统一的url存储,所以需要使用scrapy-redis重写的scheduler。
2.Duplication Filter:scrapy通过集合的方式进行url去重,scrapy-redis是用Duplication Filter组件实现的,通过redis的set的不重复性实现了url去重。
3.Item Pipeline:scrapy的pipeline一般都是做最后的数据处理实现数据持久化,scrapy-redis中多了一步操作,首先把数据统一存放到redis中,然后再把数据统一进行持久化操作。
4.Base Spider:scrapy-redis不再使用原有的Spider类,重写的RedisSpider类继承了Spider和RedisMixin两个类,实现了爬虫和从redis读数据的功能。