scrapy_redis分布式组件策略图解

scrapy_redis的流程
在这里插入图片描述

  • scrapy_redis分布式组件:修改了scrapy在内存中保存数据的代码,将数据保存在redis数据库中,让所有爬虫端都可以访问redis数据库,读取请求队列。

  • redis数据库里存储的数据:1. 请求对象队列;2. 请求指纹库(去重特征);3.提取的item数据

  • 分布式、断点续爬、持久化去重
    — 将数据保存在redis数据库里,程序中断后,数据不会丢失,再次启动会继续之前的请求队列爬取。

scrapy—redis的分布式策略:

  1. Master端(一台)做为redis数据库端,只负责存储请求队列、指纹集合和item数据;
    Slave端(多台)只负责发送请求、解析数据,以及提交数据给Master。
  2. 当程序启动后,Master端会获取第一批需要发送的请求(start_urls),并保存在 请求队列中。
  3. 只要 Slave 处于空闲状态,会尝试读取 Master 端的 请求队列,并获取一批请求(获取的个数取决于scrapy并发量),再发送请求解析响应,并将提取的数据提交给 Master
  4. 如果提交的 item数据,则直接保存在Master的Item数据队列中;
    如果提交的 Request 请求对象,则Master会 生成请求的指纹,并通过指纹集合判重:
    — 如果指纹有重复,表示该请求之前发送过,则不会保存请求(丢弃);
    — 如果指纹没有重复,表示该请求第一次提交,则将指纹保存在指纹集合中,再把请求保存在请求队列中,等待发送。
  5. 每当Slave端从中请求队列获取一个请求,则Master会从请求队列中删除一个请求,直到所有请求全部发送完毕。
    但是请求指纹不会被删除,会一直保留(持久化去重)。sha1() 指纹做为请求的唯一特征值。

scrapy_redis 的settings信息

    # 1. 将scrapy的去重类 修改为使用scrapy_redis的去重类,在redis数据库里实现去重
    DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
    # 2. 使用scrapy_redis提供的调度去类,在redis处理请求
    SCHEDULER = "scrapy_redis.scheduler.Scheduler"
    # 3. 表示程序中断后,不清除数据库的数据
    SCHEDULER_PERSIST = True

    ITEM_PIPELINES = {
        # 4. 使用scrapy_redis提供的管道类,将item数据直接保存在redis数据库里
        'scrapy_redis.pipelines.RedisPipeline': 400,
    }

    # 5. 指定slave端链接的Redis数据库位置
    REDIS_HOST = "127.0.0.1"
    REDIS_PORT = 6379

猜你喜欢

转载自blog.csdn.net/weixin_44857400/article/details/105741320
今日推荐