分布式爬虫部署 基于scrapy和scrapy-redis

如何实现分布式?

安装一个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的值 网址

相关推荐