首先,要了解两者的区别,就要清楚scrapy-redis是如何产生的,有需求才会有发展,社会在日新月异的飞速发展,大量相似网页框架的飞速产生,人们已经不满足于当前爬取网页的速度,因此有了分布式爬虫,让其可以并行的爬取更多但又不尽相同的网页,这样大大节省了之前同步完成页面爬取所浪费的时间,同步与异步的差距不是一点点的,所以scrapy-redis更加适应于当前形势。好了,步入正轨。
两者的主要区别就是scrapy-redis在scrapy的基础上增加了redis数据库,同时呢,由于这个redis数据库的存在,就导致了几大新增组件应运而生,---可以实现分布式爬虫,---简单url去重,---持续性爬取,增量式爬虫,---以及遵守Rule规则可以实现深度爬虫等等。下面具体阐述在redis加入之后造成的具体模块改变。
一、Scheduler(调度器模块)
Scheduler 负责对新的 request 迕行入列和出列的操作。 Scrapy 本身丌支持爬虫分布式,多个 spider 丌能共享待爬取队列 Scrapy queue, scrapy-redis 把 Scrapy queue 换成 redis 数据库,用同一个 redis-server 存放要爬 取的 request,便能让多个 spider 去同一个数据库里读取。
二、Duplication Filter(redis set去重)
Duplication Filter 利用了 redis 的 set 不重复的特性实现去重 scrapy-redis 调度器从引擎接受 request,将 request 的指纹存⼊redis 的 set 检查是否重 复,并将丌重复的 request push 写⼊redis 的 request queue。引擎请求 request(Spider 发出的)时,调度器从 redis 的 request queue 队列⾥里根据优 先级 pop 出⼀个 request 迒回给引擎,引擎将此 request 发给 spider 处理。
三、Item Pipeline(管道模块)
引擎将爬取到的 Item 传给 Item Pipeline,scrapy-redis 的 Item Pipeline 将爬取到的 Item 存⼊redis 的 items queue。
四、Base Spider(爬虫模块)
不再使用 scrapy 原有的 Spider 类,重写的 RedisSpider 继承了 Spider 和 RedisMixin 返 两个类,RedisMixin 是用来从 redis 读取 url 的类。 当我们生成一个 Spider 继承 RedisSpider 时,调用 setup_redis 函数,返个函数会去连接 redis 数据库,然后会设置 signals(信号): 一 个 是 当 spider 空 闲 时 候 的 signal , 会 调 用 spider_idle 函 数 , 返 个 函 数 调 用 schedule_next_request 函数,保证 spider 是一直活着的状态,并且抛出DontCloseSpider 异常。 一个是当抓到一个 item 时的 signal,会调用 item_scraped 函数,返个函数会调用 schedule_next_request 函数,获取下一个 request。