Http 笔记 web机器人
web机器人是能够在无需人类干预的情况下自动进行一系列web事务处理的软件程序。很多机器 人会从一个web站点逛到另一个web站点,获取内容,跟踪超链,并对它们找到的数据进行处理。
爬虫
web爬虫 会递归地对各种信息性web站点进行遍历,获取第一个web页面,然后获取那个页面指向的所有web页面,然后是那些页面指向的所有web页面。
因特网搜索引擎使用爬虫在web上游荡,并把它们碰到的文档全部拉回来。然后对这个文档进行处理,形成一个可搜索的数据库,以便用户查找包含了特定单词的文档。
根集:爬虫开始访问的URL初始集合被称为根集 root set。应该从足够多不同的站点中选择url ,这样爬遍所有的链接才能最终到达大部分web页面。
链接的提取以及相对链接的标准化:
爬虫在web上移动时,会不停地对html页面进行解析。它要对所解析的每个页面上的URL链接进行分析,并将这些链接添加到需要爬行的页面列表中去。要通过简单的html解析,将这些链接提取出来,并将相对url转换为绝对形式。
机器人在web上爬行时,要特别小心不要陷入循环,或环路之中。环路会造成机器人陷阱,这些陷阱会暂停或减缓机器人的爬行进程。
循环与复制:
1 它们会使爬虫陷入可能会将其困住的循环之中。循环会使未级良好设计的爬虫不停地兜圈子,把所有时间都耗费在不停地获取相同的页面上。爬虫会消耗掉很多网络带宽,可能完全无法获取任何其他页面了。
2 爬虫不断地获取相同的页面时,另一端的web服务器也在遭受着打击。如果爬虫与服务器连接良好,它就会击垮web站点,阻止所有用户访问这个站点。
3 即使循环自身不是什么问题,爬虫也是在获取大量重复的页面。爬虫应用程序会被重复的内容所充斥,这样应用程序就会变得毫无用处。返回数百份完全相同的页面的因特网搜索引擎就是一个这样的例子。
数亿URL需要具备快速搜索结构,所以速度是很重要的。至少要用到搜索树或散列有,以快速判定某个url是否被访问过。
数亿url还会占用大量的空间。
大规模web爬虫对其访问过的地址进行管理技术:
1 树和散列表:复杂的机器人可能会用搜索树或散列表来记录已访问的url.这些是加速url查找的软件数据结构
2 有损 的存在位图:为了减小空间,一些大型爬虫会使用有损数据结构,比如 存在位数组。用一个散列函数将每个url都转换成一个定长的数字,这个数字在数组中有个相关的 存在位。爬行过一个url时,就将相应的 存在位 置位。如果存在位已经置位了,爬虫就认为已经爬行过那个url了。
3 检查点:一定要将已访问url列表保存到硬盘上。以防机器人程序崩溃。
4 分类:有些大型web机器人会使用机器人 集群,每个独立的计算机是一个机器人,以汇接方式工作。为每个机器人分配一个特定的url片,由其负责爬行。这些机器人配合工作,爬行整个web。机器人个体之间可能需要相互通信,来回传送url,以覆盖出故障的对等实体 爬行范围,或协调其工作 。
别名:如果两个url看起来不一样,但实际指向的是同一资源,就称这两个url互为 别名
机器人可先通过下列步骤将每个url都转化为规范化的格式
1 如果没有指定端口的话,就向主机名中添加 :80
2 将所有转义符 %XX都转换成等价字符
3 删除#标签
url规范人可以消除一些基本的语法别名,但机器人还会遇到其他的、将url转换为标准形式也无法消除的url别名
文件系统连接环路:文件系统中的符号连接会造成特定的潜在环路,因为它们会在目录层次深度有限的情况下,造成深度无限的假象。
动态虚拟web空间:发布一个看起来像普通文件,实际上却是网关应用程序的url是很容易的。这个应用程序可以在传输中构造出包含了到同一服务器上虚构url链接的html。请求这些虚构的url时,这个服务器就会捏造出一个带有新的虚构url的新html页面来。
避免循环和重复
爬虫的自动化程序越高,越可能陷入麻烦之中。
1 规范化 url:将url转换为标准形式以避免语法上的别名
2 广度优先的爬行:以广度优先的方式来调度url去访问web站点,就可以将环路的影响最小化。
3 节流 :限制一段时间内机器人可以从一个web站点获取的页面数量。如果机器人跳进了一个环路,试图不断地访问某个站点的别名,也可以通过节流来限制重复的页面总数和对服务器的访问总数。
4 限制url的大小:机器人可能会拒绝爬行超出特定长度的url,通常是1KB。如果环路使url的长度增加,长度限制就会最终终止这个环路。
5 URL/站点黑名单:维护一个与机器人环路和陷阱相对应的已知站点及url列表。发现新问题时就将其加入黑名单。
6 模式检测:文件系统的符号连接和类似的错误配置所造成的环路会遵循某种模式,比如 url会随着组件的复制逐渐增加。有些机器人会盗走具胡重复组件的url当作潜在的环路,拒绝爬行带有多地两或三个重复组件的URL
7 内容指纹:
使用内容指纹的机器人会获取页面内容中的字节,并计算出一个校验和checksum.这个校验和是页面内容的压缩表示形式。如果机器 人获取了一个页面,而此页面的校验和它曾经见过,它就不会再去爬行这个页面的链接了。
必须对校验和函数进行选择,以求两个不同页面拥有相同校验和的几率非常低。MD5这样的报文摘要函数就常被用于指纹计算
8 人工监视:设计所有产品级机器人时都要有诊断和日志功能,如果发生了什么不寻常的事情就可以很快收到警告。
机器人的http
识别请求首部:
1 User-Agent:将发起请求的机器人名字告知服务器
2 From 提供机器人的用户/管理者 的e-mail地址
3 Accept 告知服务器可以发送哪些媒体类型。这有助于确保机器人只接收它感兴趣的内容
4 Referer 提供包含了当前请求url的文档的url.
虚拟主机:
机器人实现者要支持host首部。随着虚拟主机的流行,请求中不包含host首部的话,可能会使机器人将错误的内容与一个特定的url关联。因此 http/1.1要求使用host首部
条件请求:有些机器人实现了条件http请求,它们会对时间戳或实体标签进行比较,看看它们最近获取的版本是否已经升级了。
对响应的处理:
1 状态码 机器人至少应该能够处理一些常见的,以及预期的状态码。所有机器人都应该理解200 ok 和 404 not found 状态码。它们还应该能够根据响应的一般类别对它并不十分理解的状态码进行处理。
2 实体 除了http首部所嵌的信息之外,机器人也会在实体中查找信息
行为不当的机器人:
1 失控机器人:机器人通常运行在具胡快速网络链路的高速计算机上。如果机器人存在编程逻辑错误,或者陷入了环路之中,就可能会向web服务器发出大量的负载
2 失效的url:有些机器人会去访问url列表。这些列表可能很老了。如果一个web站点对其内容进行了大量的修改,机器人可能会对大量不存在 的URL发起请求。生成错误日志中充满了对不存在文档的访问请求,降低web服务器的处理能力。
3 很长的错误url
由于环路和编程错误的存在,机器人可能会向web站点请求一些很大的、无意义的URL。如果url足够长的话,就会降低web服务器的性能,使web服务器的访问日志杂乱不堪,甚至会使一些比较脆弱的web服务器崩溃。
4 爱打听的机器人:有些机器人可能会得到一些指向私有数据的url,这样,通过因特网搜索引擎和其他应用程序就可以很方便地访问这数据了。
应该有某种机制可以将这些数据丢弃 并从所有搜索索引或归档文件中将其删除。
5 动态网关访问:机器人可能会获取一个内容来自网关应用程序的url。在这种情况下,获取的数据可能会有特殊的目的,计算 开销可能很高。
拒绝机器人访问
拒绝机器人访问标准:robots.txt
所有web服务器都可以在服务器的文档根目录中提供一个可选的、名为robots.txt的文件。这个文件包含的信息说明了机器人可以访问服务器的哪些部分。如果机器人遵循这个自愿约束标准,它会在访问那个站点的所有其他资源之前,从web站点请求robots.txt文件。
由主机名和端口号定义的整个web站点上仅有一个robots.txt资源
机器人会用http的get方法来获取robots.txt资源,就像获取web服务器上所有其他资源一样。如果有robots.txt文件的话,服务器会将其放在一个text/plain主体中返回。如果服务器以404 not found http状态码进行响应,机器人就可以认为这个服务器上没有机器人访问限制,它可以请求任意的文件。
机器人应该在from首部和user-agent首部中传输标识信息,以帮助站点管理者对机器人的访问进行跟踪,并在站点管理者要查询,或投诉的机器人事件中提供一些联系信息。
如果服务器以一个成功状态为响应,机器人就必须对内容进行解析,并使用排斥规则从那个站点上获取内容
如果服务器响应说明资源并不存在 404 ,机器人就可以认为服务器没有激活任何排斥规则,对此站点的访问不受robots.txt限制。
如果服务响应说明有访问限制 401 403,机器人就应该认为对此站点的访问是完全受限的。
如果请求尝试 结果是临时故障 503,机器人就应该推迟对此站点的访问,直到可以获取该资源为止。
如果服务器响应说明 是重定向 ,机器人就应该跟着重定向,直到找到资源为止。
robots.txt文件的格式:,面向行的语法。三种类型的行:空行、注释行、规则行。
robots.txt文件中的行可能从逻辑上划分成 记录,每条记录都为一组特定的机器人描述了一组排斥规则。通过这种方式,可以为不同的机器人使用不同的排斥规则。
每条记录中都包含了一组规则行,由一个空行或文件结束符终止。记录以一个或多个user-agent行开始,说明哪些机器人会受此记录的影响,后面跟着一些disallow和allow行,用来说明这些机器人可以访问哪些url
user-agent行:每个机器人记录都以一个或多个下列形式的User-Agent 行开始:
User-Agent:<robot-name> 机器人名的大小写无关的子字符串 (只有包含 robot-name就匹配)
User-Agent:* 通配
在机器人http get请求的user-agent首部中发送机器人名。
如果机器人无法找到与其名字机匹配的user-agent行,而且也无法找到通配的行,就是没有记录与之匹配,访问不受限。
Disallow Allow 行 紧跟在机器人排斥记录的User-Agent行之后。用来说明显式禁止或显式允许特定机器人使用哪些url路径。
机器人必须将期望访问的url按序与排斥记录中所有的disallow 和allow规则进行匹配。使用找到的第一个匹配项。如果没有找到匹配项,就说明允许使用这个url
说明:总是应该允许访问robots.txt的url,它一定不能出现在allow、disallow规则中
diaallow/allow前缀匹配
1 disallow和allow规则要求在小写相关的前缀匹配,空字符串可以起到通配符的效果。
2 在进行比较之前要将规则路径或 url路径中所有被转义的字符 %XX都反转为字节 (除了正斜杠%2F之外,它必须严格匹配)
3 如果规则路径为空字符串,就与所有内容都匹配。
缓存和robots.txt的过期
机器人会周期性地获取robot.txt文件,并将得到的文件缓存起来。机器人会使用这个robots.txt文件的缓存副本,直到其过期为止。原始服务器和机器 人都会使用标准的http缓存控制机制来控制robots.txt文件的缓存。机器人应该留意http响应中的cache-control和expires首部
robots.txt文件允许站点管理员将机器人排除在web站点的部分或全部内容之外。
html页面的作者可以直接在html文档添加robot-control标签。遵循robot-control html标签规则的机器人仍然可以获取文档。但如果其中机器人排斥标签,它们就会忽略这些文档。
机器人排斥标签:<META NAME=”ROBOTS” CONTENT=directive-list>
NOINDEX 告诉机器人不要对页面的内容进行处理,忽略文档 也就是说不要在任何索引或数据库中包含此内容
<META NAME=”ROBOTS” CONTENT=”NOINDEX”>
NOFOLLOW 告诉机器人不要爬行这个页面的任何外连链接
<META NAME=”ROBOTS“ CONTENT=”NOFOLLOW”>
INDEX 告诉机器人它可以对页面的内容进行索引
FOLLOW 告诉机器人它可以爬行页面上 任何外连链接
NOARCHIVE 告诉机器人不应该缓存这个页面的本地副本
ALL 等价于INDEX FOLLOW
NONE 等价于 NOINDEX / NOFOLLOW
与所有html的meta标签类似,机器人meta标签必须出现在html页面的head区域中
标签的名称robots和内容都是大小写无关的,不能发出一些会产生冲突或重复的指令
搜索引擎
全文索引:全文索引就是一个数据库,给它一个单词,它可以立即提供包含那个单词的所有文档。创建了索引之后就不需要对文档自身进行扫描了。
发布查询请求:
用户向web搜索引擎网关发布一条请求时,会填写一个html表单,他的浏览器会用一个http get 或 post请求将这个表单发送给网关。网关程序对搜索请求进行解析,并将web ui查询转换成搜索全文索引所需的表达式。
一旦搜索引擎通过其索引得到了查询结果,网关应用程序会获取结果,并将其拼成结果页面提供给终端用户。