3月阅读周·HTTP权威指南:Web机器人之爬虫及爬行方式篇
【摘要】 引言HTTP(Hypertext Transfer Protocol,超文本传输协议[插图])是在万维网上进行通信时所使用的协议方案。HTTP有很多应用,但最著名的是用于Web浏览器和Web服务器之间的双工通信。《HTTP权威指南》一书将HTTP中一些互相关联且常被误解的规则梳理清楚,并编写了一系列基于各种主题的章节介绍HTTP各方面的特性。纵观全书,对HTTP“为什么”这样做进行了详细的解...
引言
HTTP(Hypertext Transfer Protocol,超文本传输协议[插图])是在万维网上进行通信时所使用的协议方案。HTTP有很多应用,但最著名的是用于Web浏览器和Web服务器之间的双工通信。
《HTTP权威指南》一书将HTTP中一些互相关联且常被误解的规则梳理清楚,并编写了一系列基于各种主题的章节介绍HTTP各方面的特性。纵观全书,对HTTP“为什么”这样做进行了详细的解释,而不仅仅停留在它是“怎么做”的。此外,这本书还介绍了很多HTTP应用程序正常工作所必需且重要的非HTTP技术。
这本书主要包括以下内容:
- 第一部分描述了Web的基础构件与HTTP的核心技术
- 第二部分重点介绍了Web系统的结构构造块:HTTP服务器、代理、缓存、网关以及机器人应用程序。
- 第三部分提供了一套用于追踪身份、增强安全性以及控制内容访问的技术和技巧。
- 第四部分涵盖HTTP报文主体和Web标准,前者包含实际内容,后者描述并处理主体内容。
- 第五部分介绍了发布和传播Web内容的技巧。
- 第六部分是一些很有用的参考附录,以及相关技术的教程。
Web机器人
Web机器人是能够在无需人类干预的情况下自动进行一系列Web事务处理的软件程序。很多机器人会从一个Web站点逛到另一个Web站点,获取内容,跟踪超链,并对它们找到的数据进行处理。根据这些机器人自动探查Web站点的方式,人们为它们起了一些各具特色的名字,比如“爬虫”、“蜘蛛”、“蠕虫”以及“机器人”等,就好像它们都有自己的头脑一样。
爬虫及爬行方式
Web爬虫是一种机器人,它们会递归地对各种信息性Web站点进行遍历,获取第一个Web页面,然后获取那个页面指向的所有Web页面,然后是那些页面指向的所有Web页面,依此类推。递归地追踪这些Web链接的机器人会沿着HTML超链创建的网络“爬行”,所以将其称为爬虫(crawler)或蜘蛛(spider)。
从哪儿开始:根集
在把饥饿的爬虫放出去之前,需要给它一个起始点。爬虫开始访问的URL初始集合被称作根集(root set)。挑选根集时,应该从足够多不同的站点中选择URL,这样,爬遍所有的链接才能最终到达大部分你感兴趣的Web页面。
根集中并不需要有很多页面,就可以涵盖一大片Web结构。
通常,一个好的根集会包括一些大的流行Web站点、一个新创建页面的列表和一个不经常被链接的无名页面列表。很多大规模的爬虫产品,比如因特网搜索引擎使用的那些爬虫,都为用户提供了向根集中提交新页面或无名页面的方式。这个根集会随时间推移而增长,是所有新爬虫的种子列表。
链接的提取以及相对链接的标准化
爬虫在Web上移动时,会不停地对HTML页面进行解析。它要对所解析的每个页面上的URL链接进行分析,并将这些链接添加到需要爬行的页面列表中去。随着爬虫的前进,当其发现需要探查的新链接时,这个列表常常会迅速地扩张。爬虫要通过简单的HTML解析,将这些链接提取出来,并将相对URL转换为绝对形式。
避免环路的出现
机器人在Web上爬行时,要特别小心不要陷入循环,或环路(cycle)之中。
机器人必须知道它们到过何处,以避免环路的出现。环路会造成机器人陷阱,这些陷阱会暂停或减缓机器人的爬行进程。
循环与复制
至少出于下列三个原因,环路对爬虫来说是有害的。
- 它们会使爬虫陷入可能会将其困住的循环之中。循环会使未经良好设计的爬虫不停地兜圈子,把所有时间都耗费在不停地获取相同的页面上。爬虫会消耗掉很多网络带宽,可能完全无法获取任何其他页面了。
- 爬虫不断地获取相同的页面时,另一端的Web服务器也在遭受着打击。如果爬虫与服务器连接良好,它就会击垮Web站点,阻止所有真实用户访问这个站点。这种拒绝服务是可以作为法律诉讼理由的。
- 即使循环自身不是什么问题,爬虫也是在获取大量重复的页面 [通常被称为“dups”(重复),以便与“loops”(循环)押韵]。爬虫应用程序会被重复的内容所充斥,这样应用程序就会变得毫无用处。返回数百份完全相同页面的因特网搜索引擎就是一个这样的例子。
面包屑留下的痕迹
但是,记录曾经到过哪些地方并不总是一件容易的事。编写本书时,因特网上有数十亿个不同的Web页面,其中还不包括那些由动态网关产生的内容。
如果要爬行世界范围内的一大块Web内容,就要做好访问数十亿URL的准备。记录下哪些URL已经访问过了是件很具挑战的事情。由于URL的数量巨大,所以,要使用复杂的数据结构以便快速判定哪些URL是曾经访问过的。数据结构在访问速度和内存使用方面都应该是非常高效的。
数亿URL需要具备快速搜索结构,所以速度是很重要的。穷举搜索URL列表是根本不可能的。机器人至少要用到搜索树或散列表,以快速判定某个URL是否被访问过。
数亿URL还会占用大量的空间。如果平均每个URL有40个字符长,而且一个Web机器人要爬行5亿个URL(只是Web的一小部分),那么搜索数据结构只是存储这些URL就需要20GB或更多的存储空间(40字节/URL×5亿个URL = 20GB)!
这里列出了大规模Web爬虫对其访问过的地址进行管理时使用的一些有用的技术。
- 树和散列表:复杂的机器人可能会用搜索树或散列表来记录已访问的URL。这些是加速URL查找的软件数据结构。
- 有损的存在位图为了减小空间,一些大型爬虫会使用有损数据结构,比如存在位数组(presence bit array)。用一个散列函数将每个URL都转换成一个定长的数字,这个数字在数组中有个相关的“存在位”。爬行过一个URL时,就将相应的“存在位”置位。如果存在位已经置位了,爬虫就认为已经爬行过那个URL了。
- 检查点:一定要将已访问URL列表保存到硬盘上,以防机器人程序崩溃。
- 分类:随着Web的扩展,在一台计算机上通过单个机器人来完成爬行就变得不太现实了。那台计算机可能没有足够的内存、磁盘空间、计算能力,或网络带宽来完成爬行任务。有些大型Web机器人会使用机器人“集群”,每个独立的计算机是一个机器人,以汇接方式工作。为每个机器人分配一个特定的URL“片”,由其负责爬行。这些机器人配合工作,爬行整个Web。机器人个体之间可能需要相互通信,来回传送URL,以覆盖出故障的对等实体的爬行范围,或协调其工作。
别名与机器人环路
由于URL“别名”的存在,即使使用了正确的数据结构,有时也很难分辨出以前是否访问过某个页面。如果两个URL看起来不一样,但实际指向的是同一资源,就称这两个URL互为“别名”。
规范化URL
大多数Web机器人都试图通过将URL“规范化”为标准格式来消除上面那些显而易见的别名。机器人首先可先通过下列步骤将每个URL都转化为规范化的格式。
(1)如果没有指定端口的话,就向主机名中添加“:80”。
(2)将所有转义符%xx都转换成等价字符。
(3)删除#标签。
经过这些步骤就可以消除别名问题了。
- 机器人需要知道Web服务器是否是大小写无关的才能避免别名问题。
- 机器人需要知道Web服务器上这个目录下的索引页面配置才能知道是否是别名。
- 即使机器人知道主机名和IP地址都指向同一台计算机,它也还要知道Web服务器是否配置为进行虚拟主机操作,才能知道这个URL是不是别名。URL规范化可以消除一些基本的语法别名,但机器人还会遇到其他的、将URL转换为标准形式也无法消除的URL别名。
URL规范化可以消除一些基本的语法别名,但机器人还会遇到其他的、将URL转换为标准形式也无法消除的URL别名。
文件系统连接环路
文件系统中的符号连接会造成特定的潜在环路,因为它们会在目录层次深度有限的情况下,造成深度无限的假象。符号连接环路通常是由服务器管理员的无心错误造成的,但“邪恶的网管”也可能会恶意地为机器人制造这样的陷阱。
subdir/是个指向“/”的环路,但由于URL看起来有所不同,所以机器人无法单从URL本身判断出文档是相同的。毫无戒备的机器人就有了陷入循环的危险。如果没有某种循环检测方式,这个环路就会继续下去,通常会持续到URL的长度超过机器人或服务器的限制为止。
总结
因特网搜索引擎使用爬虫在Web上游荡,并把它们碰到的文档全部拉回来。然后对这些文档进行处理,形成一个可搜索的数据库,以便用户查找包含了特定单词的文档。网上有数万亿的Web页面需要查找和取回,这些搜索引擎蜘蛛必然是些最复杂的机器人。
作者介绍
非职业「传道授业解惑」的开发者叶一一。
《趣学前端》、《CSS畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏⭐️ | 留言📝。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)