scrapy ---分布式爬虫

 导模块

pip install scrapy-redis

 原来scrapy的Scheduler维护的是本机的任务队列(待爬取的地址)+本机的去重队列(放在集合中)---》在本机内存中
如果把scrapy项目,部署到多台机器上,多台机器爬取的内容是重复的 

 流程图

scrapy ---分布式爬虫_第1张图片


所以实现分布式爬取的关键就是,找一台专门的主机上运行一个共享的队列比如Redis,
然后重写Scrapy的Scheduler,让新的Scheduler到共享队列存取Request,并且去除重复的Request请求,所以总结下来,实现分布式的关键就是三点:
    #1、多台机器共享队列
    #2、重写Scheduler,让其无论是去重还是任务都去访问共享队列
    #3、为Scheduler定制去重规则(利用redis的集合类型)
    
    
# scrapy-redis实现分布式爬虫
    -公共的去重
    -公共的待爬取地址队列

  使用步骤

               from scrapy_redis.spiders import RedisSpider
    1 把之前爬虫类,继承class CnblogsSpider(RedisSpider):


     2 去掉起始爬取的地址,加入一个类属性

        去掉它:start_urls = ["https://www.cnblogs.com"] #爬取的初始地址    
        redis_key = 'myspider:start_urls'  # redis列表的key,后期我们需要手动插入起始地址  


     3 配置文件中配置

          scrapy redis去重类,使用redis的集合去重        
        DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"


        不使用原生的调度器了,使用scrapy_redis提供的调度器,它就是使用了redis的列表
                SCHEDULER = "scrapy_redis.scheduler.Scheduler"
                REDIS_HOST = 'localhost'                            # 主机名
                REDIS_PORT = 6379                                   # 端口
                ITEM_PIPELINES = {
       # 'mysfirstscrapy.pipelines.MyCnblogsPipeline': 300,
       'mysfirstscrapy.pipelines.MyCnblogsMySqlPipeline': 301,
        'scrapy_redis.pipelines.RedisPipeline': 400,
    }
        
    # 再不同多台机器上运行scrapy的爬虫,就实现了分布式爬虫

      4.将初始爬取的地址传到redis队列中---cmd启动redis

lpush key value [value ...]

key------就是第二步  redis_key对应的值

value--------就是爬取的地址初始地址

        分布式爬虫 - 刘清政 - 博客园 (cnblogs.com)

你可能感兴趣的:(爬虫,scrapy,分布式,爬虫)