zoukankan      html  css  js  c++  java
  • 网络爬虫(11)-Scrapy分布式

    1.Scrapy-redis简介

    scrapy-redis是scrapy框架基于redis数据库的组件,用于scrapy项目的分布式开发和部署。

    有如下特征:

    • 分布式爬取,可以启动多个spider工程,相互之间共享单个redis的requests队列。最适合广泛的多个域名网站的内容爬取。
    • 分布式数据处理,爬取到的scrapy的item数据可以推入到redis队列中,这意味着你可以根据需求启动尽可能多的处理程序来共享item的队列,进行item数据持久化处
    • Scrapy即插即用组件,Scheduler调度器 + Duplication复制 过滤器,Item Pipeline,基本spider

    2.Scrapy-redis架构

     

    首先Slaver端从Master端拿任务(Request、url)进行数据抓取,Slaver抓取数据的同时,产生新任务的Request便提交给 Master 处理;

     Master端只有一个Redis数据库,负责将未处理的Request去重和任务分配,将处理后的Request加入待爬队列,并且存储爬取的数据。

    Scrapy-Redis默认使用的就是这种策略,我们实现起来很简单,因为任务调度等工作Scrapy-Redis都已经帮我们做好了,我们只需要继承RedisSpider、指定redis_key就行了。

    缺点是,Scrapy-Redis调度的任务是Request对象,里面信息量比较大(不仅包含url,还有callback函数、headers等信息),

    可能导致的结果就是会降低爬虫速度、而且会占用Redis大量的存储空间,所以如果要保证效率,那么就需要一定硬件水平。

    3.scrapy-redis常用配置

    1(必须). 使用了scrapy_redis的去重组件,在redis数据库里做去重
    
    DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
    
    2(必须). 使用了scrapy_redis的调度器,在redis里分配请求
    
    SCHEDULER = "scrapy_redis.scheduler.Scheduler"
    
    3(可选). 在redis中保持scrapy-redis用到的各个队列,从而允许暂停和暂停后恢复,也就是不清理redis queues
    
    SCHEDULER_PERSIST = True
    
    4(必须). 通过配置RedisPipeline将item写入key为 spider.name : items 的redis的list中,供后面的分布式处理item 这个已经由 scrapy-redis 实现,不需要我们写代码,直接使用即可
    
    ITEM_PIPELINES = {
       'scrapy_redis.pipelines.RedisPipeline': 100 ,
    }
    
    5(必须). 指定redis数据库的连接参数
    
    REDIS_HOST = '127.0.0.1' 
    REDIS_PORT = 6379
    

    4.scrapy-redis键名介绍

    scrapy-redis中都是用key-value形式存储数据,其中有几个常见的key-value形式:

    • “项目名:items”  -->list 类型,保存爬虫获取到的数据item 内容是 json 字符串
    • “项目名:dupefilter”   -->set类型,用于爬虫访问的URL去重 内容是 40个字符的 url 的hash字符串
    • “项目名: start_urls”   -->List 类型,用于获取spider启动时爬取的第一个url
    • “项目名:requests”   -->zset类型,用于scheduler调度处理 requests 内容是 request 对象的序列化 字符串

    参考:https://www.cnblogs.com/pythoner6833/p/9148937.html

    参考:https://www.cnblogs.com/bobo-zhang/p/9686978.html

    参考案例分享:https://blog.csdn.net/weixin_43343144/article/details/89404655

  • 相关阅读:
    Mac下终端常用命令
    mac上完整卸载删除.简单粗暴无脑:androidstudio删除方案
    Mac版 Intellij IDEA 激活
    解决Pods Unable to find a specification for `xxxxx`问题
    java并发编程(十五)内存可见两种方式 加锁和volatile
    java并发编程(五)正确使用volatile
    java并发编程(十四)同步问题的内存可见性
    java并发编程(十三)经典问题生产者消费者问题
    java并发编程(十三)线程间通信中notifyAll造成的早期通知问题
    java并发编程(十一)线程间的通信notify通知的遗漏
  • 原文地址:https://www.cnblogs.com/Iceredtea/p/11294362.html
Copyright © 2011-2022 走看看