分布式爬取

编辑本随笔

概念:在多台机器上执行同一个爬虫程序,实现网站数据的分布式爬取

原生scrapy不可以实现分布式爬虫,原因如下:

  1. 调度器无法在多台电脑上共享
  2. 管道无法共享

分布式爬虫组件:scrapy-redis,该组件可以让scrapy实现分布式。

  1. pip install scrapy-redis

分布式爬取流程:

  1. redis数据库安装
  2. redis文件配置
    • 将bind 127.0.0.1注销掉
    • 将保护模式改为no,关闭保护模式,即protected-mode no
  3. 基于配置文件启动redis服务器

代码流程:

  1. 创建scrapy工程,创建基于crawlSpider的项目
  2. 从scrapy_redis.spiders中导入RedisCrawlSpider,并将项目的父类由CrawlSpider改为RedisCrawlSpider
  3. 指定redis_key,指定start_urls在redis数据库中存放的位置
    # -*- coding: utf-8 -*-
    import scrapy
    from scrapy.linkextractors import LinkExtractor
    from scrapy.spiders import CrawlSpider, Rule
    from scrapy_redis.spiders import RedisCrawlSpider
    
    class QiubaiSpider(RedisCrawlSpider):
        name = 'qiubai'
        allowed_domains = ['https://www.qiushibaike.com/imgrank/']
        # start_urls = ['http://https://www.qiushibaike.com/imgrank//']
        #表示start_urls在redis中存放的位置,作用类似start_urls
        redis_key="qiubaispider"
        rules = (
            Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True),
        )
    
        def parse_item(self, response):
            item = {}
            #item['domain_id'] = response.xpath('//input[@id="sid"]/@value').get()
            #item['name'] = response.xpath('//div[@id="name"]').get()
            #item['description'] = response.xpath('//div[@id="description"]').get()
            return item
    View Code
  4. 配置setting文件,将项目的管道和调度器配置成基于scrapy-redis组件对应提供的功能
    #使用组件封装的管道,不使用原生的管道
    ITEM_PIPELINES = {
       'scrapy_redis.pipelines.RedisPipeline': 300,
    }
    # 使用scrapy-redis组件的去重队列进行去重操作
    DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
    
    # 使用scrapy-redis组件自己的调度器
    SCHEDULER = "scrapy_redis.scheduler.Scheduler"
    
    # 是否允许暂停,即程序意外宕机重启后从上次意外退出的地方重新爬取
    SCHEDULER_PERSIST = True
    
    #Redis服务器地址,代码拷贝到其他服务器后,爬取的数据将保存到如下地址的redis服务器中
    REDIS_HOST="192.168.1.1"
    
    #Redis服务器端口
    REDIS_PORT=6379
  5. 执行爬虫文件,进入爬虫目录scrapy runspider qiubai.py,启动后爬虫就开始监听redis的qiubaispider键对应的内容

  6. 将起始url放入redis中:127.0.0.1:6379> lpush qiubaispider https://www.qiushibaike.com/pic/
  7. 开始爬取内容

基于RedisSpider实现分布式爬虫

UA池:user-agent池

代理池:对代理IP进行批量更换

selenium如何应用到scrapy框架

posted @ 2019-02-25 17:18  丫丫625202  阅读(359)  评论(0编辑  收藏  举报