04 | 网页爬虫设计:如何下载千亿级网页?
该思维导图由 AI 生成,仅供参考
需求分析
性能指标估算
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了设计全网爬虫系统的关键技术和挑战。首先,文章介绍了全网爬虫的需求分析,包括性能指标估算和非功能需求。接着详细讨论了全网爬虫的概要设计,包括种子URL的构建、URL调度器的算法原理、HTML页面的下载和存储、URL的提取和过滤等流程。文章还提到了Bajie系统的部署图,包括URL调度器服务器和URL下载处理服务器集群。重点关注了URL调度器算法、去重算法和高可用设计。其中,URL调度器算法采用广度优先遍历,通过队列实现,以及对不同网站的优先级分类和处理。去重算法采用布隆过滤器和MD5值计算,以提高效率和搜索质量。高可用设计主要关注服务器宕机和下载超时或内容解析错误的处理,采用状态记录和Redis存储。文章还提到了架构设计的权衡艺术,强调了架构师需要在各种方法中权衡选择,寻找成本最低的解决方案。此外,对于一个千亿级网页的爬虫系统而言,最主要的技术挑战应该是海量文件的存储与计算,而Bajie的海量文件存储就使用了Hadoop分布式文件系统HDFS。整体来看,本文详细介绍了全网爬虫系统的设计原理和关键技术挑战,对于想要了解网络爬虫设计的读者具有很高的参考价值。
《李智慧 · 高并发架构实战课》,新⼈⾸单¥59
全部留言(12)
- 最新
- 精选
- 开心小毛置顶想请问一下 ,如果“下载优先级队列”之间产生负载的不平衡怎么处理,比如说优先级为2的URL太多,以至于系统里其他的队列太空,队列2却太长被覆盖。
作者回复: 非常好的问题,我们的文章都是一篇篇设计文档,用来指导开发实践的,所以阅读文章的过程,就是不断思考每个设计点如何落地实现的过程,通过这种方式强化知识水平,提高实践能力。 大家探讨这样的问题是学习这个专栏的最好方式。 回到正题,我的想法是:太多URL的队列写回到待下载URL集合。 还有,这又涉及到如何判断队列不平衡?大家有什么方法?
2022-03-1454 - 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-2314 - ABC好几年前用Python写过一些爬虫,都是比较简单的。在搜索引擎这个方面,除了搜索引擎主动爬取网页,有的网站还会主动推送新内容给搜索引擎,比如国内某些新闻网站在某度基本是分钟级收录。
作者回复: 确实,搜索引擎和内容网站是共生关系,互为依赖,主动推送是一种不错的合作模式。 谢谢分享,学习了~~
2022-03-186 - legendcq老师,如果用布隆过滤器去重,如何处理false positive的情况,是允许一定比例的重复数据吗?
作者回复: 是的,少量重复对性能和结果的影响都可以忽略
2022-02-2646 - 门窗小二老师,如果是热门网站,会不会造成这个队列的数据特别多严重倾斜,极端情况下,下载服务都在处理这个网站的数据,增加目标网站的负载同时增加自身ip被目标加入黑名单的风险?换句话说可以对热点网站处理存在对应限流策略?
作者回复: 域名队列就是解决这个问题的,会把特别热门的域名放在一个单独队列,这个队列即使数据特别多,每次也只会被域名队列选择器轮询一个URL,而域名队列有几百个,这个域名只占下载任务几百分之一。
2022-02-2433 - Geek_38ba97请教老师个很困惑的问题 我很困惑为什么資料多說布隆过滤器只會重複crawl一些頁面?而不是会漏抓取某些页面? 为什么它不会丢失抓取某些页面? 例如,考虑一个已初始化的全 0 布隆过滤器位数组 step1:查询urlA返回false,所以存储urlA,抓取urlA。 step2:查询urlB返回false,所以存储urlB,抓取urlB。 step3:如果查询urlC时返回true,系统会认为urlC可能已经存在于集合中,所以不会存储urlC,也不会抓取urlC。 因此,urlC 就漏抓了。 以上是我的疑惑。 我理解有什么不对的地方吗?十分感謝
作者回复: 应该是会漏掉数据,布隆过滤器判断为重复,实际未重复,也就是漏掉数据。你的理解是对的。
2023-05-15归属地:中国台湾21 - singularity of space time想请问一下TPS如何控制,也即如何保证TPS在预估的800左右,而不会在某些突发情况下冲破峰值(比如在系统刚刚运行时),是采用类似漏桶、令牌桶这样的限流算法嘛?
作者回复: TPS和平均响应时间以及并发数相关,响应时间由目标网站控制,爬虫可以大概计算一个平均时间;并发数由爬虫线程数控制,是开发者可以决定的。 限流是用来控制用户请求并发数的,爬虫的场景没有用户请求,不需要用限流。
2022-04-281 - 太空牛仔下载优先级队列的数据都会流转到域名队列中,域名队列是通过轮询的方式发放给下载服务器,那不就失去了优先队列的优先权重吗?
作者回复: 如果每个域名一个域名队列,那么轮询的时候一定会有很多空队列,事实上还是保证了优先级权重。 另外,系统也会定期合并空队列,以提高性能,降低资源浪费,但是最终还是能保证优先级权重。
2022-03-251 - Leader请问老师,如果网站内容有更新怎么办?如果重新爬取,跟去重算法冲突了怎么办?感觉去重算法这一块设计里讲的还是不够完整。
作者回复: 网站内容更新一般都会使用新的URL。
2022-03-064 - dll老师,有没有一些配套的demo code能够参考借鉴一下呢
作者回复: 这个专栏我们主要关注是如何对系统进行抽象,也就是如何设计
2022-02-25