一、概述

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. Spring学习(八)-----Spring注入值到集合类型的例子

    下面例子向您展示Spring如何注入值到集合类型(List, Set, Map, and Properties). 支持4个主要的集合类型: List – <list/> Set – &l ...

  2. Linux 安装Zookeeper<集群版>(使用Mac远程访问)

    阅读本文需要先阅读安装Zookeeper<准备> 一 架构细节 zookeeper集群根据投票选举的机制 选出leader和follower zookeeper集群节点建议是奇数 这里我准 ...

  3. Unity ScriptableObject自定义属性显示

    1. 继承Editor,重写OnInspectorGUI方法 Editor官方文档 需求 将TestClass中intData属性和stringData按指定格式显示. 实现 定义一个测试类TestC ...

  4. OpenLDAP搭建部署

    安装环境: linu系统:      centos7.2版本 OenLDAP:/openldap-2.4.44 下载地址:ftp://ftp.openldap.org/pub/OpenLDAP/ope ...

  5. 4星|《财经》2018年第13期:年轻人大多从大三和大四起开始就从QQ向微信转移

    <财经>2018年第13期 总第530期 旬刊 本期主要话题是快递业,其他我感兴趣的重要话题还有:香港9价HPV疫苗断供风波:华盛顿邮报被贝佐斯收购后这几年的变化:北京二中朝阳学校的划片风 ...

  6. Javascript 初学笔记

    变量作用域 自 ES2015 起,JS 引入let 和 const 关键词定义变量的块作用域(Block Scope). var 仅支持全局作用域(Global Scope)和函数作用域(Functi ...

  7. 238. [LeetCode] Product of Array Except Self

    Given an array nums of n integers where n > 1,  return an array output such that output[i] is equ ...

  8. Python--matplotlib 绘图可视化练手--折线图/条形图

    最近学习matplotlib绘图可视化,感觉知识点比较多,边学习边记录. 对于数据可视化,个人建议Jupyter Notebook. 1.首先导包,设置环境 import pandas as pd i ...

  9. java不用任何已有方法完全自写的去重法

    package aa; class InsertSort{ private long[] a; private int nElems; //构造方法 public InsertSort(int max ...

  10. daterangepicker时间段插件

    1.序言: daterangepicker是Bootstrap的一个时间组件,使用很方便 用于选择日期范围的JavaScript组件. 设计用于Bootstrap CSS框架. 它最初是为了改善报表而 ...