学如逆水行舟,不进则退。
爬虫的概念
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
行开始:
User-Agent: <spider-name>
或
代码语言:javascript复制User-Agent: *
爬虫在HTTP GET请求的请求头User-Agent中发送爬虫名称。在处理robots.txt文件时,必须遵循以下规则之一:
- 第一个
<spider-name>
是爬虫名字的大小写无关的字符串。 - 第一个
<spider-name>
为*
。
如果爬虫无法找到与其名字相匹配的User-Agent行,并且也无法找到通配的User-Agent行,那说明没有记录与之匹配,访问不受限。
Disallow
和Allow
行
Disallow
和Allow
行跟在爬虫排斥记录的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
来实现:
<meta name="robots" content="爬虫控制指令">
爬虫控制指令
NOINDEX
告诉爬虫不对页面内容进行处理,忽略文档。
<meta name="robots" content="NOINDEX">
NOFLLOW
告诉爬虫不要爬这个页面的任何外连接。
<meta name="robots" content="NOFLLOW">
FLLOW
告诉爬虫可以爬这个页面的任何外连接。
<meta name="robots" content="FLLOW">
NOARCHIVE
告诉爬虫不应该缓存这个页面的本地副本。
<meta name="robots" content="NOARCHIVE">
ALL
等价于INDEX, FLLOW
。NONE
等价于NOINDEX, NOFLLOW
。
总结
robot.txt
相信有一部分人应该遇到过,其实也并不一定非得在站点的目录里加上这个文件,也可以通过web服务器去返回一个相同的内容。
比如:微信小程序或者公众号开发的时候需要上传校验文件,很多后端的同学有时候嫌上传麻烦,直接在nginx里echo
一个相同的内容。
robots.txt
也可以用echo
进行返回。
javascript基础知识总结