一、概述

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.txthttp://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)。

【读书笔记】《HTTP权威指南》:Web Robots的更多相关文章

  1. [读书笔记] CSS权威指南2: 结构和层叠

    层叠样式表中最基本的一个方面可能就是层叠——冲突的声明要通过这个层叠过程排序,并由此确定最终的文档表示.这个过程的核心是选择器及其相关声明的特殊性,以及继承机制. 特殊性 对于每个规则,用户代理会计算 ...

  2. [读书笔记] CSS权威指南1: 选择器

    通配选择器 可以与任何元素匹配,就像是一个通配符 /*每一个元素的字体都设置为红色*/ * { color: red; } 元素选择器 指示文档元素的选择器. /*为body的字体设置为红色*/ bo ...

  3. [读书笔记]Hadoop权威指南 第3版

    下面归纳概述了用于设置MapReduce作业输出的压缩格式的配置属性.如果MapReduce驱动使用了Tool接口,则可以通过命令行将这些属性传递给程序,这比通过程序代码来修改压缩属性更加简便. Ma ...

  4. 《软件测试自动化之道》读书笔记 之 底层的Web UI 测试

    <软件测试自动化之道>读书笔记 之 底层的Web UI 测试 2014-09-28 测试自动化程序的任务待测程序测试程序  启动IE并连接到这个实例  如何判断待测web程序完全加载到浏览 ...

  5. 《黑客攻防技术宝典Web实战篇@第2版》读书笔记1:了解Web应用程序

    读书笔记第一部分对应原书的第一章,主要介绍了Web应用程序的发展,功能,安全状况. Web应用程序的发展历程 早期的万维网仅由Web站点构成,只是包含静态文档的信息库,随后人们发明了Web浏览器用来检 ...

  6. HTML5权威指南--Web Storage,本地数据库,本地缓存API,Web Sockets API,Geolocation API(简要学习笔记二)

    1.Web Storage HTML5除了Canvas元素之外,还有一个非常重要的功能那就是客户端本地保存数据的Web Storage功能. 以前都是用cookies保存用户名等简单信息.   但是c ...

  7. 【读书笔记】iOS-使用Web Service-基于客户端服务器结构的网络通信(一)

    Web Service技术是一种通过Web协议提供服务,保证不同平台的应用服务可以互操作,为客户端程序提供不同的服务. 目前3种主流的Web Service实现方案用:REST,SOAP和XML-RP ...

  8. 【读书笔记】iOS网络-Web Service协议与风格

    协议指的是在与其它系统交换结构化信息时所要遵循的一套格式,过程与规则.此外,协议定义了在传输过程中所要使用的数据格式.这样,接收系统就能正确地解释结构化信息并做出正应的回应. 1,简单对象访问协议. ...

  9. 读书笔记之深入分析Java Web技术内幕

    章节: 1 B/SB/S的优点: 客户端使用统一的浏览器(Browser) ,浏览器的统一带来了操作的统一,无论使用什么服务,因为浏览器是相同的,所以操作类似.客户使用简单了.服务端开发简化; 使用统 ...

  10. 【读书笔记】iOS-网络-Web Service协议与风格

    协议指的是在与其它系统交换结构化信息时所要遵循的一套格式,过程与规则.此外,协议定义了在传输过程中所要使用的数据格式.这样,接收系统就能正确地解释结构化信息并做出正应的回应. 1,简单对象访问协议. ...

随机推荐

  1. 牛客小白月赛9H论如何出一道水题(两个连续自然数互质)

    题面 记录一下...连续得两个自然数互质,这题再特判一下1的情况 #include<bits/stdc++.h> using namespace std; int main() { lon ...

  2. Django-建立网页

    进入cmd模式做 django-admin startproject helloworld创建一个project,并命名helloworld,新生成的文件结构如下   输入python manage. ...

  3. v-on 事件修饰符

    事件修饰符:   .stop 阻止冒泡 .prevent 阻止默认事件 .capture 添加事件侦听器时使用事件捕获模式 .self 只当该事件在该元素本身时(不是子元素)触发时才回调 .once ...

  4. VPS挂机赚美刀详细介绍–Alexamaster操作流程

    跟 vps 主机打交道时间长了,手里也渐渐积累了些闲置的 vps.让它们这么闲着吧,感觉有些浪费资源:用起来吧,暂时又没有好的项目.一直听说通过 vps挂机可以赚回主机成本,甚至可以盈利.正好这两天有 ...

  5. 算法笔记(c++)--c++中碰到的一些用法

    算法笔记(c++)--c++中碰到的一些用法 toupper(xxx)可以变成大写; tolower(xx)小写 isalpha(xxx)判断是不是字母 isalnum(xx)判断是不是数字 abs( ...

  6. 王者荣耀交流协会final发布中间产物

    WBS+PSP 版本控制报告 软件功能说明书final修订

  7. "Hello World"团队召开的第三周第七次会议

    今天是我们团队“Hello World!”团队召开的第三周的第七次会议.博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.Todo List 六.会议照片 七.燃尽图 一.会议时 ...

  8. c# dataGridView排序

    一.对阿拉伯数字进行自定义排序: 简单有效方法: 1.该列的sortmode属性为auto...(一般默认) 2.比如首列序号,添加该列数据的时候直接添加int即可.切忌不要用string. obje ...

  9. 四则运算——单元测试(测试方法:Right-BICEP )

    一.测试的具体部位 Right-结果是否正确? B-是否所有的边界条件都是正确的? I-能查一下反向关联吗? C-能用其他手段交叉检查一下结果吗? E-你是否可以强制错误条件发生? P-是否满足性能要 ...

  10. LNMP环境+ 前后端项目部署+redis+redis扩展

    LNMP 环境    (参照https://lnmp.org/install.html) wget -c http://soft.vpser.net/lnmp/lnmp1.4.tar.gz & ...