V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nyse
V2EX  ›  程序员

一个关于分布式爬虫设计的问题?

  •  
  •   nyse · 2018-09-17 17:05:40 +08:00 · 1978 次点击
    这是一个创建于 2019 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需求:

    爬取有不同网站的不同栏目,爬虫需要控制好不同网站、不同栏目、不同页码、不同内容也的爬取进度。

    爬虫做成分布式爬虫架构,可以无限在不同电脑服务器上横向增加。

    这个是我自己的业余项目,用 Node 写,想做成一个分布式爬虫框架,大概设计思路:

    1. 在 Redis 中有两个列表:爬虫列表、任务列表;

    2. 不同电脑(服务器)上的爬虫启动后,

    ( 1 )将自己相关信息 push 到爬虫列表(这个列表暂时只是为了查看爬虫信息),

    ( 2 )读取任务列表

    如果没有的话根据规则,自己启动任务,同时生成一个任务,push 到任务列表(这里是先把下一个任务 push 过去,再执行自己的抓取任务,因此不会阻塞)。

    如果任务列表中存在任务,则 POP 该任务后再生成下一个任务 Push 上去。

    在每台电脑(服务器)上的爬虫都是一模一样的,有个模块专门针对不同网站、不同栏目生成任务规则,取到任务后才交给不同的逻辑模块处理数据。

    任务列表中的任务顺序可能是不同网站的不同栏目,这样是为了避免单一 IP 对同一网站访问太频繁。

    目前这种设计有个缺点就是得等一个爬虫拉取任务后才能生成下一个任务,而假如一个爬虫出问题,可能就无法生成下一个任务,导致其他爬虫也在白等,失去了任务调度的意义。

    之所以要 push 下一个任务上去,是因为下一个任务要根据当前页面的爬取结果确定下一个任务(比如爬到这一页发现数据已经不再爬过,不再爬取下一页)。

    大家对这个东西有没有什么优化思路?

    6 条回复    2018-09-18 14:47:45 +08:00
    airyland
        1
    airyland  
       2018-09-17 18:23:47 +08:00
    加上超时机制,分发出去 1 分钟内没有返回结果,重新加入任务列表。
    Leigg
        2
    Leigg  
       2018-09-17 19:47:13 +08:00 via iPhone   ❤️ 1
    实时统计每个爬虫的 request 和 response 数量,可以帮助发现初期框架的问题,再一个就是需要维护一个代理池
    zhijiansha
        3
    zhijiansha  
       2018-09-17 19:57:10 +08:00 via iPhone
    任务拿到就先 push 一条新的任务,后面挂掉也不影响
    nyse
        4
    nyse  
    OP
       2018-09-18 09:32:28 +08:00
    @zhijiansha #3 因为按照目前这个逻辑,一个爬虫接到一个任务后,会 push 一个任务上去,然后这个任务又被其他爬虫 POP 走,这样的话这个任务池里一直只有一个任务,一旦有一个爬虫 POP 走任务又出了某种问题,导致下一个任务没能 push 上去,那么其他爬虫就一直在等。
    zhijiansha
        5
    zhijiansha  
       2018-09-18 11:15:11 +08:00 via iPhone
    @nyse push 到队列尾部,应该不会只有这一个任务吧?爬虫在抓取解析之前完成任务的获取和添加,那这条任务理论上不会丢才对,不过也不排除和 redis 连接异常
    lovelybear
        6
    lovelybear  
       2018-09-18 14:47:45 +08:00
    还是去中心化比较好
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5435 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 49ms · UTC 08:44 · PVG 16:44 · LAX 01:44 · JFK 04:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.