zhangll00 2020-07-05
如何实现分布式?
安装一个scrapy-redis的组件 原生的scrapy是不可以实现分布式爬虫,必须要让scrapy结合着scrapy-redis组件一起实现分布式
为什么原生的scrapy不可以实现分布式?
调度器不可以被分布式集群共享 管道不可以被分布式集群共享
scrapy-redis组件的作用可以给原生的scrapy框架提供可以被共享的管道和调度器
实现流程 创建一个工程 创建一个基于CrawlSpider的爬虫文件 修改当前的爬虫文件 1.导包:from scrapy_redis.spiders import RedisCrawlSpider 2.将 start_urls和allowed_domains注释 3.添加一个新的属性:redis_key='commonality' #这是可以被共享的调度器队列名称 4.start_url和redis_key比较类似,redis_key把起始url直接放到队列中 4.编写数据解析相关的代码 5.将当前爬虫文件的父类修改成RedisCrawlSpider 修改配置文件settings # 指定使用可以被共享的管道 ITEM_PIPELINES = { ‘scrapy_redis.pipelines.RedisPipeline‘: 400 } #指定调度器 # 增加了一个去重容器类的配置,作用使用Redis的set集合来存储请求的指纹数据 DUPEFILTER_CLASS = ‘scrapy_redis.dupefilter.RFPDupeFilter‘ # 使用scrapy-redis组件自己的调度器 SCHEDULER = "scrapy_redis.scheduler.Scheduler" # 配置调度器持久化 SCHEDULER_PERSIST = True 指定使用可以被共享的管道 指定redis服务器 REDIS_HOST = ''redis远程服务器id REDIS_PORT = 6379 redis相关操作配置 注释掉redis.window.conf里的bind 127.0.0.1注释 将yes改为no, protected-mode no 结合配置文件 启动redis 执行工程 -scrapy runspider 爬虫文件名 向调度器的队列中放入一个起始的url -调度器的队列在redis的客户端中 - lpush redis_key的值 网址