Web机器人就是自活跃的用户代理,它能够在无需人类干预的情况下自动进行一系列web事务处理的程序。

Web机器人可以从一个站点到另一个web站点,获取内容,跟踪链接并对它们找到的数据进行处理。根据web机器人自动探查web站点的方式,web机器人被授予为不同的名称:“爬虫”、“蜘蛛”、“蠕虫”等。

一. 爬虫

爬虫会递归的地对web站点进行遍历,获取它所需要的内容,建立自己的数据库。

1.1 爬虫的起点

在运行爬虫时,需要给爬虫一个起点的集合,这个URL初始集合叫根集。挑选根集时,应该从足够多不同的站点中选择URL,保证爬虫获取的所有链接中大部分时感兴趣的链接。一个好的根集会包括一些大的流行web站点、一个新创建页面的列表和一个不经常被链接的无名页面列表。很多搜索引擎爬虫都为用户提供了向根集中提交新页面的方式。比如百度站长工具,谷歌的Search Console。

1.2 提取链接

爬虫在web上运行时,会不断地解析HTML页面。它要对所解析的每个页面的URL链接进行分析,并将这些URL添加到需要爬行的列表中。爬虫需要解析HTML,提取URL,并将相对URL转换为绝对URL。

很明显,爬虫需要记录曾经爬取过的URL。因特网的web页面数以亿计,其中还不包括那些由动态网关产生的内容。因此要记录爬取过的URL,需要使用精心设计的数据结构来存储数据,以保证访问速度和内存使用方面都能够接受。

大规模web爬虫对其访问过的地址进行管理时使用的技术有:

  • 树和散列表。加速URL的查找
  • 有损的存在位图
    将每个URL转换为一个定长数字,这个数字在数组中有一个对应的“位”。如果URL已经访问过该位就置位。
  • 集群

1.3 避免环路

爬虫在运行过程中,要避免陷入循环。循环会使未经良好设计的爬虫不停的兜圈子,消耗网络带宽,影响被爬取的服务器。

1.3.1 URL别名导致的环路

由于URL别名的存在,即使使用了正确的数据结构,有时也很难分辨出是否访问过某个页面。大多数web机器人通过将URL规范化位标准格式来消除URL别名。例如:

  1. 如果没有指定端口,就向主机名添加“:80”
  2. 将转义字符%xx转换为等价字符
  3. 删除#标签

即使对URL进行了也无法完全避免环路。有时,爬虫需要知道web服务器是否大小写敏感,web服务器是否位进行虚拟主机

1.3.2 文件系统的符号链接也会导致环路

1.3.3 动态虚拟web空间

恶意的网管可能会有意创建一些复杂的爬虫循环。尤其是发布一个看起来普通文件,实际上却是网关应用程序的URL。

1.3.4 如何避免环路

  1. 规范化URL(上面提到了)
  2. 广度优先爬行可以将环路的影响最小化
  3. 节流。限制一段时间内机器人可以从一个web站点获取的页面数量
  4. 限制URL的大小
  5. 维护一个URL/站点黑名单
  6. 模式匹配检测。不爬取符合某种模式的URL
  7. 内容指纹。根据web页面内容计算校验和,通过校验和比较页面是否被爬取过。例如通过MD5计算校验和
  8. 人工监视

二. web机器人的HTTP

  1. web机器人可以发送一些首部来帮助web站点工作。
    • User-Agent
      将发起请求的机器人名字告诉服务器
    • From
      提供机器人的管理者的email
    • Accept
      告诉服务器可以发送哪些媒体类型
    • Referer
      提供包含了当前请求URL文档的URL
  2. 条件请求
    对因特网机器人来说,需要下载的潜在页面有数十亿,所以只在内容发生变化时才重新获取内容时很有意义的。可以用条件http请求来判断页面是否发生变化。
  3. 行为不当的机器人
    • 垃圾机器人:机器人发起http请求的速度比人类快的多。如果机器人的逻辑有问题就可能会使web服务器过载
    • 失效的URL:有的机器人会去访问老旧的URL列表,其中很多URL已经失效。这回导致web服务器的日志中充斥着大量错误日志。
    • 很长的错误URL:由于机器人的程序错误,可能会向web服务器发送很长的错误的无意义的URL,会降低web服务器的性能。

三. 拒绝机器人访问

两种方式:

  1. robots.txt
  2. robot-control标签

3.1 robots.txt

1994年人们提出了一项简单的自愿约束技术,可以将机器人阻挡在不适合它的地方之外,并为网站管理员提供了一种能够更好地控制机器人行为的机制。这个标准称为“拒绝机器人访问标准”,但通常只是根据存储访问控制信息的文件robots.txt。

所有的web服务器哦度可以在服务器的文档根目录中提供一个可选的robots.txt文件。这个文件包含的信息说明了机器人可以访问服务器的哪些部分。如果机器人遵循这个自愿约束标准,它会在访问那个站点的所有其他资源之前,从web站点请求robots.txt文件,验证是否可以进行访问。

robots.txt文件格式

文件内容三种类型:注释、空行、规则行

# this is a robots.txt
User-Agent: slurp
User-Agent: webcrawler
Disallow: /private

User-Agent: *
Disallow:

3.2 robot-control标签

在html页面上添加robot-control标签,遵循html标签协议规则的机器人仍然可以获取文档,但如果其中有机器人排斥标签,它们就会忽略这些文档。

<META NAME="ROBOTS" CONTENT=directive-list>

CONTENT的值有以下几种:

  • NOINDEX:不要对页面内容处理,不要在任何索引或数据库中包含此内容
  • NOFOLLOW:不要爬行这个页面的任何外连链接
  • INDEX
  • FOLLOW
  • NOARCHIVE:不要缓存这个页面的本地副本
  • ALL:=INDEX,FOLLOW
  • NONE:=NOINDEX,NOFOLLOW

其他meta标签

对内容索引型的搜索机器人来说,description和keywords meta标签非常有用。

<META NAME="description" CONTENT=directive-list>
<META NAME="keywords" CONTENT=directive-list>
  • description:短小的摘要描述web页面
  • keywords:逗号分隔的关键词列表。