爬虫,robots.txt和HTML的爬虫控制标签

2022-07-14 21:22:47 浏览数 (1)

学如逆水行舟,不进则退。

爬虫的概念

web爬虫是一种机器人,它会递归对站点进行遍历,然后沿着web的超链接进行数据爬取。

我们使用的搜索引擎本身也个大的爬虫。它将它碰到的文档全部拉取回来,然后对这些文档进行处理,形成一个可搜索的数据库。然后当用户查找的时候,返回用户需要的信息。

拒绝机器人访问

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

Web站点和robots.txt文件

如果一个站点有robots.txt文件,那么访问这个站点的任意链接之前,爬虫都必须获取这个robotx.txt文件并对之进行处理。

爬虫获取robots.txt

  • 获取方式

爬虫会用GET方法来获取robots.txt的资源。如果有robots.txt文件的话,服务器会将其放在一个text/plain主体中返回。如果服务器以404 Not Found Http状态码进行响应,爬虫会认为这个服务器上没有爬虫访问限制,就可以请求任意文件。

  • 响应码

很多站点都没有robots.txt资源,但爬虫并不知道这个事儿。它必须尝试从每个站点上获取robots.txt资源。爬虫会对简索结果采取不同的策略。

  • 如果服务器以一个成功状态(HTTP状态码2xx)为响应,爬虫就必须对robots.txt进行解析,并使用排斥规则从站点上获取内容。
  • 如果服务器说资源不存在(HTTP状态码404)为响应,爬虫就认为服务器没有激活任何排斥规则,从站点上获取内容不受限制。
  • 如果服务器说资源存在访问权限(HTTP状态码401或403)为响应,爬虫就认为从站点上获取内容是完全受到限制。
  • 如果请求出现故障(HTTP状态码503),爬虫推迟从站点上获取内容,直到能获取robots.txt为止。
  • 如果请求出重定向(HTTP状态码3xx),爬虫就跟着重定向,直到能获取robots.txt为止。

robots.txt文件格式

robots.txt文件的语法非常简单。有点像我们平时写的请求头信息。

代码语言:javascript复制
User-Agent: slurp
User-Agent: webcrawler
Disallow: /user

文件中的每条记录都为一组特定的爬虫描述了一组排斥规则。通过这个方式,可以为不同的爬虫使用不同的排斥规则。

  • User-Agent

每个爬虫记录都以一个或多个下列形式的User-Agent行开始:

代码语言:javascript复制
User-Agent: <spider-name>

代码语言:javascript复制
User-Agent: *

爬虫在HTTP GET请求的请求头User-Agent中发送爬虫名称。在处理robots.txt文件时,必须遵循以下规则之一:

  • 第一个<spider-name>是爬虫名字的大小写无关的字符串。
  • 第一个<spider-name>*

如果爬虫无法找到与其名字相匹配的User-Agent行,并且也无法找到通配的User-Agent行,那说明没有记录与之匹配,访问不受限。

  • DisallowAllow

DisallowAllow行跟在爬虫排斥记录的User-Agent行之后。用来说明显示禁止或显示允许特定爬虫使用哪些url路径。

爬虫必须将期望访问的URL按序与排斥记录中所有的Disallow和Allow规则进行匹配。使用找到的第一个匹配项。如果没有找到匹配项,就说明允许使用这个URL。

要使Allow/Disallow行与一个URL像匹配,规则路径必须是URL路径大小写相关的前缀。例如:Disallow:/tmp 就和下面所有的URL相匹配:

代码语言:javascript复制
http://909500.club/tmp
http://909500.club/tmp/
http://909500.club/tmp/es6.html

如果规则路径为空字符串,就与所有内容都匹配

HTML的爬虫控制标签

在写HTML的时候我们可以使用一种更直接的方式控制爬虫能访问哪些页面。我们可以借助元信息标签meta来实现:

代码语言:javascript复制
<meta name="robots" content="爬虫控制指令">

爬虫控制指令

  • NOINDEX 告诉爬虫不对页面内容进行处理,忽略文档。
代码语言:javascript复制
<meta name="robots" content="NOINDEX">
  • NOFLLOW 告诉爬虫不要爬这个页面的任何外连接。
代码语言:javascript复制
<meta name="robots" content="NOFLLOW">
  • FLLOW 告诉爬虫可以爬这个页面的任何外连接。
代码语言:javascript复制
<meta name="robots" content="FLLOW">
  • NOARCHIVE 告诉爬虫不应该缓存这个页面的本地副本。
代码语言:javascript复制
<meta name="robots" content="NOARCHIVE">
  • ALL 等价于 INDEX, FLLOW
  • NONE 等价于 NOINDEX, NOFLLOW

总结

robot.txt相信有一部分人应该遇到过,其实也并不一定非得在站点的目录里加上这个文件,也可以通过web服务器去返回一个相同的内容。

比如:微信小程序或者公众号开发的时候需要上传校验文件,很多后端的同学有时候嫌上传麻烦,直接在nginx里echo一个相同的内容。

robots.txt也可以用echo进行返回。

javascript基础知识总结

0 人点赞