zoukankan      html  css  js  c++  java
  • scrapy之分布式

    分布式爬虫

    1. 概念:多台机器上可以执行同一个爬虫程序,实现网站数据的分布爬取。
    2. 原生的scrapy是不可以实现分布式爬虫?

        a) 调度器无法共享

        b) 管道无法共享

    工具

    scrapy-redis组件:专门为scrapy开发的一套组件。该组件可以让scrapy实现分布式。

    a) 下载:pip install scrapy-redis

    分布式爬取的流程

    1)redis文件的配置 bind 127.0.0.1 进行注释 protected-model no 关闭保护模式
    2)redis数据库的开启:要基于配置文件进行开启
    服务器端redis-server.exe redis.windows.conf
    客户端redis-cli
    3)创建scrapy工程后,创建基于crawlSpider的爬虫文件
    4)导入RedisCrawlSpider类,然后将爬虫文件修改成继承该类的源文件
    5)将start_url修改成redis_key
    6)将项目的管道和调度器配置成基于scrapy_redis组件的配置
    7)执行爬虫文件:进入到爬虫文件目录内,执行scrapy runspider 爬虫文件.py
    程序进入监听状态
    8)将起始url扔进调度器中 redis数据库客户端执行 lpush 调度器名称 url
    keys * 》》lrange qiubai:items 0 -1

     代码

    # -*- coding: utf-8 -*-
    import scrapy
    from scrapy.linkextractors import LinkExtractor
    from scrapy.spiders import CrawlSpider, Rule
    from redisPro.items import RedisproItem
    from scrapy_redis.spiders import RedisCrawlSpider
    from redisPro.items import RedisproItem
    
    class QiubaiSpider(RedisCrawlSpider):
        name = 'qiubai'
        #allowed_domains = ['https://www.qiushibaike.com/pic/']
        #start_urls = ['https://www.qiushibaike.com/pic/']
    
        #调度器队列的名称
        redis_key = 'qiubaispider'  #表示跟start_urls含义是一样
        # 链接提取器
        link = LinkExtractor(allow=r'/pic/page/d+')
        rules = (
            # 规则解析器
            Rule(link, callback='parse_item', follow=True),
        )
    
        def parse_item(self, response):
           #将图片的url进行解析
    
            div_list = response.xpath('//*[@id="content-left"]/div')
            for div in div_list:
                img_url = div.xpath('./div[@class="thumb"]/a/img/@src').extract_first()
                item = RedisproItem()
                item['img_url'] = img_url
    
                yield item

    配置

    除了之前的设置外,还需要如下设置

    # Configure item pipelines
    # See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
    ITEM_PIPELINES = {
        #'redisPro.pipelines.RedisproPipeline': 300,
        'scrapy_redis.pipelines.RedisPipeline': 300,
    }
    
    ....
    
    # 使用scrapy-redis组件的去重队列
    DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
    # 使用scrapy-redis组件自己的调度器
    SCHEDULER = "scrapy_redis.scheduler.Scheduler"
    # 是否允许暂停
    SCHEDULER_PERSIST = True

    【补充】

    #如果redis服务器不在自己本机,则需要在setting中进行如下配置

    REDIS_HOST = 'redis服务的ip地址'

    REDIS_PORT = 6379

    然后按流程操作执行就可以了!

  • 相关阅读:
    MAC 使用git时 不自动补全
    MAC 下 安装redis 并配置 php redis 扩展
    PHP日志 LOG4PHP 的配置与使用
    PHP数组 转 对象/对象 转 数组
    将数组打印到txt文件中
    Yii2控制器 返回 json 格式数据
    控制流输出26大小写英文字母
    员工领导部门关系类
    重写父类
    递归(recursion)
  • 原文地址:https://www.cnblogs.com/yuliangkaiyue/p/10035282.html
Copyright © 2011-2022 走看看