爬虫学习笔记15-scrapy-redis组件

1、了解scrapy-redis分布式管理

(1)概念: scrapy_redis是scrapy框架的基于redis的分布式组件【不同的节点(服务器,ip不同)共同完成一个任务】
(2)作用: ①断点续爬、②分布式快速抓取
(3)原理:

  • 在scrapy_redis中,所有的待抓取的request对象和去重的request对象指纹都存在所有的服务器公用的redis中
  • 所有的服务器中的scrapy进程公用同一个redis中的request对象的队列
  • 所有的request对象存入redis前,都会通过该redis中的request指纹集合进行判断,之前是否已经存入过
  • 在默认情况下所有的数据会保存在redis中

(4)步骤:
爬虫学习笔记15-scrapy-redis组件_第1张图片

步骤:
①每个服务器从公用redis中抢占起始url请求
②抢到起始url的服务器将请求交给调度器
③调度器再将起始url请求放进任务队列中,各个服务器的调度器从任务队列中抢占起始url请求
④抢到的调度器将该起始url请求交给下载器,返回响应给爬虫

  • 解析出新的url再交给调度器,调度器将新解析出来的url放到过滤集合中对比过滤,之前没有放进过集合的将被放到任务队列,继续重复③和④
  • 解析出来的数据统一交给公用redis中的数据队列

2、scrapy_redis实现断点续爬

(1)安装scrapy_redis模块

pip3 install scrapy_redis -i https://pypi.douban.com/simple/

(2)下载demo代码:
clone github scrapy-redis源码文件 :

git clone https://github.com/rolando/scrapy-redis.git

(3)打开example-project爬虫文件dmoz
①可以看到这个爬虫文件使用crawlspider模块
②修改允许域名和起始URL

allowed_domains = ['dmoztools.net']
start_urls = ['http://www.dmoztools.net/']

(4)添加redis数据库配置

REDIS_URL = "redis://192.168.220.151:6379"

(5)开启爬虫:scrapy crawl dmoz
(6)查询数据库: 可以利用redis可视化软件RedisDesktopManager查看
爬虫学习笔记15-scrapy-redis组件_第2张图片
(7)中止进程后再次运行dmoz爬虫,程序在前一次的基础之上继续往后执行
(8)原理分析
①分析setting文件的配置信息
爬虫学习笔记15-scrapy-redis组件_第3张图片
②Scrapy_redis之RedisPipeline管道类:进行数据的保存,存入了redis中
爬虫学习笔记15-scrapy-redis组件_第4张图片
③ Scrapy_redis之RFPDupeFilter去重类:实现了对request对象的加密
爬虫学习笔记15-scrapy-redis组件_第5张图片
④Scrapy_redis之Scheduler调度器类:决定什么时候把request对象加入带抓取的队列,同时把请求过的request对象过滤掉
爬虫学习笔记15-scrapy-redis组件_第6张图片

3、scrapy_redis实现分布式爬虫

(1)打开example-project爬虫文件myspider_redis.py
区别于原来的爬虫类:
①将起始url放到了redis_key
②在__init__方法中动态获取可允许的域名
爬虫学习笔记15-scrapy-redis组件_第7张图片
(2)settings文件的关键配置

DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST = True

ITEM_PIPELINES = {
     
    'example.pipelines.ExamplePipeline': 300,
    'scrapy_redis.pipelines.RedisPipeline': 400,
}
REDIS_URL = "redis://127.0.0.1:6379"

(3)运行
步骤①:在每个节点正确的目录下执行scrapy crawl 爬虫名,使该节点的scrapy_redis爬虫程序就位
步骤②:在共用的redis中 lpush redis_key ‘start_url’,使全部节点真正的开始运行
(4)编写流程
1)先用普通爬虫的方法编写
2)改造成分布式爬虫
①改造爬虫文件
导入scrapy_redis中的分布式爬虫类——继承类——注销start_url和allow_domains——设置redis_key注册start_url——设置__init__方法获取allow_domains
②改造配置文件

DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST = True

ITEM_PIPELINES = {
     
    'example.pipelines.ExamplePipeline': 300,
    'scrapy_redis.pipelines.RedisPipeline': 400,
}
REDIS_URL = "redis://127.0.0.1:6379"

你可能感兴趣的:(爬虫学习,python,redis)