基于scrapy-redis的分布式爬虫

Posted 中杯可乐不加冰

tags:

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

1、scrapy框架是否可以自己实现分布式?

  答:不可以。原因有二:

  其一:因为多台机器上部署的scrapy会各自拥有各自的调度器,这样就使得多台机器无法分配start_urls列表中的url。(多台机器无法共享同一个调度器)

  其二:多台机器爬取到的数据无法通过同一个管道对数据进行统一的数据持久出存储。(多台机器无法共享同一个管道)

2、基于scrapy-redis组件的分布式爬虫

 - scrapy-redis组件中为我们封装好了可以被多台机器共享的调度器和管道,我们可以直接使用并实现分布式数据爬取。

- 实现方式:

            1.基于该组件的RedisSpider类

            2.基于该组件的RedisCrawlSpider类

3、分布式实现流程:上述两种不同方式的分布式实现流程是统一的

1.环境安装:pip install scrapy-redis
2.创建工程
   -scrapy startproject proName
3.创建爬虫文件:RedisCrawlSpider  RedisSpider
    - scrapy genspider -t crawl xxx www.xxx.com
4.对爬虫文件中的相关属性进行修改:
    - 导入:from scrapy_redis.spiders import RedisCrawlSpider
    - 将当前爬虫文件的父类设置成RedisCrawlSpider
    - 将起始url列表替换成redis_key = xxx(调度器队列的名称)
5.在配置文件中进行配置:
    - 使用组件中封装好的可以被共享的管道类:
        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

6.配置redis数据库的配置文件
     - 取消保护模式:protected-mode no   表示可以让其他ip操作redis
     - 注释bind绑定: #bind 127.0.0.1  表示可以让其他ip访问redis

7.启动redis(指定配置文件启动)

8.执行分布式程序
    scrapy runspider xxx.py

9.向调度器队列中仍入一个起始url
    在redis-cli中执行:lpush 队列名 起始url

 

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

基于scrapy-redis两种形式的分布式爬虫

分布式爬虫部署 基于scrapy和scrapy-redis

基于 Scrapy-redis 的分布式爬虫详细设计

基于Python使用scrapy-redis框架实现分布式爬虫 注

爬虫学习 17.基于scrapy-redis两种形式的分布式爬虫

基于scrapy-redis的分布式爬虫