美文网首页
分布式爬虫

分布式爬虫

作者: 精彩i人生 | 来源:发表于2018-12-09 23:07 被阅读0次
    Scrapy_redis在scrapy的基础上实现了更多,更强大的功能,具体体现在:reqeust去重,爬虫持久化,和轻松实现分布式,安装命令如下:

    pip3 install scrapy-redis

    Scrapy-redis提供了下面四种组件:

    1.Scheduler
    2.Duplication Filter
    3.Item Pipeline
    4.Base Spider

    Scrapy本身不支持爬虫分布式,scrapy-redis 的解决是把这个Scrapy queue换成redis数据库,从同一个redis-server存放要爬取的request,便能让多个spider去同一个数据库里读取。
    Scheduler

    注意!

    原来的Scheduler已经无法使用,所以使用Scrapy-redis的scheduler组件。

    Duplication Filter

    Scrapy中用集合实现这个request去重功能,Scrapy中把已经发送的request指纹放入到一个集合中,把下一个request的指纹拿到集合中比对,如果该指纹存在于集合中,说明这个request发送过了,如果没有则继续操作。

    Item Pipeline

    引擎将Spider返回的爬取到的Item给Item Pipeline,scrapy-redis 的Item Pipeline将爬取到的 Item 存⼊redis的 items queue。

    Base Spider

    不在使用scrapy原有的Spider类,重写的RedisSpider继承了Spider和RedisMixin这两个类,RedisMixin是用来从redis读取url的类。

    要实现分布式爬虫,需要在settings中做如下设置

    Scrapy settings for example project
    #
    # For simplicity, this file contains only the most important settings by
    # default. All the other settings are documented here:
    #
    # http://doc.scrapy.org/topics/settings.html
    #
    SPIDER_MODULES = ['example.spiders']
    NEWSPIDER_MODULE = 'example.spiders'
    
    # 默认的User-Agent
    USER_AGENT = 'scrapy-redis (+https://github.com/rolando/scrapy-redis)'
    
    #这里表示启用scrapy-redis里的去重组件,
    不再使用scrapy默认的去重
    DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
    
    #使用了scrapy-redis里面的调度器组件,不再使用scrapy默认的调度器
    SCHEDULER = "scrapy_redis.scheduler.Scheduler"
    
    #允许暂停,redis请求的记录不会丢失,不清除
    Redis队列,可以恢复和暂停
    SCHEDULER_PERSIST = True
    
    #下面这些是request的队列模式
    #一般情况下使用第一种
    #scrapy-redis默认的请求队列形式(有自己的优先级顺序)
    #是按照redis的有序集合排序出队列的
    #SCHEDULER_QUEUE_CLASS =             "scrapy_redis.queue.SpiderPriorityQueue"
    
    #这个是启用了堆的形式,请求先进先出
    #SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue"
    
    #使用了栈的形式,请求先进后出
    #SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack"
    
    # scrapy_redis.pipelines.RedisPipeline 必须启用,才能够将数据存储到redis数据库中
    ITEM_PIPELINES = {
    'example.pipelines.ExamplePipeline': 300,
    'scrapy_redis.pipelines.RedisPipeline': 400,
    }
    
    # log日志等级(可选)
    # LOG_LEVEL = 'DEBUG'
    
    # 指定要存储的redis的主机的ip,
    默认存储在127.0.0.1
    
    REDIS_HOST = 'redis的主机的ip'
    
    # 定要存储的redis的主机的port,
    默认6379
    
    REDIS_PORT = '6379'
    
    # Introduce an artifical delay to make use of parallelism. to speed up the
    # crawl.
    #下载延时
    DOWNLOAD_DELAY = 1

    相关文章

      网友评论

          本文标题:分布式爬虫

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