scrapy-redis分布式爬虫

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 crawl 爬虫名
    2. Master端Redis数据库中执行以下命令:(参考)

      lpush demospider:start_urls http://www.dmoz.org/
    3. slaver端爬虫程序获取到url,开始执行,并将结果保存到redis数据库中

      • reids数据库中会生成3个键
        • 爬虫名:dupefilter  【过滤器】
        • 爬虫名:items   【以list保存json结果,比如:{"url": "https://sc.chinaz.com/jianli/240310087271.htm", "title": "测试"}】
        • 爬虫名:requests 【请求】
  • 运行中断(ctr+c)
    • 再次运行程序时,不需要再次执行lpush xxx了,而会继续爬取

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

posted @ 2021-05-12 00:26  eliwang  阅读(393)  评论(0编辑  收藏  举报