码迷,mamicode.com
首页 > 其他好文 > 详细

scrapy-redis分布式爬虫

时间:2021-05-24 06:20:04      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:cto   执行   persist   conf   基类   ide   efi   间隔   domain   

Scrapy 是一个通用的爬虫框架,但是不支持分布式,Scrapy-redis是为了更方便地实现Scrapy分布式爬取,而提供了一些以redis为基础的组件(仅有组件)。

一、Scrapy-Redis分布式策略:

  • Master端(核心服务器):搭建一个Redis数据库,并开启redis-server,不负责爬取,只负责url指纹判重、Request的分配,以及数据的存储
  • Slaver端(爬虫程序执行端) :负责执行爬虫程序,运行过程中提交新的Request给Master

二、安装scrapy-redis:

pip3 install scrapy-redis

三、安装Redis数据库

Master端需要安装Redis数据库,可以参照:redis数据库使用

需要注意的是,配置文件redis.conf中需要注释掉bind 127.0.0.1这一行,从而允许Slaver端远程连接。

四、实现Scrapy-Redis分布式爬虫

  • settings.py关键配置

    # 指定使用scrapy-redis的调度器
    SCHEDULER = "scrapy_redis.scheduler.Scheduler"
    
    # 指定使用scrapy-redis的去重过滤器
    DUPEFILTER_CLASS = scrapy_redis.dupefilter.RFPDupeFilter
    #默认情况下,RFPDupeFilter只记录第一个重复请求。将DUPEFILTER_DEBUG设置为True会记录所有重复的请求。
    # DUPEFILTER_DEBUG =True
    
    # 允许爬虫程序中断恢复后,接着之前的请求继续爬取,而不是从头开始爬
    SCHEDULER_PERSIST = True
    
    # 指定排序爬取地址时使用的队列
    #SCHEDULER_QUEUE_CLASS = ‘scrapy_redis.queue.SpiderPriorityQueue‘ 按优先级排序(Scrapy默认),redis数据库中通过有序集合(sorted set)类型实现
    # SCHEDULER_QUEUE_CLASS = ‘scrapy_redis.queue.SpiderQueue‘ 按先进先出排序(FIFO)
    # SCHEDULER_QUEUE_CLASS = ‘scrapy_redis.queue.SpiderStack‘按后进先出排序(LIFO)
    
    # 只在使用SpiderQueue或者SpiderStack时有效,指定爬虫关闭的最大间隔时间
    # SCHEDULER_IDLE_BEFORE_CLOSE = 10
    
    ITEM_PIPELINES = {
        #‘example.pipelines.ExamplePipeline‘: 300,
        scrapy_redis.pipelines.RedisPipeline: 400 #将数据存储到redis数据库,如果自己也实现了Pipeline,切记RedisPipeline后面的数值一定要比前面的大,因为它并不会return item以便后续管道文件处理
    }
    
    #指定数据库连接参数,默认本地
    #REDIS_HOST = ‘Master端ip‘
    #REDIS_PORT = 6379
    #REDIS_PARAMS ={
    #    ‘password‘: ‘密码‘,
    #}
  • 爬虫文件(spiders/xx.py)

    • RedisSpider爬虫

      from scrapy_redis.spiders import RedisSpider #导入爬虫基类
      
      class DemoSpider(RedisSpider):
          
          name = 爬虫名
          allowed_domains= [允许的爬虫域]
          #redis中存放start_urls的键名,一定要指定
          redis_key = demospider:start_urls #即启动爬虫的命令,参考格式:redis_key = ‘小写类名:start_urls‘
          
          def parse(self, response):
              pass
    • RedisCrawlSpider爬虫

      from scrapy.spiders import Rule
      from scrapy.linkextractors import LinkExtractor
      
      from scrapy_redis.spiders import RedisCrawlSpider
      
      class DemoSpider(RedisCrawlSpider):
          name = 爬虫名
          allowed_domains = [允许的爬虫域]
          redis_key = demospider:start_urls #可任意指定,最好遵循‘小写类名:start_urls‘这种形式
          rules = {
            Rule(LinkExtractor(), callback=parse_page, follow=True),#callback不能为‘parse‘ ,否则爬虫无法允许  
        }
      
          def parse_page(self,response):
              pass
  • 执行方式

    1. Slaver端运行爬虫:

      scrapy runspider xx.py
    2. Master端Redis数据库中执行以下命令:(参考)

      lpush demospider:start_urls http://www.dmoz.org/
    3. slaver端爬虫程序获取到url,开始执行

注:如果仅仅想通过redis数据库来进行去重和保存数据,只需按照上述设置settings.py即可,然后使用命令:scrapy crawl 爬虫名 来执行爬虫,切记不需要通过redis数据库客户端lpush指令了

scrapy-redis分布式爬虫

标签:cto   执行   persist   conf   基类   ide   efi   间隔   domain   

原文地址:https://www.cnblogs.com/eliwang/p/14747043.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!