zoukankan      html  css  js  c++  java
  • scrapy分布式的几个重点问题


    我们之前的爬虫都是在同一台机器运行的,叫做单机爬虫。
    scrapy的经典架构图也是描述的单机架构。

    那么分布式爬虫架构实际上就是:
    由一台主机维护所有的爬取队列,每台从机的sheduler共享该队列,协同存储与提取。
    分布式爬虫的多台协作的关键是共享爬取队列。

    队列用什么维护呢?
    推荐redis队列
    redis是非关系型数据库,用key-value形式存储,结构灵活,他不像关系型数据库必须要由一定的结构才能存储。
    key-value可以是多种数据,非常灵活。
    另外,redis是内存中的数据结构存储系统,处理速度快,性能好。
    提供了队列,集合多种存储结构,方便队列维护和去重操作。

    怎样来去重?
    如果多台机器不仅往请求队列存,还同时从里面取,那么如何保证每台机子请求和存储的队列是不重复的呢?
    借助redis集合
    redis提供集合数据结构,我们知道集合里面的元素是不重复的
    首先,在redis中存储每隔request的指纹。
    在向request队列中加入request前首先验证这个request的指纹是否已经加入到集合中。
    如果已存在,则不添加requets到队列,
    如果不存在,则将request添加入队列并将指纹加入集合。

    怎样防止中断?
    在爬取的过程中,难免会有某台机子卡掉了,这时怎么办?
    在每台从机scrapy启动时都会首先判断当前redis request队列是否为空。
    如果不为空,则从队列中取得下一个request执行爬取。
    如果为空,则重新开始开始爬取,第一台从机执行爬取想队列中添加request。

    怎样实现该架构?
    要做到:
    维护request队列
    对台从机调度reuqest
    设置去重
    链接redis

    已经有了比较成熟的库scrapy-redis

    scrapy-redis库实现了如上架构,改写了scrapy的调度器,队列等组件
    利用它可以方便地实现scrapy分布式架构
    https://github.com/rolando/scrapy-redis
  • 相关阅读:
    [Linux]
    [Nginx]
    [Nginx]
    [Linux]
    [Linux]
    [Linux]
    [Linux]
    [Linux] -Docker修改空间大小
    [Linux]
    [MySql]
  • 原文地址:https://www.cnblogs.com/themost/p/7131797.html
Copyright © 2011-2022 走看看