目录redis
1.scrapy框架是否能够本身实现分布式?服务器
- 不能够。缘由有二。 其一:由于多台机器上部署的scrapy会各自拥有各自的调度器,这样就使得多台机器没法分配start_urls列表中的url。(多台机器没法共享同一个调度器) 其二:多台机器爬取到的数据没法经过同一个管道对数据进行统一的数据持久出存储。(多台机器没法共享同一个管道)
2.基于scrapy-redis组件的分布式爬虫框架
- scrapy-redis组件中为咱们封装好了能够被多台机器共享的调度器和管道,咱们能够直接使用并实现分布式数据爬取。 - 实现方式: 1.基于该组件的RedisSpider类 2.基于该组件的RedisCrawlSpider类
3.分布式实现流程:上述两种不一样方式的分布式实现流程是统一的scrapy
3.1 下载scrapy-redis组件:pip install scrapy-redis分布式
3.2 redis配置文件的配置:ide
- 注释该行:bind 127.0.0.1,表示能够让其余ip访问redis - 将yes该为no:protected-mode no,表示能够让其余ip操做redis
3.3 修改爬虫文件中的相关代码:url
- 将爬虫类的父类修改为基于RedisSpider或者RedisCrawlSpider。注意:若是原始爬虫文件是基于Spider的,则应该将父类修改为RedisSpider,若是原始爬虫文件是基于CrawlSpider的,则应该将其父类修改为RedisCrawlSpider。 - 注释或者删除start_urls列表,切加入redis_key属性,属性值为scrpy-redis组件中调度器队列的名称
3.4 在配置文件中进行相关配置,开启使用scrapy-redis组件中封装好的管道code
ITEM_PIPELINES = { 'scrapy_redis.pipelines.RedisPipeline': 400 }
3.5 在配置文件中进行相关配置,开启使用scrapy-redis组件中封装好的调度器server
# 使用scrapy-redis组件的去重队列 DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" # 使用scrapy-redis组件本身的调度器 SCHEDULER = "scrapy_redis.scheduler.Scheduler" # 是否容许暂停 SCHEDULER_PERSIST = True
3.6 在配置文件中进行爬虫程序连接redis的配置:队列
REDIS_HOST = 'redis服务的ip地址' REDIS_PORT = 6379 REDIS_ENCODING = ‘utf-8’ REDIS_PARAMS = {‘password’:’123456’}
3.7 开启redis服务器:redis-server 配置文件
3.8 开启redis客户端:redis-cli
3.9 运行爬虫文件:scrapy runspider SpiderFile
3.10 向调度器队列中扔入一个起始url(在redis客户端中操做):lpush redis_key属性值 起始url