zoukankan      html  css  js  c++  java
  • 分布式爬虫

     - 概念:使用多台机器组成一个分布式的机群,在机群中运行同一组程序,进行联合数据的爬取。
        - 原生的scrapy是不可以实现分布式:
            - 原生的scrapy中的调度器不可以被共享
            - 原生的scrapy的管道不可以被共享
        - 如果实现分布式就必须使用scrapy-redis(模块)
            - 可以给原生的scrapy提供可以被共享的管道和调度器
            - pip install scrapy_redis
        - 搭建流程
            - 创建工程
            - 爬虫文件
            - 修改爬虫文件:
                - 导报:from scrapy_redis.spiders import RedisCrawlSpider
                - 将当前爬虫类的父类进行修改RedisCrawlSpider
                - allowed_domains,start_url删除,添加一个新属性redis_key(调度器队列的名称)
                - 数据解析,将解析的数据封装到item中然后向管道提交
            - 配置文件的编写:
                - 指定管道:
                         

    ITEM_PIPELINES = {
       # 'fbsPro.pipelines.FbsproPipeline': 300,
        'scrapy_redis.pipelines.RedisPipeline': 400
    }


     - 指定调度器:

    # 增加了一个去重容器类的配置, 作用使用Redis的set集合来存储请求的指纹数据, 从而实现请求去重的持久化
    DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
    # 使用scrapy-redis组件自己的调度器
    SCHEDULER = "scrapy_redis.scheduler.Scheduler"
    # 配置调度器是否要持久化, 也就是当爬虫结束了, 要不要清空Redis中请求队列和去重指纹的set。如果是True, 就表示要持久化存储, 就不清空数据, 否则清空数据
    SCHEDULER_PERSIST = True

    修改原生scrapy的异步数量(太多导致只要第一台抢到,其他就抢不到了)

    CONCURRENT_REQUESTS = 3   # 一般小于5


      - 指定具体的redis:
                   

    REDIS_HOST = 'redis服务的ip地址'
    REDIS_PORT = 6379
    


     - 开启redis服务,和客户端:(服务器启动的时候,后面跟修改好的配置文件)
             - 对redis的配置文件进行适当的配置:
                   - #bind 127.0.0.1
                   - protected-mode no
       - 开启
       - 启动程序:scrapy runspider xxx.py

  • 相关阅读:
    本地安装了flash,前台浏览器还显示需要安装flash?是因为版本需要对应
    关于jsp:include 动态引入的值传递问题(数据共享问题)
    java异常
    理解定义类
    泛型
    SSM配置
    markdown基本语法
    xadmin下设置“use_bootswatch = True”无效的解决办法
    django.db.utils.DataError: (1406, "Data too long for column 'gender' at row 1")
    【转】pycharm使用中的一些快捷键
  • 原文地址:https://www.cnblogs.com/Wj-Li/p/10864892.html
Copyright © 2011-2022 走看看