概念:使用多台机器组成一个分布式的机群,在机群中运行同一组程序,进行联合数据的爬取。
原生的scrapy是不可以实现分布式:
原生的scrapy中的调度器不可以被共享
原生的scrapy的管道不可以被共享
实现分布式就必须使用scrapy-redis(模块)
可以给原生的scrapy提供可以被共享的管道和调度器
pip install scrapy_redis
搭建流程:
- 创建工程
- 爬虫文件
- 修改爬虫文件:
导包:from scrapy_redis.spiders import RedisCrawlSpider将当前爬虫类的父类进行修改RedisCrawlSpider
allowed_domains,start_url删除,添加一个新属性redis_key(调度器队列的名称)
数据解析,将解析的数据封装到item中然后向管道提交
- 配置文件的编写:
指定管道: ITEM_PIPELINES = { 'scrapy_redis.pipelines.RedisPipeline': 400 }指定调度器:
#增加了一个去重容器类的配置, 作用使用Redis的set集合来存储请求的指纹数据, 从而实现请求去重的持久化
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"#使用scrapy-redis组件自己的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"#配置调度器是否要持久化, 也就是当爬虫结束了, 要不要清空Redis中请求队列和去重指纹的set。如果是True, 就表示要持久化存储, 就不清空数据, 否则清空数据
SCHEDULER_PERSIST = True
- 指定具体的redis:
REDIS_HOST = 'redis服务的ip地址'REDIS_PORT = 6379
REDIS_ENCODING = ‘utf-8’
REDIS_PARAMS = {‘password’:’123456’}
开启redis服务(携带redis的配置文件:redis-server ./redis.windows.conf),和客户端:
对redis的配置文件进行适当的配置:
#bind 127.0.0.1 protected-mode no
开启
启动程序:scrapy runspider xxx.py
向调度器队列中扔入一个起始的url(redis的客户端):lpush xxx www.xxx.com
xxx表示的就是redis_key的属性值