在本章中,我们将重点介绍网络爬虫设计:一种有趣而经典的系统设计
面试问题。
网络爬虫被称为机器人或蜘蛛。它被搜索引擎广泛用于发现网络上的新内容或更新内容。内容可以是网页、图像、视频、PDF文档等。网络爬虫首先收集一些网页,然后跟踪这些网页上的链接页面以收集新内容。图 9-1 显示了爬网过程的直观示例。
爬虫有多种用途:
开发网络爬虫的复杂性取决于我们打算支持的规模。它可以是一个只需要几个小时就能完成的小型学校项目,也可以是一个巨大的项目需要专门的工程团队持续改进的项目。因此,我们将在下面探讨要支持的规模和功能。
网络爬虫的基本算法很简单:
网络爬虫真的像这个基本算法一样简单吗?不完全是。设计一个可扩展的网络爬虫是一项极其复杂的任务。任何人都不太可能设计面试期间的大型网络爬虫。在开始设计之前,我们必须提出问题以了解需求并确定设计范围:
应聘者:爬虫的主要用途是什幺?它是否用于搜索引擎索引,数据挖掘,还是别的什幺?
面试官:搜索引擎索引。
应聘者:网络爬虫每月收集多少个网页?
面试官:10 亿页。
应聘者:包括哪些内容类型?仅限 HTML 或其他内容类型,例如还有 PDF 和图像?
面试官:仅限 HTML。
应聘者:我们可以考虑新添加或编辑的网页吗?
面试官:是的,我们应该考虑新添加或编辑的网页。
应聘者:我们需要存储从网络上抓取的 HTML 页面吗?
面试官:是的,最长 5 年
应聘者:如何处理重复内容的网页?
面试官:包含重复内容的页面应被忽略
以上是您可以向面试官提出的一些示例问题。重要的是了解要求并澄清歧义。即使你被要求设计一个
像网络爬虫这样的简单产品,你和你的面试官也可能有不一样的想法。
除了与面试官澄清的功能外,记下一个好的网络爬虫的以下特征:
以下估计基于许多假设,重要的是与面试官沟通以达成共识。
一旦明确了需求,我们就会继续进行高级设计。灵感来自以前的在对网络爬虫的研究[4] [5]中,我们提出了一个如图9-2所示的高级设计。
首先,我们探索每个设计组件以了解它们的功能。然后我们逐步检查爬虫工作流程。
种子网址
网络爬虫使用种子 URL 作为爬网过程的起点。例如,要抓取大学网站上的所有网页,选择种子 URL 的直观方法是使用大学的域名。要抓取整个网络,我们需要创造性地选择种子 URL。一个好的种子网址作为一个很好的起点,爬虫可以利用它来遍历尽可能多的链接。一般策略是将整个 URL 空间划分为更小的空间。第一个提出的该方法基于地点,因为不同的国家可能有不同的流行网站。另一种方法是根据主题选择种子 URL;例如,我们可以划分 URL 空间购物、体育、医疗保健等。种子 URL 选择是一个开放式问题。你应该不会给出完美的答案。开放思考
网址前沿
大多数现代网络爬虫将爬行状态分为两种:待下载和已下载下载了。存储要下载的 URL 的组件称为 URL Frontier。您可以将其称为先进先出 (FIFO) 队列。有关详细信息URL Frontier,请参阅深入研究。
HTML下载器
HTML 下载器从 Internet 下载网页。通过 URL 边界提供了这些 URL。
DNS解析器
要下载网页,必须将 URL 转换为 IP 地址。超文本标记语言下载器调用DNS解析器来获取URL对应的IP地址。为了例如,自 2019 年 3 月 5 日起,URL www.wikipedia.org 已转换为 IP 地址198.35.26.96。
内容解析器
下载网页后,必须对其进行解析和验证,因为格式错误的网页页面可能会引发问题并浪费存储空间。在中实现内容解析器抓取服务器会减慢抓取过程。因此,内容解析器是一个单独的成分。
内容已存在了?
在线研究[6]显示,29%的网页是重复内容,这可能导致相同的内容被存储多次。我们介绍“看到的内容?”数据结构,消除数据冗余并缩短处理时间。它有助于检测新的之前存储在系统中的内容。要比较两个 HTML 文档,我们可以一个接一个的比较他们。然而,这种方法速度慢且耗时,尤其是当涉及数十亿个网页时。完成这项任务的一个有效方法是比较两个网页的哈希值[7]。
内容存储
它是一个用于存储HTML内容的存储系统。存储系统的选择取决于数据类型、数据大小、访问频率、寿命等因素。磁盘和内存被使用。
网址提取器
URL Extractor 从 HTML 页面中解析并提取链接。图 9-3 显示了一个示例链接提取过程。通过添加以下内容将相对路径转换为绝对 URL“https://en.wikipedia.org”前缀。
URL 过滤器
URL 筛选器排除了“列入黑名单”的网站。
URL Seen?
“URL Seen?”是一种数据结构,用于跟踪之前或已经访问过的 URL最尾端地址。“URL Seen?”有助于避免多次添加相同的 URL增加服务器负载并导致潜在的无限循环。布隆过滤器和哈希表是实现“URL Seen?”组件。我们不会详细介绍 bloom 过滤器和哈希表的实现这里。有关详细信息,请参阅参考资料 [4] [8]。
URL 存储
URL 存储存储已访问的 URL。到目前为止,我们已经讨论了每个系统组件。接下来,我们把它们放在一起来解释工作流。
网络爬虫工作流程
为了更好地逐步解释工作流程,在设计中添加了串行号如图9-4所示。
步骤 1:将种子 URL 添加到 URL 边界
第 2 步:HTML 下载器从 URL Frontier 获取 URL 列表。
第 3 步:HTML 下载器从 DNS 解析器获取 URL 的 IP 地址并启动下载。
第 4 步:内容解析器解析 HTML 页面并检查页面是否格式不正确。
第 5 步:解析和验证内容后,将其传递给“看到的内容”组件。
第 6 步:“看到的内容”组件检查 HTML 页面是否已在存储中。
第 7 步:链接提取器从 HTML 页面中提取链接。
第 8 步:提取的链接将传递到 URL 过滤器。
第 9 步:过滤链接后,它们被传递到“URL Seen?”组件。
第 10 步:“URL Seen”组件检查 URL 是否已经在存储中,如果是,则为之前处理过,不需要做任何事情。
第 11 步:如果之前未处理过 URL,则会将其添加到 URL 边界。
到目前为止,我们已经讨论了高级设计。接下来,我们将讨论最多的重要的建筑构件和技术深度:
您可以将 Web 视为有向图,其中网页充当节点和超链接(URL) 作为边。爬网过程可以看作是从一个 Web 遍历有向图页面给其他人。两种常见的图遍历算法是 DFS 和 BFS。但是,DFS 是通常不是一个好的选择,因为DFS的深度可能很深。BFS 通常由网络爬虫使用,并由先进先出 (FIFO) 实现
队列。在 FIFO 队列中,URL 按照其排队顺序取消排队。但是,这实现有两个问题:
来自同一网页的大多数链接都链接回同一主机。在图 9-5 中,所有wikipedia.com 中的链接是内部链接,使爬虫忙于处理 URL来自同一主机 (wikipedia.com)。当爬虫尝试下载同时,维基百科服务器将充斥着请求。这被认为是“不礼貌的”。
标准 BFS 不考虑 URL 的优先级。网络很大并非每个页面都具有相同的质量和重要性水平。因此,我们可能想要根据URL的页面排名、网络流量、更新频率等确定URL的优先级。
URL 边界
URL 边界有助于解决这些问题。URL 边界是一种存储的数据结构要下载的 URL。URL 边界是确保礼貌的重要组成部分,URL 优先级和新鲜度。书中提到了一些关于URL前沿的值得注意的论文在参考资料[5] [9]中。这些论文的发现如下:
礼貌
通常,网络爬虫应避免向同一托管服务器发送过多请求在短时间内。发送过多的请求被认为是“不礼貌”的,甚至被对待作为拒绝服务 (DOS) 攻击。例如,在没有任何约束的情况下,爬虫可以发送每秒有数千个请求发送到同一个网站。这可能会使网络不堪重负服务器。强制礼貌的一般思路是一次从同一页面下载一页主机。可以在两个下载任务之间添加延迟。礼貌约束是通过维护从网站主机名到下载(工作线程)线程的映射来实现。每个下载器线程都有一个单独的 FIFO 队列,并且仅下载从那个队列。图 9-6 显示了管理礼貌的设计。
队列路由器:确保每个队列(b1、b2、…bn) 仅包含来自同一主机。
FIFO 队列 b1、b2 到 bn:每个队列都包含来自同一主机的 URL。
队列选择器:每个工作线程都映射到一个 FIFO 队列,并且它只下载该队列中的 URL。队列选择逻辑由队列选择器完成。
工作线程 1 到 N。工作线程从同一个线程中一个接一个地下载网页主机。可以在两个下载任务之间添加延迟。
优先权
来自一个关于苹果产品的论坛的随机帖子具有非常不同的分量而不是 Apple 主页上的帖子。尽管它们都有“Apple”关键字,但它是爬虫首先抓取 Apple 主页是明智的。我们根据有用性对 URL 进行优先级排序,这可以通过 PageRank [10] 来衡量,网站流量、更新频率等。 “优先级排序器”是处理 URL 优先级的组件。有关此概念的深入信息,请参阅参考资料 [5] [10]。图 9-7 显示了管理 URL 优先级的设计。
图 9-8 显示了 URL 边界设计,它包含两个模块:
新鲜
网页不断地被添加、删除和编辑。网络爬虫必须定期重新抓取下载的页面以保持我们的数据集最新。重新抓取所有 URL 是时候了 -消耗和资源密集型。下面列出了一些优化新鲜度的策略:
URL Frontier 的存储
在现实世界的搜索引擎抓取中,前沿的 URL 数量可能有数百个数百万[4]。将所有内容放入内存既不持久也不可扩展。保持磁盘中的所有内容都是不受欢迎的,因为磁盘速度很慢;它可以很容易地
成为爬行的瓶颈。
我们采用了混合方法。大多数URL都存储在磁盘上,因此存储空间不是问题。为了降低从磁盘读取和写入磁盘的成本,我们在内存中维护缓冲区以进行入队/出队操作。缓冲区中的数据为定期写入磁盘。
HTML下载器
HTML 下载器使用 HTTP 协议从 Internet 下载网页。
在讨论 HTML 下载器之前,我们首先看一下机器人排除协议。
Robots.txt
Robots.txt,全称为机器人排除协议,是网站用于通信的标准与爬虫。它指定允许爬虫下载哪些页面。在尝试之前爬虫抓取网站时,首先要检查其对应的robots.txt并遵循其规则。
为了避免重复下载 robots.txt 文档,我们缓存该文档的结果。该文档是定期下载并保存到缓存。这是一段 robots.txt 文档,取自https://www.amazon.com/robots.txt。某些目录(例如 Creatorhub)是不允许的对于谷歌机器人。
用户代理:Googlebot
禁止:/creatorhub/*
禁止:/rss/people//reviews
禁止:/gp/pdp/rss//reviews
禁止:/gp/cdp/member-reviews/
禁止:/gp/aw/cr/
除了 robots.txt 之外,性能优化是我们将介绍的另一个重要概念
HTML 下载器。
性能优化
以下是 HTML 下载器的性能优化列表。
1.分布式抓取
为了获得高性能,爬虫作业被分发到多台服务器上,每台服务器运行多个线程。 URL空间被分割成更小的部分;所以,每个下载者负责 URL 的子集。图 9-9 显示了分布式爬网的示例。
2.缓存DNS解析器
DNS 解析器是爬虫的瓶颈,因为 DNS 请求可能会由于以下原因而花费时间:许多 DNS 接口的同步特性。 DNS 响应时间范围从 10 毫秒到200毫秒。一旦某个爬虫线程执行了对 DNS 的请求,其他线程就会被阻塞直到第一个请求完成。维护我们的 DNS 缓存以避免调用 DNS频繁是速度优化的有效技术。我们的 DNS 缓存保留域名名称到 IP 地址的映射,并由 cron 作业定期更新。
3. 地点
按地理位置分布爬网服务器。当爬行服务器距离网站主机较近时,爬虫体验更快的下载时间。设计局部性适用于系统的大部分组件:爬取服务器、缓存、队列、存储等。
4、超时时间短
一些网络服务器响应缓慢或者可能根本不响应。为了避免长时间等待,指定了最长等待时间。如果主机在预定时间内没有响应,爬虫将停止该作业并爬取其他一些页面。
鲁棒性
除了性能优化之外,鲁棒性也是一个重要的考虑因素。我们提出提高系统鲁棒性的几种方法:
可扩展性
随着几乎每个系统的发展,设计目标之一就是使系统变得灵活足以支持新的内容类型。爬虫可以通过插入新的扩展模块。图9-10显示了如何添加新模块。
检测并避免有问题的内容本节讨论如何检测和预防冗余、无意义或有害的内容。
1. 冗余内容
如前所述,近 30% 的网页是重复的。哈希值或校验和帮助检测重复 [11]。
2. 蜘蛛陷阱
蜘蛛陷阱是导致爬虫无限循环的网页。例如,无穷深层目录结构如下:
www.spidertrapexample.com/foo/bar/foo/bar/foo/bar/…
可以通过为 URL 设置最大长度来避免此类蜘蛛陷阱。然而,没有人-存在适合所有尺寸的解决方案来检测蜘蛛陷阱。包含蜘蛛陷阱的网站很容易由于在此类网站上发现了异常大量的网页而进行识别。它是难以开发自动算法来避免蜘蛛陷阱;但是,用户可以手动验证并识别蜘蛛陷阱,然后从爬虫中排除这些网站或应用一些自定义的 URL 过滤器。
3.数据噪声
有些内容几乎没有价值,例如广告、代码片段、垃圾邮件URL 等。这些内容对爬虫没有用处,应尽可能排除。
在本章中,我们首先讨论了一个好的爬虫的特征:可扩展性、礼貌性、可扩展性和健壮性。然后,我们提出了一个设计方案,并讨论了关键组件。构建可扩展的网络爬虫并非易事,因为网络非常庞大,而且到处都是陷阱。尽管我们已经涵盖了许多话题,但我们仍然错过了许多相关的谈话积分:
恭喜你走到这一步!现在拍拍自己的背。干得好!
参考资料
[1] 美国国会图书馆:https://www.loc.gov/websites/
[2] 欧盟网络档案馆:http://data.europa.eu/webarchive
[3] Digimarc:https://www.digimarc.com/products/digimarc-services/piracy-intelligence
[4] Heydon A., Najork M. Mercator:可扩展、可扩展的网络爬虫万维网,2(4) (1999),第219-229页
[5] 作者:Christopher Olston、Marc Najork:网络爬虫http://infolab.stanford.edu/~olston/publications/crawling_survey.pdf
[6] 29% 的网站面临重复内容问题:https://tinyurl.com/y6tmh55y
[7] Rabin M.O. 等人。随机多项式指纹识别 Center for Research in大学艾肯计算实验室计算技术(1981)
[8] B. H. Bloom,“具有允许误差的哈希编码中的空间/时间权衡”,《ACM通讯》,第13卷,第7期,第422-426页,1970年。
[9] 唐纳德·帕特森(Donald J. Patterson),网络爬虫:https://www.ics.uci.edu/~lopes/teaching/cs221W12/slides/Lecture05.pdf
[10] L. Page、S. Brin、R. Motwani 和 T. Winograd,“PageRank 引文排名:为网络带来秩序,“技术报告,斯坦福大学,1998.
[11] 伯顿·布鲁姆。哈希编码中的空间/时间权衡与允许的误差。ACM 通讯,13(7),第 422–426 页,1970 年 7 月。
[12] 谷歌动态渲染:
https://developers.google.com/search/docs/guides/dynamic-rendering
[13] T. Urvoy、T. Lavergne 和 P. Filoche,“使用隐藏样式跟踪网络垃圾邮件相似性“,载于第二届对抗性信息国际研讨会论文集网络上检索,2006 年。
[14] H.-T.Lee、D. Leonard、X. Wang 和 D. Loguinov,“IRLbot:扩展到 60 亿页及其他“,第 17 届国际万维网会议论文集,2008 年。