分布式爬虫

Posted bigox

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分布式爬虫相关的知识,希望对你有一定的参考价值。

分布式爬虫

  • 什么是分布式爬虫

    • 基于多台电脑组件一个分布式机群,然后让每一台电脑执行同一组程序,让后让他们对同一个网站的数据进行分布式爬取
  • 为什么使用分布式爬虫

    • 提示爬取数据效率
  • 如何实现分布式爬虫

    • 基于scrapy + redis 的形式实现分布式
      • 原生的scrapy框架不能实现分布式,原因:
        1. 调度器无法被分布式机群共享
        2. 管道无法数据共享
      • scrapy框架和scrapy-redis 组件实现的分布式
      • scrapy-redis 组件作用:
        1. 提供可以被共享的调度器和管道

环境安装

  • redis
  • pip install scrapy-redis

编码流程

  1. 创建一个工程

  2. 创建一个爬虫文件:基于CrawlScrapy

    • 修改当前的爬虫文件
      • 导包:from scrapy_redis.spiders import RedisCrawlSpider
      • 将当前爬虫类的父类修改成RedisCrawlSpider
      • 将start_urls替换成redis_key = ‘xxx’ #表示的是可被共享调度器中队列的名称
      • 编写爬虫类爬取数据的操作
  3. 对settings进行配置:

    • 指定管道:

      # 开启可以被共享的管道
      ITEM_PIPELINES = 
          '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
    • 指定redis的服务

      REDIS_HOST = 'redis服务的ip地址'
      REDIS_PORT = 6379
  4. redis的配置文件进行配置:redis.windows.conf

    -取消ip绑定:#bind 127.0.0.1
    -取消安全模式:protected-mode no
    • 携带配置文件启动redis服务
      • ./redis-server redis.windows.conf
    • 启动redis的客户端
      • redis-cli
  5. 执行当前的工程:

    进入到爬虫文件对应的目录中:scrapy runspider xxx.py
  6. 向调度器队列中仍入一个起始的url:

    • 队列在哪里呢?答:队列在redis中
      • lpush fbsQueue www.xxx.com

以上是关于分布式爬虫的主要内容,如果未能解决你的问题,请参考以下文章

Python3爬虫学习分布式爬虫第一步--Redis分布式爬虫初体验

第三百五十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy分布式爬虫要点

分布式爬虫架构设计与实现

python网络爬虫——分布式爬虫

分布式爬虫

Python3爬虫爬取美女图新姿势--Redis分布式爬虫初体验