欢迎来到赛兔子家园

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中查看

posted on 2021-07-28 21:05  赛兔子  阅读(132)  评论(0编辑  收藏  举报

导航