scrapy-redis 分布式爬虫原理 及 与scrapy不同

Scrapy 是一个通用的爬虫框架,但是不支持分布式
Scrapy-redis是为了更方便地实现Scrapy分布式爬取,而提供了一些以redis为基础的组件(仅有组件)

scrapy任务调度是基于文件系统,这样只能在单机执行crawl。

scrapy-redis将待抓取request请求信息和数据items信息的存取放到redis queue里,使多台服务器可以**同时执行crawl和items process**,大大提升了数据爬取和处理的效率。

分布式采用主从结构设置一个Master服务器和多个Slave服务器,Master端管理Redis数据库和分发式下载任务,Slave部署Scrapy爬虫提取网页和解析提取数据,最后解析的数据存储在同一个MongoDb数据库中。

实现原理
通过scrapy写了一个工程之后,是不能同时让两个电脑共同爬取
为什么不能呢?
因为你的scrapy运行在你的电脑的内存中,你的调度器运行在你的内存中。我的调度器运行在我的内存中
将**调度器**放到公共的地方,redis中,都放到我的redis中

实现结果:
我的windows:是服务端(redis放的地方,调度器),也是客户端
大家的windows:都是客户端

如何实现?
基于scrapy的组件,scrapy-redis组件
(1)调度器放到了redis中
(2)实现了一个管道,保存到redis中
(3)重写了两个类Spider(RedisSpider),CrawlSpider(RedisCrawlSpider)

pip install scrapy-redis
在这里插入图片描述
在这里插入图片描述
scrapy-redis调度器通过redis的set不重复的特性,巧妙的实现了Duplication Filter去重(DupeFilter set存放爬取过的request)。
Spider新生成的request,将request的指纹到redis的DupeFilter set检查是否重复,并将不重复的request push写入redis的request队列。
调度器每次从redis的request队列里根据优先级pop出一个request, 将此request发给spider处理。
将Spider爬取到的Item给scrapy-redis的Item Pipeline,将爬取到的Item存入redis的items队列。可以很方便的从items队列中提取item,从而实现items processes 集群
总结
scrapy-redis巧妙的利用redis 实现 request queueitems queue,利用redis的set实现request的去重,将scrapy从单台机器扩展多台机器,实现较大规模的爬虫集群
参考文章
https://piaosanlang.gitbooks.io/spiders/07day/section7.3.html

猜你喜欢

转载自blog.csdn.net/weixin_42540340/article/details/105099541