美文网首页
如何快速构建一个Scrapy的分布式爬虫

如何快速构建一个Scrapy的分布式爬虫

作者: 越大大雨天 | 来源:发表于2019-08-19 18:10 被阅读0次

    分布式爬虫简单介绍

    分布式爬虫,说简单一点,只需要将Request任务队列和dupefilter去重的队列存放在公共的Redis中,共享给不同的主机进行操作,且每个主机都运行着相同的爬虫代码。这样就可以做到分布式。
    而对于Scrapy,已经有了一个scrapy_redis组件供我们使用,它实现了以下功能:

    1. 它将request对象放到了redis的有序集合中,利用该有序集合实现了请求队列;
    2. 对request对象生成去重指纹对象,也存储到同一redis的集合中,利用request指纹避免发送重复的请求


      redis中的集合

      上图包含了基于scrapy_redis的分布式爬虫在Redis中自动生成的三个集合。

    • requests:存放待爬取的request对象的集合,所有爬虫程序都从该集合中获取任务进行爬取。
    • dupefilter:用于去重的指纹对象集合,每一个新的Request对象都会先判断是否已在该集合中,若不存在,再添加进request集合
    • items:持久化保存的爬取结果item。

    分布式爬虫如何实现

    首先,你得先有一个正常的scrapy爬虫,再改造成分布式爬虫即可,按照以下几部实现起来很容易。

    1. 编写好普通scrapy爬虫
    2. 改造成分布式爬虫(5步)
    • 导入scrapy_redis中的分布式爬虫类
    • 继承类
    • 注销start_url和allowed_domains
    • 设置redis-key
    • 设置_init_获取允许的域(直接按照示例代码即可)
    # ------1.导入分布式爬虫类
    from scrapy_redis.spiders import RedisSpider
    
    # ------2. 继承分布式爬虫类
    class BookSpider(RedisSpider):
       name = 'book'
       # ------3. 注释掉allowed_domains及start_urls
       # allowed_domains = ['jd.com','p.3.cn']
       # start_urls = ['https://book.jd.com/booksort.html']
    
       # ------4. 设置redis-key
       redis_key = "jd:book"
       # ------5. 设置__init__獲取允許的域
       def __init__(self, *args, **kwargs):
           domain = kwargs.pop("domain", "")
           self.allowed_domains = list(filter(None, domain.split(',')))
           super(BookSpider, self).__init__(*args, **kwargs)
    
    
    3.改写配置文件

    直接将redis_scrapy中提供的示例settings文件内容拷贝过来,再按实际改写即可。

    ROBOTSTXT_OBEY = False
    SPIDER_MODULES = ['JD.spiders']
    NEWSPIDER_MODULE = 'JD.spiders'
    
    # 设置重复过滤器的模块
    DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
    # 设置调取器,scrap_redis中的调度器具备与数据库交互的功能
    SCHEDULER = "scrapy_redis.scheduler.Scheduler"
    # 设置当爬虫结束的时候是否保持redis数据库中的去重集合与任务队列
    SCHEDULER_PERSIST = True
    #SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"
    #SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue"
    #SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack"
    
    ITEM_PIPELINES = {
    
       
        'JD.pipelines.JdPipeline':599,
         # 当开启该管道,该管道会把数据同时存到Redis数据库中
        'scrapy_redis.pipelines.RedisPipeline': 600,
    }
    
    DOWNLOADER_MIDDLEWARES = {
        'JD.middlewares.UserAgentMiddleware': 543,
    }
    
    # 设置redis数据库地址
    REDIS_URL = "redis://127.0.0.1:6379"
    
    LOG_LEVEL = 'DEBUG'
    DOWNLOAD_DELAY = 1
    

    也可以直接复制我上面的配置文件,再根据你的少量修改即可。

    4.启动分布式爬虫

    首先需要连接到redis数据库,按照你设定的redis_key值,往redis中添加起始url,然后启动你的多个爬虫程序,我这里是使用的多个cmd窗口模拟多台服务器,示例如下:


    分布式爬虫模拟.png

    运行情况:


    分布式爬虫运行中.png

    这样,一个分布式爬虫就已经运行起来了,它们共享操作redis中的任务队列和去重队列。

    相关文章

      网友评论

          本文标题:如何快速构建一个Scrapy的分布式爬虫

          本文链接:https://www.haomeiwen.com/subject/gysesctx.html