九、分布式


返回

9.1 scrapy

  • 调度器不可以被分布式集群共享
  • 管道不可以被分布式集群共享

9.1 scrapy-redis

  • 可以给原生的scrapy框架提供可以被共享的管道和调度器

9.2 基本使用方法

  • 创建一个项目

    scrapy startproject '项目名'
    
  • 创建一个CrawlSpider爬虫文件

    cd '项目名'
    scrapy genspider -t crawl '爬虫文件名' www.xxx.com
    
  • 爬虫文件.py

    from scrapy.linkextractors import LinkExtractor
    from scrapy.spiders import CrawlSpider, Rule
    from fbsPro.items import FbsproItem
    from scrapy_redis.spiders import RedisCrawlSpider
    
    
    class FbsSpider(RedisCrawlSpider):
        name = 'fbs'
    
        # 将start_urls和allowed_domains进行注释
        # allowed_domains = ['www.xxx.com']
        # start_urls = ['http://www.xxx.com/']
    
        # 添加一个新属性,可以被共享的调度器队列的名称
        redis_key = 'sun'
    
        # 和CrawlSpider类似
        rules = (
            Rule(LinkExtractor(allow=r'type=4&page=\d+'), callback='parse_item', follow=True),
        )
    
        def parse_item(self, response):
            tr_list = response.xpath('//*[@id="morelist"]/div/table[2]//tr/td/table//tr')
            for tr in tr_list:
                new_num = tr.xpath('./td[1]/text()').extract_first()
                new_title = tr.xpath('./td[2]/a[2]/@title').extract_first()
    
                item = FbsproItem()
                item['title'] = new_title
                item['new_num'] = new_num
    
                yield item       
    
  • settings.py

    # 指定scrapy-redis的管道
    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 = '127.0.0.1'  # redis远程服务器的ip(修改)
    REDIS_PORT = 6379
    
    
  • 修改redis.conf

    # 注释掉bind 127.0.0.1
    # IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES
    # JUST COMMENT THE FOLLOWING LINE.
    # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # bind 127.0.0.1
    
    # 关闭保护模式
    protected-mode no
    
    
  • 结合着配置文件开启redis服务

    ./redis-server ../redis.conf
    
  • 启动客户端

    ./redis-cli 
    
  • 执行工程

    cd 项目名/spiders
    scrapy runspider '爬虫文件.py'
    
  • 在客户端的终端,向调度器的队列中放入一个起始的URL

    lpush '可以被共享的调度器队列的名称' 'www.xxx.com'
    
  • 爬取到的数据存储在了redis的proName:items这个数据结构中

9.3 redis基本指令

  • 客户端

    keys *  # 查看所有表
    lrange proName:items 0 -1  # 查看所有记录 
    llen proName:items  # 查看表中的记录个数
    smembers urls  # 查看所有记录 
    
    # 关闭数据库
    redis-cli -p 端口号 shutdown
    

9.4 示例

返回