一、概述
Web机器人(Web Robots)是一种Web客户端的软件程序,它自动发起一系列的Web事务,从而在没有人工参与的状态下完成各种Web数据的搜集和处理。
典型的Web机器人有:
- 股票绘图机器人(Stock-graphing robots)——用于从股票交易服务器上获取股票价格变化的数据,并绘制出走势图。
- 商品比较机器人(Comparison-shopping robots)——用于从各个在线商店中获取包含各种商品及其价格的网页,进而构建商品数据库。
- Web爬虫(Crawlers)——作为搜索引擎的核心,它负责逐个爬取网页链接并搜集文档,从而为搜索引擎进一步构建全文索引数据库(Full-text index database)提供最原始的数据。
二、Web爬虫
Web爬虫的处理过程可以简单概括如下:
1) 选择初始URL集(Root Set):设置待抓取的URL列表,加入初始URL。
2) 抓取网页:如果URL列表为空,表明抓取完毕;否则取出一个URL,抓取对应网页。
3) 提取URL链接:从当前网页中提取出有效的URL链接,加入URL列表,然后跳到第2)步。
1. 选择初始URL集
选择思路:用尽可能少的URL(根据内在的链接关系)覆盖尽可能多的目标网页。
一个比较好的初始URL集的典型组成:一个热门站点(如http://www.sina.com)+ 刚刚新建的一些网页 + 比较孤僻的一些网页(很少被其他网页链接到)。一些大型搜索引擎的Web爬虫就提供了相应机制,让用户来提交一些新建的网页和孤僻的网页,从而帮助提高Web爬虫的覆盖范围。
2. 抓取网页
如果Web爬虫得到一个URL就抓取一个网页,那码农们将会多么的欢快。
残酷的现实是,URL重复(dups)会让网页抓取惹上麻烦,Web爬虫会因此抓取到很多重复的网页,从降低了结果的可用性;更有甚者,URL重复很可能构成URL环(loops),进而使得Web爬虫陷入死循环,周而复始地爬行在由一些固定URL组成的环(cycle)上面。
URL重复可能是被恶意构造的(malicious),但多数情况下是自然存在的。
造成URL重复的因素有:
- 网页中存在完全相同的URL
如网页中有两个链接都为http://www.google.com
- 网页中存在功能等效的URL别名(Aliases)
如网页中有一个链接为http://www.baidu.com:80(80是默认端口,可有可无),另一个链接为http://www.baidu.com/index.html#top(index.html是默认首页,可有可无;锚点#top只是网页中的一部分,不会影响到网页层面)
- 文件系统的符号链接环(Filesystem Link Cycles)
如Web服务器www.foo.com的根目录/下有一个文件index.html,还有一个子目录subdir,但事实上subdir是一个指向根目录/的符号链接,因此http://www.foo.com/index.html和http://www.foo.com/subdir/index.html都指向了同一个文件index.html
- 动态虚拟Web空间(Dynamic Virtual Web Spaces)
这种情况其实跟URL重复无关,但同样会造成恶劣的后果。
如一个恶意的Web服务器,当用户请求网页index-fall.html时,服务器实际却执行了一个网关程序(gateway application),动态生成一个虚构网页A,里面包含指向index-fall1.html的URL;此后Web爬虫会继续抓取index-fall1.html,又会收到服务器动态生成的网页B,其中包含指向index-fall2.html的URL,等等。如此一来,可怜的Web爬虫将会一直游走在这些动态生成的虚构网页中,仿佛步入了一个梦幻般的旅程(Alice-in-Wonderland journey)
避免URL重复或URL环的方法有:
- 维护已访问URL列表:避免字面值完全相同的URL
- URL归一化(Canonicalizing URLs):解决URL别名问题
- 模式检测(Pattern detection):解决文件系统的符号链接环问题
- 广度优先(Breadth-first crawling):尽量采用广度优先(Breadth-first)策略,以推迟遭遇URL环陷阱的时间
- 限制抓取的网页总数(Throttling):即使陷入URL环,也会最终因为网页总数限制而退出,从而避免死循环
- URL/站点黑名单(URL/site blacklist):根据以往的经验,将有风险的URL和网站加入黑名单,排除在抓取范围之外,这种方法需要人工参与
- 人工监控:Web世界纷繁复杂,总会遇到技术层面解决不了的问题,此时还得由人来处理
也可以上网搜索“URL去重”等关键字,看看一些具体的解决方案。
3. 提取URL链接
一个网页中往往包含大量的URL链接,这其中的每个链接又会指向一个包含其他URL链接的网页。提取URL链接的策略分为 广度优先(Breadth-first) 和 深度优先(Depth-first) 两种,不同的策略对应的URL处理顺序是不同的。两种策略的正式定义可以上网搜索,这里只根据一个简单的例子加以描述。
例如有网页A、B、C、D、E、F、G,分别对应的URL为a、b、c、d、e、f、g,其中:
网页A中的URL:b、c、d
网页B中的URL:e、f
网页E中的URL:g
则Web爬虫处理网页A时:
广度优先对应的URL处理顺序:b->c->d->e->f->g
深度优先对应的URL处理顺序:b->e->g->f->c->d
三、编写友好的Web机器人
友好的Web机器人,往往更加遵守HTTP标准规范,在索要信息的同时,也会更多地考虑到信息提供者(Web服务器)的需求。
1. 规范的HTTP处理(Robotic HTTP)
Web机器人发出的HTTP请求,通常会包含以下必要HTTP头部:
- User-Agent: 给出Web机器人的名称(后面“机器人拒绝标准”的robots.txt中会用到)
- From: 给出Web机器人的使用者/管理员的email地址(满足RFC 822规范的email地址格式)
- Accept: 给出Web机器人希望收到的内容类型
- Referer: 给出包含当前被请求URL的页面的URL(便于Web服务器跟踪自己的站点内容是如何被找到的)
- HOST: 给出目标主机名称,在虚拟主机(Virtual Hosting)的情况下,方便Web服务器在多个虚拟站点中找出客户请求的目标站点
- 条件请求(Conditional Requests):如If-Modified-Since、If-Match等,具体视需求而定,用以减少Web机器人不必要的抓取
2. Web机器人的不当行为(Misbehaving Robots)
- 由于Web机器人的编程错误或者陷入URL环,导致Web服务器由于过载而不能被其他用户正常访问
- 盲目抓取并公布他人不愿公开的私密信息
- 胡乱抓取过时或无法访问的URL
3. 非请勿入(Excluding Robots)
由于Web机器人可能导致的上述问题,如何限制那些肆意妄为的Web机器人就显得尤为重要。
限制Web机器人的方法主要有两种:机器人拒绝标准(通常又称为robots.txt)和机器人控制标记。其中,robots.txt提供给站点管理员使用,而机器人控制标记则面向HTML网页的作者。
值得注意的是,robots.txt和机器人控制标记都是“君子约定”,如果有Web机器人不想按规矩办事,那这些约定对它就完全不起作用了。
1)robots.txt
“机器人拒绝标准”(Robots Exclusion Standard)目前有v0.0、v1.0和v2.0三个修订版本,这里重点关注v1.0版本的标准:《A Method for Web Robots Control》。
标准中指出,在访问一个Web站点的任何URL前,Web机器人应该首先请求获取该站点的robots.txt,根据Web服务器的响应结果作出以下处理:
- 如果返回成功(HTTP状态码2XX),则Web机器人需要分析robots.txt的内容,并在抓取站点内容时遵守其中的限制规则
- 如果返回不存在(HTTP状态码404),则Web机器人认为该站点没有限制规则,可以随意抓取站点内容
- 如果返回访问受限(HTTP状态码401或403),则表明对于该站点而言,Web机器人是被完全限制的
- 如果返回临时错误(HTTP状态码503),则Web机器人应该尝试稍后访问该站点,直到成功获取到robots.txt为止
- 如果返回重定向(HTTP状态码3XX),则Web机器人应该沿着重定向路径一直向下,知道成功找到robots.txt为止
robots.txt文件的格式User-Agent行和Disallow/Allow行组成。一个典型的robots.txt如下所示:
User-Agent: slurp
User-Agent: webcrawler
Allow: /private/others
Disallow: /private
User-Agent: *
Disallow:
该文件允许机器人slurp和webcrawler访问/private中/others下的内容,但不能访问/private中的其他内容,另外还可以访问除了/private目录以外的其他任何内容;而其他机器人则无法访问本站点的任何内容。
现实生活中的robots.txt例子可以参考 http://www.baidu.com/robots.txt 和 http://www.google.com/robots.txt 等。
2)机器人控制标记(HTML Robot-Control META Tags)
机器人控制标记采用HTML文档的META标记,一般格式如下:
<META NAME="ROBOTS" CONTENT=directive-list>
指令列表(directive-list)中最常用的两个选项是NOINDEX和NOFOLLOW,其他的可选项有INDEX、FOLLOW、NOARCHIVE、ALL、NONE。
四、搜索引擎
搜索引擎的TOP框架图如下:
有几个概念需要关注:全文索引数据库(Full-text index database)、URL查询字符串,相关度排序,关键字欺骗(Spoofing)。