python分布式框架原理_Python爬虫【五】Scrapy分布式原理笔记

Scrapy单机架构

在这里scrapy的核心是scrapy引擎,它通过里面的一个调度器来调度一个request的队列,将request发给downloader,然后来执行request请求

但是这些request队列都是维持在本机上的,因此如果要多台主机协同爬取,需要一个request共享的机制——requests队列,在本机维护一个爬取队列,Scheduler进行调度,而要实现多态服务器共同爬取数据关键就是共享爬取队列。

单主机爬虫架构

调度器负责从队列中调度requests进行爬取,而每台主机分别维护requests队列

分布式爬虫架构

队列用什么维护?

这里一般我们通过Redis为维护,Redis,非关系型数据库,Key-Value形式存储,结构灵活。

是内存中的数据结构存储系统,处理速度快,性能好。提供队列、集合等多种存储结构,方便队列维护。

如何去重?——Redis集合

redis提供集合数据结构,在redis集合中存储每个request的指纹。

在向request队列中加入Request前先验证这个Request的指纹是否已经加入集合中。

如果已经存在则不添加到request队列中,如果不存在,则将request加入到队列并将指纹加入集合。

如何防止中断?——启动判断

在每台slave的Scrapy启动的时候都会判断当前redis request队列是否为空

如果不为空,则从队列中获取下一个request执行爬取。如果为空则重新开始爬取,第一台丛集执行爬取向队列中添加request。

如何实现分布式架构?——scrapy-redis库

scrapy-redis改写了Scrapy的调度器,队列等组件,利用它可以方便的实现Scrapy分布式架构

关于scrapy-redis的地址:https://github.com/rolando/scrapy-redis

1.新建分支distributed

2.在settings里,将SCHEDULER改为scrapy的调度器,SCHEDULER = "scrapy_redis.scheduler.Scheduler",即将scrapy中的核心调度器替换

3.添加去重的class

DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

4.引入pipeline,并更改优先级

'scrapy_redis.pipelines.RedisPipeline': 301

5.共享的爬取队列,指定Redis数据库的连接信息,直接把Redis的url拿过来

这里的user:pass表示用户名和密码,如果没有则为空就可以

REDIS_URL = 'redis://user:pass@hostname:9001'

6.设置为为True则不会清空redis里的dupefilter和requests队列

这样设置后指纹和请求队列则会一直保存在redis数据库中,默认为False,一般不进行设置

SCHEDULER_PERSIST = True

7.设置重启爬虫时是否清空爬取队列

这样每次重启爬虫都会清空指纹和请求队列,一般设置为False

SCHEDULER_FLUSH_ON_START=True

8.分布式

将上述更改后的代码拷贝的各个服务器,当然关于数据库这里可以在每个服务器上都安装数据,也可以共用一个数据,所有的服务器都要安装scrapy,scrapy_redis,pymongo

这样运行各个爬虫程序启动后,在redis数据库就可以看到如下内容,dupefilter是指纹队列,requests是请求队列

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值