系统设计::设计网络爬虫
设计网页爬虫 在这一章中,我们重点讨论网络爬虫设计:一个有趣的、经典的系统设计面试问题。 网络爬虫被称为机器人或蜘蛛。它被搜索引擎广泛用于发现网络上新的或更新的内容。内容可以是一个网页、一张图片、一段视频、一个 PDF 文件,等等。网络爬虫从收集一些网页开始,然后跟踪这些网页上的链接来收集新内容。图 9-1 显示了爬虫过程的一个直观例子。 爬虫有许多用途。 搜索引擎的索引。这是最常见的使用情况。爬虫收集网页,为搜索引擎创建一个本地索引。例如,Googlebot 是 Google 搜索引擎背后的网络爬虫。 网络归档。这是一个从网络上收集信息的过程,以保存数据供将来使用。例如,许多国家图书馆运行爬虫来存档网站。著名的例子是美国国会图书馆[1]和欧盟的网络档案[2]。 网络挖掘。网络的爆炸性增长为数据挖掘提供了前所未有的机会。网络挖掘有助于从互联网上发现有用的知识。例如,顶级金融公司使用爬虫下载股东会议和年度报告,以了解公司的关键举措。 网络监控。爬虫有助于监测互联网上的版权和商标侵权行为。例如,Digimarc[3]利用爬虫来发现盗版作品和报告。 开发一个网络爬虫的复杂性取决于我们打算支持的规模。它可以是一个小型的学校项目,只需要几个小时就能完成,也可以是一个巨大的项目,需要一个专门的工程团队不断改进。因此,我们将在下面探讨要支持的规模和功能。 理解问题并确定设计范围 网络爬虫的基本算法很简单。 给定一组 URLs,下载所有由 URLs 寻址的网页。 从这些网页中提取 URLs 将新的 URL 添加到要下载的 URL 列表中。重复这 3 个步骤。 网络爬虫的工作是否真的像这种基本算法一样简单?并非如此。设计一个巨大的可扩展的网络爬虫是一项极其复杂的任务。任何人都不可能在面试时间内设计出一个大规模的网络爬虫。在进入设计之前,我们必须问一些问题来了解需求并确定设计范围。 候选人:爬虫的主要目的是什么?是用于搜索引擎索引、数据挖掘,还是其他? 面试官:搜索引擎索引。 应聘者:网络爬虫每月能收集多少个网页? 面试官:10 亿个网页。 应聘者:包括哪些内容类型?只包括 HTML,还是包括其他内容类型,如 PDF 和图片? 面试官:只包括 HTML。 应聘者:我们应该考虑新增加的或编辑过的网页吗? 面试官:是的,我们应该考虑新添加或编辑过的网页。 应聘者:我们是否需要存储从网上抓取的 HTML 网页? 面试官:需要。是的,最多 5 年。 应聘者:我们如何处理有重复内容的网页? 面试官:有重复内容的页面应该被忽略。 以上是一些你可以问面试官的样本问题。理解需求并澄清含糊不清的地方是很重要的。即使你被要求设计一个简单的产品,如网络爬虫,你和你的面试官也可能有不同的假设。 除了与面试官澄清功能外,记下一个好的网络爬虫的以下特点也很重要。 可伸缩。网络是非常大的。那里有数十亿的网页。网络爬虫应该使用并行化技术,效率极高。 健壮性。网络中充满了陷阱。坏的 HTML、无反应的服务器、崩溃、恶意链接等都很常见。爬虫器必须处理所有这些边缘情况。 礼貌性。爬虫不应该在很短的时间间隔内向一个网站发出过多的请求。 可扩展性。该系统是灵活的,因此需要最小的变化来支持新的内容类型。例如,如果我们想在将来抓取图像文件,我们应该不需要重新设计整个系统。 粗略估计 下面的估计是基于许多假设,与面试官沟通以保持一致是很重要的。 假设每个月有 10 亿个网页被下载。 QPS:1,000,000,000 / 30 天 / 24 小时 / 3600 秒 =~ 400 页/秒。 峰值 QPS = 2 * QPS = 800 假设平均网页大小为 500k。 10 亿页 x 500k = 每月 500TB 存储量。如果你对数字存储单位不清楚,可以再看一下第二章的 “2 的力量"部分。 假设数据存储 5 年,500TB * 12 个月 * 5 年 = 30PB。储存五年的内容需要一个 30PB 的存储。 提出高层次的设计并获得认同 一旦需求明确了,我们就开始进行高层设计。受以前关于网络抓取的研究[4][5]的启发,我们提出了一个高层设计,如图 9-2 所示。 ...