李智慧 · 高并发架构实战课
李智慧
同程艺龙交通首席架构师,前 Intel & 阿里架构师,《大型网站技术架构》作者
23286 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 26 讲
李智慧 · 高并发架构实战课
15
15
1.0x
00:00/00:00
登录|注册

04 | 网页爬虫设计:如何下载千亿级网页?

多线程设计
宕机恢复
内容MD5值比较
布隆过滤器
域名分类和优先级队列
队列实现
广度优先遍历
URL下载处理服务器集群
URL调度器服务器
过滤和去重URL
提取超链接URL
解析HTML、内容去重
域名解析、下载HTML
URL调度器选择URL
构建种子URL
从种子URL开始遍历
互联网页面构成有向图
遵循robots.txt协议
礼貌性:避免给网站带来压力
扩展性:支持多种内容类型
去重:URL和内容去重
健壮性:异常处理
伸缩性:分布式爬虫
系统吞吐量(TPS):800
总存储空间:240PB
每月新增存储量:1PB
设计方案讨论
其他爬虫设计情况
海量文件存储与计算
URL调度器核心
架构设计权衡
高可用设计
去重算法
URL调度器算法
部署图
处理流程
获取URL
非功能需求
性能指标
功能:下载互联网公开网页
挑战:海量URL获取与存储、爬取速度与网站压力平衡
应用:搜索引擎、数据分析
名称:Bajie(八戒)
思考题
小结
详细设计
概要设计
需求分析
爬虫概述
网页爬虫设计:如何下载千亿级网页?

该思维导图由 AI 生成,仅供参考

你好,我是李智慧。
在互联网早期,网络爬虫仅仅应用在搜索引擎中。随着大数据时代的到来,数据存储和计算越来越廉价和高效,越来越多的企业开始利用网络爬虫来获取外部数据。例如:获取政府公开数据以进行统计分析;获取公开资讯以进行舆情和热点追踪;获取竞争对手数据以进行产品和营销优化等等。
网络爬虫有时候也被称为网络机器人,或者网络蜘蛛。我们准备开发一个全网爬虫,爬取全(中文)互联网的公开网页,以构建搜索引擎和进行数据分析。爬虫名称为“Bajie(八戒)”。
Bajie 的技术挑战包括:如何不重复地获取并存储全网海量 URL?如何保证爬虫可以快速爬取全网网页但又不会给目标网站带来巨大的并发压力?接下来我们就来看看 Bajie 的需求与技术架构。

需求分析

Bajie 的功能比较简单,这里不再赘述。

性能指标估算

因为互联网网页会不断产生,所以全网爬虫 Bajie 也是一个持续运行的系统。根据设计目标,Bajie 需要每个月从互联网爬取的网页数为 20 亿个,平均每个页面 500KB,且网页需存储 20 年。
Bajie 的存储量和 TPS(系统吞吐量)估算如下。
每月新增存储量
估计平均每个页面 500KB,那么每个月需要新增存储 1PB。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了设计全网爬虫系统的关键技术和挑战。首先,文章介绍了全网爬虫的需求分析,包括性能指标估算和非功能需求。接着详细讨论了全网爬虫的概要设计,包括种子URL的构建、URL调度器的算法原理、HTML页面的下载和存储、URL的提取和过滤等流程。文章还提到了Bajie系统的部署图,包括URL调度器服务器和URL下载处理服务器集群。重点关注了URL调度器算法、去重算法和高可用设计。其中,URL调度器算法采用广度优先遍历,通过队列实现,以及对不同网站的优先级分类和处理。去重算法采用布隆过滤器和MD5值计算,以提高效率和搜索质量。高可用设计主要关注服务器宕机和下载超时或内容解析错误的处理,采用状态记录和Redis存储。文章还提到了架构设计的权衡艺术,强调了架构师需要在各种方法中权衡选择,寻找成本最低的解决方案。此外,对于一个千亿级网页的爬虫系统而言,最主要的技术挑战应该是海量文件的存储与计算,而Bajie的海量文件存储就使用了Hadoop分布式文件系统HDFS。整体来看,本文详细介绍了全网爬虫系统的设计原理和关键技术挑战,对于想要了解网络爬虫设计的读者具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《李智慧 · 高并发架构实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(12)

  • 最新
  • 精选
  • 开心小毛
    置顶
    想请问一下 ,如果“下载优先级队列”之间产生负载的不平衡怎么处理,比如说优先级为2的URL太多,以至于系统里其他的队列太空,队列2却太长被覆盖。

    作者回复: 非常好的问题,我们的文章都是一篇篇设计文档,用来指导开发实践的,所以阅读文章的过程,就是不断思考每个设计点如何落地实现的过程,通过这种方式强化知识水平,提高实践能力。 大家探讨这样的问题是学习这个专栏的最好方式。 回到正题,我的想法是:太多URL的队列写回到待下载URL集合。 还有,这又涉及到如何判断队列不平衡?大家有什么方法?

    2022-03-14
    5
    4
  • peter
    请教老师几个问题啊: Q1:“可扩展”与“可伸缩”的区别是什么? “可扩展”是指软件开发方面,“可伸缩”是指部署方面,即增删机器方面,对吗? Q2:怎么知道目标服务器的负载能力? Q3:爬虫如果不理会robots.txt,会怎么处理? Robots.txt中禁止爬取,是从技术的角度爬虫无法爬取吗?还是说技术上爬虫仍然可以爬取,但可能会被起诉? Q4:HDFS出现之前,百度将爬取的网页存在什么系统? 百度比HDFS出现的早,没有HDFS的时候网页是怎么存储的? Q5:爬虫的爬取速度是可以控制的吗? Q6:一个URL被正常处理完后,会从“待下载 URL 集合”中删除吗? 如果会删除,删除后该URL会被丢弃还是保存到某个地方? Q7:爬虫用什么开发?好像python居多,用Java可以吗? Q8:“待下载 URL 集合”,用Java开发的话用什么JDK的哪种集合? 或者,虽然名字叫“集合”,但其实只是往文件中追加记录? Q9:“待下载 URL 集合”,取出一个,添加多个,那这个文件岂不是越来越大,很快就会超出文件大小?(产生的多,处理的少,积压越来愈多) Q10:“域名队列映射表”,根据具体域名还是域名类型来判断?互联网域名可太多了啊,怎么也列举不完啊。

    作者回复: 1 是的 2 压测 3 不理会没关系,但是爬来的数据就没法用来做公开搜索引擎 4 不知道 5 可以啊,URL调度器产生的URL快慢就可以控制,也依赖下载服务器的处理能力 6 会删除,一般不会丢弃,将来还要分析用的 7 爬虫就是一个HTTP client,各种语言都可以。python多是因为Python在数据处理领域用的多,用到爬虫的地方也多。实际上大规模爬虫开发的重头是下载HTML后的处理过程,Java或者C++的处理能力更强 8 是个文件 9 用HDFS存储 10 域名,多个域名可以合用一个队列。集合中的域名是有限的,列举的完

    2022-02-23
    14
  • ABC
    好几年前用Python写过一些爬虫,都是比较简单的。在搜索引擎这个方面,除了搜索引擎主动爬取网页,有的网站还会主动推送新内容给搜索引擎,比如国内某些新闻网站在某度基本是分钟级收录。

    作者回复: 确实,搜索引擎和内容网站是共生关系,互为依赖,主动推送是一种不错的合作模式。 谢谢分享,学习了~~

    2022-03-18
    6
  • legendcq
    老师,如果用布隆过滤器去重,如何处理false positive的情况,是允许一定比例的重复数据吗?

    作者回复: 是的,少量重复对性能和结果的影响都可以忽略

    2022-02-26
    4
    6
  • 门窗小二
    老师,如果是热门网站,会不会造成这个队列的数据特别多严重倾斜,极端情况下,下载服务都在处理这个网站的数据,增加目标网站的负载同时增加自身ip被目标加入黑名单的风险?换句话说可以对热点网站处理存在对应限流策略?

    作者回复: 域名队列就是解决这个问题的,会把特别热门的域名放在一个单独队列,这个队列即使数据特别多,每次也只会被域名队列选择器轮询一个URL,而域名队列有几百个,这个域名只占下载任务几百分之一。

    2022-02-24
    3
    3
  • Geek_38ba97
    请教老师个很困惑的问题 我很困惑为什么資料多說布隆过滤器只會重複crawl一些頁面?而不是会漏抓取某些页面? 为什么它不会丢失抓取某些页面? 例如,考虑一个已初始化的全 0 布隆过滤器位数组 step1:查询urlA返回false,所以存储urlA,抓取urlA。 step2:查询urlB返回false,所以存储urlB,抓取urlB。 step3:如果查询urlC时返回true,系统会认为urlC可能已经存在于集合中,所以不会存储urlC,也不会抓取urlC。 因此,urlC 就漏抓了。 以上是我的疑惑。 我理解有什么不对的地方吗?十分感謝

    作者回复: 应该是会漏掉数据,布隆过滤器判断为重复,实际未重复,也就是漏掉数据。你的理解是对的。

    2023-05-15归属地:中国台湾
    2
    1
  • singularity of space time
    想请问一下TPS如何控制,也即如何保证TPS在预估的800左右,而不会在某些突发情况下冲破峰值(比如在系统刚刚运行时),是采用类似漏桶、令牌桶这样的限流算法嘛?

    作者回复: TPS和平均响应时间以及并发数相关,响应时间由目标网站控制,爬虫可以大概计算一个平均时间;并发数由爬虫线程数控制,是开发者可以决定的。 限流是用来控制用户请求并发数的,爬虫的场景没有用户请求,不需要用限流。

    2022-04-28
    1
  • 太空牛仔
    下载优先级队列的数据都会流转到域名队列中,域名队列是通过轮询的方式发放给下载服务器,那不就失去了优先队列的优先权重吗?

    作者回复: 如果每个域名一个域名队列,那么轮询的时候一定会有很多空队列,事实上还是保证了优先级权重。 另外,系统也会定期合并空队列,以提高性能,降低资源浪费,但是最终还是能保证优先级权重。

    2022-03-25
    1
  • Leader
    请问老师,如果网站内容有更新怎么办?如果重新爬取,跟去重算法冲突了怎么办?感觉去重算法这一块设计里讲的还是不够完整。

    作者回复: 网站内容更新一般都会使用新的URL。

    2022-03-06
    4
  • dll
    老师,有没有一些配套的demo code能够参考借鉴一下呢

    作者回复: 这个专栏我们主要关注是如何对系统进行抽象,也就是如何设计

    2022-02-25
收起评论
显示
设置
留言
12
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部