scrapy分布式
分布式
原生的scrapy框架无法实现分布式,需要通过:scrapy+redis(scrapy结合着scrapy-redis组件)来实现。
什么是分布式?
需要搭建一个分布式的集群,让集群中的每一台电脑执行同一组程序,最后对同一组资源进行联合且分布的数据爬取。
为什么原生的scrapy框架无法实现分布式?
- 调度器无法被分布式集群共享
- 管道无法被分布式集群共享
scrapy-redis组件
作用:可以给原生的scrapy框架提供共享的管道和调度器
安装:pip install scrapy-redis
实现流程:
1、修改爬虫文件
1.1 导包:from scrapy_redis.spiders import RedisCrawlSpider
1.2 修改当前爬虫类的父类为:class FbsSpider(RedisCrawlSpider)
1.3 将start_url替换成redis_key的属性,属性值为任意字符串 redis_key = "xxx":表示的是可以被共享的调度器队列名称,最终是需要将起诉的url手动放置到redis_key表示的队列中。
1.4 将数据解析的补充完整即可
2、对settings.py进行配置
指定调度器
# 添加了一个去重容器类的配置,作用使用Redis的set集合来存储请求的指纹数据,从而实现请求去重的持久化 DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" # 使用scrapy-redis组件自己的调度器 SCHEDULER = "scrapy_redis.scheduler.Scheduler" # 配置调度器是否要持久化,也就是当爬虫结束了,要不要情况Redis中请求队列和去重指纹的set。 # 如果是True,就表示要持久化存储,就不清空数据,否则清空数据 SCHEDULER_PERSIST = True
指定管道
# 指定管道 ITEM_PIPELINES = { 'scrapy_redis.pipelines.RedisPipeline': 400, }
特点:该种管道只可以将item写入redis中。
指定redis
REDIS_HOST = 'redis服务的ip地址' REDIS_PORT = 6379
REDIS_ENCODING = 'utf-8'
REDIS_PARAMS = {"password": "123456"}
3、配置redis的配置文件(redis.window.conf)
解除默认绑定
关闭保护模式
56行注释,不注释表示只能被本机访问# bind 127.0.0.1 75行 protected-mode no 将yes修改no关闭保护模式,yes是只允许远程读数据,不允许写数据。no可读可写
4、启动redis服务和客户端
5、执行scrapy工程(不要在配置文件中加入LOG_LEVEL)
程序会停留在listening位置:等待起始的url加入
6、向redis_key表示的队列中添加起始url :
需要在redis的客户端执行如下指令(调度器队列是存储在redis中)
127.0.0.1:6379> lpush sunQueue https://wz.sun0769.com/political/index/politicsNewest?id=1&page=1
redis中查看