zl程序教程

您现在的位置是:首页 >  硬件

当前栏目

web机器人

2023-06-13 09:13:11 时间

web机器人

通常我们习惯称“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查找的软件数据结构。
  • 有损的存在位图 为了减小空间,一些大型爬虫会使用有损数据结构,比如存在位数组(presencebit array)。用一个散列函数将每个 URL 都转换成一个定长的数字,这个数字在数组中有个相关的“存在位”。爬行过一个 URL 时,就将相应的“存在位”置位。如果存在位已经置位了,爬虫就认为已经爬行过那个 URL 了。
  • 检查点 一定要将已访问 URL 列表保存到硬盘上,以防机器人程序崩溃。
  • 分类 随着 Web 的扩展,在一台计算机上通过单个机器人来完成爬行就变得不太现实了。那台计算机可能没有足够的内存、磁盘空间、计算能力,或网络带宽来完成爬行任务。有些大型 Web 机器人会使用机器人“集群”,每个独立的计算机是一个机器人,以汇接方式工作。为每个机器人分配一个特定的 URL“片”,由其负责爬行。这些机器人配合工作,爬行整个 Web。机器人个体之间可能需要相互通信,来回传送 URL,以覆盖出故障的对等实体的爬行范围,或协调其工作。

由于 URL“别名”的存在,即使使用了正确的数据结构,有时也很难分辨出以前是否访问过某个页面。如果两个 URL 看起来不一样,但实际指向的是同一资源,就称这两个 URL 互为“别名”。例如:

(1) 如果没有指定端口的话,就向主机名中添加“:80”。

(2) 将所有转义符 %xx 都转换成等价字符。

(3) 删除 # 标签。 通过上述的3中手段可以解决a-c的问题,但是d-f的问题很难解决。

文件系统中的符号连接会造成特定的潜在环路,因为它们会在目录层次深度有限的情况下,造成深度无限的假象。 但由于 URL 看起来有所不同,所以机器人无法单从 URL 本身判断出文档是相同的。毫无戒备的机器人就有了陷入循环的危险。如果没有某种循环检测方式,这个环路就会继续下去,通常会持续到 URL的长度超过机器人或服务器的限制为止。

  1. 恶意网管可能会有意创建一些复杂的爬虫循环来陷害那些无辜的、毫无戒备的机器人。尤其是,发布一个看起来像普通文件,实际上却是网关应用程序的 URL 是很容易的。这个应用程序可以在传输中构造出包含了到同一服务器上虚构 URL 链接的HTML。请求这些虚构的 URL 时,这个邪恶的服务器就会捏造出一个带有新的虚构URL 的新 HTML 页面来。每次的 URL 和 HTML看起来都有很大的不同,机器人很难检测到环路。
  2. 避免循环和重复
    • 规范化 URL 将 URL 转换为标准形式以避免语法上的别名
    • 广度优先的爬行 每次爬虫都有大量潜在的 URL 要去爬行。以广度优先的方式来调度 URL 去访问Web 站点,就可以将环路的影响最小化。即使碰到了机器人陷阱,也可以在回到环路中获取的下一个页面之前,从其他 Web 站点中获取成百上千的页面。如果采用深度优先方式,一头扎到单个站点中去,就可能会跳入环路,永远无法访问其他站点。
    • 节流 限制一段时间内机器人可以从一个 Web 站点获取的页面数量。如果机器人跳进了一个环路,试图不断地访问某个站点的别名,也可以通过节流来限制重复的页面总数和对服务器的访问总数。
    • 限制 URL 的大小 机器人可能会拒绝爬行超出特定长度(通常是 1KB)的 URL。如果环路使 URL的长度增加,长度限制就会最终终止这个环路。有些 Web 服务器在使用长 URL时会失败,因此,被 URL 增长环路困住的机器人会使某些 Web 服务器崩溃。这会让网管错误地将机器人当成发起拒绝服务攻击的攻击者。要小心,这种技术肯定会让你错过一些内容。现在很多站点都会用 URL 来管理用户的状态(比如,在一个页面引用的 URL 中存储用户 ID)。用 URL 长度来限制爬虫可能会带来些麻烦;但如果每当请求的 URL 达到某个特定长度时,都记录一次错误的话,就可以为用户提供一种检查某特定站点上所发生情况的方法。
    • URL/ 站点黑名单 维护一个与机器人环路和陷阱相对应的已知站点及 URL 列表,然后像躲避瘟疫一样避开它们。发现新问题时,就将其加入黑名单。这就要求有人工进行干预。但现在很多大型爬虫产品都有某种形式的黑名单,用于避开某些存在固有问题或者有恶意的站点。还可以用黑名单来避开那些对爬行大惊小怪的站点。
    • 模式检测 文件系统的符号连接和类似的错误配置所造成的环路会遵循某种模式;比如,URL 会随着组件的复制逐渐增加。有些机器人会将具有重复组件的 URL 当作潜在的环路,拒绝爬行带有多于两或三个重复组件的 URL。重复并不都是立即出现的(比如,“/subdir/subdir/subdir…”)。有些环路周期能为2或其他间隔,比如“/subdir/images/subdir/images/subdirimages/…”。有些机器人会查找具有几种不同周期的重复模式。
    • 内容指纹

    一些更复杂的 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权威指南》