CHAPTER 9: 《DESIGN A WEB CRAWLER》第九章 设计一个web爬虫
在本章中,我们将重点介绍网络爬虫设计:一种有趣而经典的系统设计
面试问题。
网络爬虫被称为机器人或蜘蛛。它被搜索引擎广泛用于发现网络上的新内容或更新内容。内容可以是网页、图像、视频、PDF文档等。网络爬虫首先收集一些网页,然后跟踪这些网页上的链接页面以收集新内容。图 9-1 显示了爬网过程的直观示例。
爬虫有多种用途:
- 搜索引擎索引:这是最常见的用例。爬虫收集网络页面为搜索引擎创建本地索引。例如Googlebot 就是网络谷歌搜索引擎背后的爬虫。
- Web 存档:这是从 Web 收集信息以保存的过程数据以备将来使用。例如,许多国家图书馆运行爬虫来存档网络网站。值得注意的例子是美国国会图书馆[1]和欧盟网络档案馆[2]。
- 网络挖矿:网络的爆炸性增长为数据挖掘。网络挖掘有助于从互联网上发现有用的知识。为例如,顶级金融公司使用爬虫下载股东大会和年度报告以了解公司的关键举措。
- 网络监控。爬虫有助于监控版权和商标侵权行为通过互联网。例如,Digimarc [3] 利用爬虫来发现盗版作品和报告。
开发网络爬虫的复杂性取决于我们打算支持的规模。它可以是一个只需要几个小时就能完成的小型学校项目,也可以是一个巨大的项目需要专门的工程团队持续改进的项目。因此,我们将在下面探讨要支持的规模和功能。
第 1 步 - 了解问题并确定设计范围
网络爬虫的基本算法很简单:
- 给定一组 URL,下载这些 URL 链接的所有网页。
- 从这些网页中提取 URL
- 将新 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 = 每月 500 TB 存储。如果您不清楚数字存储单元,请再次浏览第 2 章中的“2 的幂”部分。
- 假设数据存储 5 年,则 500 TB * 12 个月 * 5 年 = 30 PB。一个 30 PB需要存储来存储五年的内容。
第 2 步 - 提出高级设计并获得支持
一旦明确了需求,我们就会继续进行高级设计。灵感来自以前的在对网络爬虫的研究[4] [5]中,我们提出了一个如图9