"""
分布式原理:统一的可访问可共享的requests队列
分布式架构:主机Master用来维护爬取队列(redis),从机slave1,slave2...负责数据抓取、处理、存储
队列维护 :Redis队列
# 非关系型数据库,Key-Value形式存储,结构灵活
# 内存中的数据结构存储系统,处理速度快,性能好
# 提供队列、集合等多种存储结构,方便队列维护
去重:requests队列不重复的,使用Redis集合
# Redis提供集合数据结构,在Redis集合中存储每个Request的指纹(算法)
# 在向Request对立中加入新的Request前首先验证这个Request的指纹是否已经加入到集合中
# 如果已经存在,则不添加Request到队列,如果不存在,则添加Request到队列并将指纹加入集合
防止中断:启动判断
# 在每台从机slave的scrapy启动时都会首先判断当前Redis Request队列是否为空
# 如果不为空,则从队列中取得下一个Request执行爬取
# 如果为空,则重新开始爬取,第一台从机执行爬取想队列中添加Request
实现架构:scrapy-redis库
# scrapy-redis库实现了如上架构,改写了scrapy的调度器、队列等组件,
# 利用它可以方便地实现scrapy分布式架构
修改范围:settings.py
# https://github.com/rmax/scrapy-redis
# 参考github给的文档,修改本地爬虫项目的settings文件
# Enables scheduling storing requests queue in redis.
# SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# Ensure all spiders share same duplicates filter through redis.
# DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# Specify the full Redis URL for connecting (optional).
# If set, this takes precedence over the REDIS_HOST and REDIS_PORT settings.
# REDIS_URL = 'redis://user:pass@hostname:6379' # hostname服务器IP地址
# Don't cleanup redis queues, allows to pause/resume crawls.
# SCHEDULER_PERSIST = True # true是指纹和request队列不会被清空,默认为false
# SCHEDULER_FLUSH_ON_START = False
# true时,重新启动爬虫时,会自动清空指纹和Request队列,相当于从新开始爬取,默认false
# 配置Redis的url
# 把项目放到一个服务器上面
# 当本地项目启动的时候,request和request指纹存到了Redis数据库
# 当启动另一台时,会自动读取Request队列里面的数据
# 当数据存储的时候,可以使用MongoDB,这样数据会分别存储在当前主机上面,前提是没有用pipelines(Redis管道)
"""
# 部署多台主机 scrapyd
# 通过API远程部署
记忆碎片之python爬虫scrapy-redis分布式架构
猜你喜欢
转载自blog.csdn.net/Python_DJ/article/details/105366113
今日推荐
周排行