通常我们习惯称“web机器人”为“爬虫”、当然“蜘蛛”、“蠕虫”等有时候也被用来称呼web爬虫。爬虫是能够在无需人类干预的情况下自动进行一系列 Web 事务处理的软件程序。
因特网搜索引擎使用爬虫在 Web 上游荡,并把它们碰到的文档全部拉回来。然后对这些文档进行处理,形成一个可搜索的数据库,以便用户查找包含了特定单词的文档。网上有数万亿的 Web 页面需要查找和取回,这些搜索引擎蜘蛛必然是些最复杂的机器人。
爬虫开始访问的 URL 初始集合被称作根集(root set)。这是爬虫的起点。挑选根集时,应该从足够多不同的站点中选择 URL,这样,爬遍所有的链接才能最终到达大部分你感兴趣的 Web 页面。通常,一个好的根集会包括一些大的流行 Web 站点(比如 http://www.yahoo.com)、一个新创建页面的列表和一个不经常被链接的无名页面列表。很多大规模的爬虫产品,比如因特网搜索引擎使用的那些爬虫,都为用户提供了向根集中提交新页面或无名页面的方式。这个根集会随时间推移而增长,是所有新爬虫的种子列表。
爬虫在 Web 上移动时,会不停地对 HTML 页面进行解析。它要对所解析的每个页面上的 URL 链接进行分析,并将这些链接添加到需要爬行的页面列表中去。
机器人在 Web 上爬行时,要特别小心不要陷入循环。
它们会使爬虫陷入可能会将其困住的循环之中。循环会使未经良好设计的爬虫不停地兜圈子,把所有时间都耗费在不停地获取相同的页面上。爬虫会消耗掉很多网络带宽,可能完全无法获取任何其他页面了。
爬虫不断地获取相同的页面时,另一端的 Web 服务器也在遭受着打击。如果爬虫与服务器连接良好,它就会击垮 Web 站点,阻止所有真实用户访问这个站点。这种拒绝服务是可以作为法律诉讼理由的。
即使循环自身不是什么问题,爬虫也是在获取大量重复的页面 [通常被称为“dups”(重复),以便与“loops”(循环)押韵 ]。爬虫应用程序会被重复的内容所充斥,这样应用程序就会变得毫无用处。返回数百份完全相同页面的因特网搜索引擎就是一个这样的例子。
如果要爬行世界范围(搜索引擎就是在世界范围内进行爬行)内的一大块 Web 内容,就要做好访问数十亿 URL 的准备。记录下哪些 URL 已经访问过了是件很具挑战的事情。由于 URL 的数量巨大,所以,要使用复杂的数据结构以便快速判定哪些 URL 是曾经访问过的。数据结构在访问速度和内存使用方面都应该是非常高效的。
这里列出了大规模 Web 爬虫对其访问过的地址进行管理时使用的一些有用的技术。
由于 URL“别名”的存在,即使使用了正确的数据结构,有时也很难分辨出以前是否访问过某个页面。如果两个 URL 看起来不一样,但实际指向的是同一资源,就称这两个 URL 互为“别名”。例如:
(1) 如果没有指定端口的话,就向主机名中添加“:80”。
(2) 将所有转义符 %xx 都转换成等价字符。
(3) 删除 # 标签。 通过上述的3中手段可以解决a-c的问题,但是d-f的问题很难解决。
文件系统中的符号连接会造成特定的潜在环路,因为它们会在目录层次深度有限的情况下,造成深度无限的假象。 但由于 URL 看起来有所不同,所以机器人无法单从 URL 本身判断出文档是相同的。毫无戒备的机器人就有了陷入循环的危险。如果没有某种循环检测方式,这个环路就会继续下去,通常会持续到 URL的长度超过机器人或服务器的限制为止。
一些更复杂的 Web 爬虫会使用指纹这种更直接的方式来检测重复。使用内容指纹的机器人会获取页面内容中的字节,并计算出一个校验和(checksum)。这个校验和是页面内容的压缩表示形式。如果机器人获取了一个页面,而此页面的校验和它曾经见过,它就不会再去爬行这个页面的链接了——如果机器人以前见过页面的内容,它就已经爬行过页面上的链接了。必须对校验和函数进行选择,以求两个不同页面拥有相同校验和的几率非常低。MD5 这样的报文摘要函数就常被用于指纹计算。有些 Web 服务器会在传输过程中对页面进行动态的修改,所以有时机器人会在校验和的计算中忽略 Web 页面内容中的某些部分,比如那些嵌入的链接。而且,无论定制了什么页面内容的动态服务器端包含(比如添加日期、访问计数等)都可能会阻碍重复检测。
Web 就是一片荒野。勇敢的机器人最终总会陷入一个采用任何技术都无能为力的困境。设计所有产品级机器人时都要有诊断和日志功能,这样人类才能很方便地监视机器人的进展,如果发生了什么不寻常的事情就可以很快收到警告。在某些情况下,愤怒的网民会给你发送一些无礼的邮件来提示你出了问题。
994 年,人们提出了一项简单的自愿约束技术,可以将机器人阻挡在不适合它的地方之外,并为网站管理员提供了一种能够更好地控制机器人行为的机制。这个标准被称为“拒绝机器人访问标准”,但通常只是根据存储访问控制信息的文件而将其称为 robots.txt。(该技术是基于自愿的原则上的,而非强制约束,并且也不具备法律效力)
robots.txt 的思想很简单。所有 Web 服务器都可以在服务器的文档根目录中提供一个可选的、名为 robots.txt 的文件。这个文件包含的信息说明了机器人可以访问服务器的哪些部分。如果机器人遵循这个自愿约束标准,它会在访问那个站点的所有其他资源之前,从 Web 站点请求 robots.txt 文件。
如果一个 Web 站点有 robots.txt 文件,那么在访问这个 Web 站点上的任意 URL 之前,机器人都必须获取它并对其进行处理。由主机名和端口号定义的整个 Web 站点上仅有一个 robots.txt 资源。(例如:https://www.baidu.com/robots.txt)如果这个站点是虚拟主机,每个虚拟的 docroot 都可以有一个不同的 robots.txt 文件,像所有其他文件一样。。如果服务器以 404 Not Found HTTP 状态码进行响应,机器人就可以认为这个服务器上没有机器人访问限制,它可以请求任意的文件。
《HTTP权威指南》