专栏首页前端资源Robots协议探究:如何好好利用爬虫提高网站权重

Robots协议探究:如何好好利用爬虫提高网站权重

站长们通常希望百度、Google 这样的大型搜索引擎来抓取网站内容,又很厌恶其他来路不明的网络爬虫抓取自己的信息。

这样才有“好爬虫”和“坏爬虫”这样的说法。提到“好爬虫”,就不得不提网络爬虫与web之间的访问授权协议——Robots协议了。

Robots协议的定义

Robots协议(也称为爬虫协议、机器人协议等),全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。

根据协议,网站管理员可以在网站域名的根目录下放一个robots.txt 文本文件,里面可以指定不同的网络爬虫能访问的页面和禁止访问的页面,指定的页面由正则表达式表示。网络爬虫在采集这个网站之前,首先获取到这个文件,然后解析到其中的规则,然后根据规则来采集网站的数据。

注意,这个协议的存在更多的是需要网络爬虫去遵守,而起不到防止爬虫的功能。

为什么需要Robots协议

互联网上的网页是通过超级链接互相关联起来的,从而形成了网页的网状结构。爬虫的工作方式就像蜘蛛在网上沿着链接爬来爬去,最基本的流程可以简化如下:

  1. 喂给爬虫一堆url,我们称之为种子(seeds);
  2. 爬虫抓取seeds,解析html网页,抽取其中的超级链接;
  3. 爬虫接着抓取这些新发现的链接指向的网页。

步骤2和步骤3循环往复。

了解了上面的流程就能发现:对爬虫来说,网站非常被动,只有老老实实被抓取的份。

所以,对于站长来说,就存在这样的需求:

某些路径下是隐私内容,不想被搜索引擎抓取; 不喜欢某个搜索引擎,不愿意被他抓取,最有名的就是淘宝不希望被百度抓取; 小网站使用的是公用的虚拟主机,流量有限或者需要付费,希望搜索引擎抓的温柔点; 某些网页是动态生成的,没有直接的链接指向,但是希望内容被搜索引擎抓取和索引。

网站内容的所有者是网站管理员,搜索引擎应该尊重所有者的意愿,为了满足以上等等,就需要提供一种网站和爬虫进行沟通的途径,给网站管理员表达自己意愿的机会。有需求就有供应,robots协议就此诞生。

Robots协议的写法

Robots 有一套通用的语法规则。

  • User-agent:该项的值用于描述搜索引擎robot(蜘蛛)的名字。
  • Disallow:指定要屏蔽的网址
  • Allow:指定希望被访问的网址

最简单的robots.txt只有两条规则:

User-agent: *
Disallow:

先说 User-agent,爬虫抓取时会声明自己的身份,就是 http 协议里的 User-agent。robots.txt 利用 User-agent 来区分各个引擎的爬虫,比如说 google 网页搜索爬虫的 User-agentGooglebot

可能有你要问了,我怎么知道爬虫的 User-agent 是什么?你可以查相关搜索引擎的资料得到官方的数据,比如说百度的爬虫列表是这样的:

产品名称

对应user-agent

网页搜索

Baiduspider

移动搜索

Baiduspider

图片搜索

Baiduspider-image

视频搜索

Baiduspider-video

新闻搜索

Baiduspider-news

百度收藏

Baiduspider-favo

百度联盟

Baiduspider-cpro

上午搜索

Baiduspider-ads

Disallow 列出的是要屏蔽(禁止搜索引擎访问)的网页,以正斜线 / 开头。

如要屏蔽整个网站,直接使用正斜线即可;

User-agent: *
Disallow: /

屏蔽某个特定的目录以及其中的所有内容,则在目录名后添加正斜线;

User-agent: *
Disallow: /admin/
Disallow: /doc/app

使用 "*" and "$" :Baiduspider支持使用通配符 "*""$" 来模糊匹配url。

"*" 匹配0或多个任意字符

"$" 匹配行结束符。

屏蔽以 plug- 开头的所有子目录:用到 *

User-agent: *
Disallow: /plug-*/

屏蔽 php 结尾的文件:用到 $

User-agent: *
Disallow: /*.php$

屏蔽某个具体的页面:

User-agent: *
Disallow: /admin/index.html

屏蔽所有的动态页面:

User-agent: *
Disallow: /*?*

禁止某些爬虫访问

已屏蔽 Badbot 为例:

User-agent: BadBot
Disallow: /

只允许某个爬虫访问

以百度爬虫为例:

User-agent: Baiduspider
Disallow:
User-agent: *
Disallow: /

或者:

User-agent: Baiduspider
Allow: /
User-agent: *
Disallow: /

允许所有的robots访问

User-agent: *
Disallow:

或者是:

User-agent: *
Allow: /

或者也可以建一个空文件 "/robots.txt"。

屏蔽网站中的图片、视频等文件:

User-agent: *
Disallow: /*.jpg$
Disallow: /*.png$
Disallow: /*.bmp$
Disallow: /*.mp4$
Disallow: /*.rmvb$

允许访问 .html 结尾的 url

Allow: /*.html$
User-agent: *
Disallow:

我们再来结合两个真实的范例来学习一下。

先看这个例子:

User-agent: Baiduspider
Disallow: /
User-agent: baiduspider
Disallow: /

这个是淘宝网的Robots协议内容,相信你已经看出来了,淘宝网禁止百度的爬虫访问。

再来看一个例子:

User-agent: *
Disallow: /?*
Disallow: /pop/*.html
User-agent: EtaoSpider
Disallow: /

这个稍微复杂点,京东有2个目录不希望所有的爬虫来抓。同时,京东完全屏蔽了一淘网的蜘蛛(EtaoSpider是一淘网的蜘蛛)。

Robots协议进阶知识

sitemap

前面说过爬虫会通过网页内部的链接发现新的网页。但是如果没有连接指向的网页怎么办?或者用户输入条件生成的动态网页怎么办?能否让网站管理员通知搜索引擎他们网站上有哪些可供抓取的网页?这就是sitemap,最简单的 Sitepmap 形式就是 XML 文件,在其中列出网站中的网址以及关于每个网址的其他数据(上次更新的时间、更改的频率以及相对于网站上其他网址的重要程度等等),利用这些信息搜索引擎可以更加智能地抓取网站内容。

新的问题来了,爬虫怎么知道这个网站有没有提供sitemap文件,或者说网站管理员生成了sitemap,(可能是多个文件),爬虫怎么知道放在哪里呢?

由于robots.txt的位置是固定的,于是大家就想到了把sitemap的位置信息放在robots.txt里。这就成为robots.txt里的新成员了。

节选一段google robots.txt:

Sitemap: http://www.gstatic.com/cultur...

Sitemap: http://www.google.com/hostedn...

插一句,考虑到一个网站的网页众多,sitemap人工维护不太靠谱,google提供了工具可以自动生成sitemap。

meta tag

其实严格来说这部分内容不属于robots.txt。

robots.txt的初衷是为了让网站管理员管理可以出现在搜索引擎里的网站内容。但是,即使使用 robots.txt 文件让爬虫无法抓取这些内容,搜索引擎也可以通过其他方式找到这些网页并将它添加到索引中。例如,其他网站仍可能链接到该网站。因此,网页网址及其他公开的信息(如指向相关网站的链接中的定位文字或开放式目录管理系统中的标题)有可能会出现在引擎的搜索结果中。如果想彻底对搜索引擎隐身那咋整呢?答案是:元标记,即meta tag。

比如要完全阻止一个网页的内容列在搜索引擎索引中(即使有其他网站链接到此网页),可使用 noindex 元标记。只要搜索引擎查看该网页,便会看到 noindex 元标记并阻止该网页显示在索引中,这里注意noindex元标记提供的是一种逐页控制对网站的访问的方式。

要防止所有搜索引擎将网站中的网页编入索引,在网页的部分添加:

<meta name="robots" content="noindex">

这里的name取值可以设置为某个搜索引擎的User-agent从而指定屏蔽某一个搜索引擎。

除了noindex外,还有其他元标记,比如说nofollow,禁止爬虫从此页面中跟踪链接。详细信息可以参考Google支持的元标记,这里提一句:noindex和nofollow在HTML 4.01规范里有描述,但是其他tag的在不同引擎支持到什么程度各不相同,还请读者自行查阅各个引擎的说明文档。

Crawl-delay

除了控制哪些可以抓哪些不能抓之外,robots.txt还可以用来控制爬虫抓取的速率。如何做到的呢?通过设置爬虫在两次抓取之间等待的秒数。

Crawl-delay:5

表示本次抓取后下一次抓取前需要等待5秒。

注意:google已经不支持这种方式了,在webmaster tools里提供了一个功能可以更直观的控制抓取速率。

这里插一句题外话,几年前曾经有一段时间robots.txt还支持复杂的参数:Visit-time,只有在visit-time指定的时间段里,爬虫才可以访问;Request-rate: 用来限制URL的读取频率,用于控制不同的时间段采用不同的抓取速率。后来估计支持的人太少,就渐渐的废掉了,目前google和baidu都已经不支持这个规则了,其他小的引擎公司貌似从来都没有支持过。

防君子不防小人

Robots协议不是什么技术壁垒,而只是一种互相尊重的协议,好比私家花园的门口挂着“闲人免进”,尊重者绕道而行,不尊重者依然可以推门而入。目前,Robots协议在实际使用中,还存在一些问题。

缓存

robots.txt本身也是需要抓取的,出于效率考虑,一般爬虫不会每次抓取网站网页前都抓一下robots.txt,加上robots.txt更新不频繁,内容需要解析。通常爬虫的做法是先抓取一次,解析后缓存下来,而且是相当长的时间。假设网站管理员更新了robots.txt,修改了某些规则,但是对爬虫来说并不会立刻生效,只有当爬虫下次抓取robots.txt之后才能看到最新的内容。尴尬的是,爬虫下次抓取robots.txt的时间并不是由网站管理员控制的。当然,有些搜索引擎提供了web 工具可以让网站管理员通知搜索引擎那个url发生了变化,建议重新抓取。注意,此处是建议,即使你通知了搜索引擎,搜索引擎何时抓取仍然是不确定的,只是比完全不通知要好点。至于好多少,那就看搜索引擎的良心和技术能力了。

ignore

不知是无意还是有意,反正有些爬虫不太遵守或者完全忽略robots.txt,不排除开发人员能力的问题,比如说根本不知道robots.txt。另外,本身robots.txt不是一种强制措施,如果网站有数据需要保密,必需采取技术措施,比如说:用户验证,加密,ip拦截,访问频率控制等。

恶意爬虫

在互联网世界中,每天都有不计其数的爬虫在日夜不息地爬取数据,其中恶意爬虫的数量甚至高于非恶意爬虫。遵守Robots协议的爬虫才是好爬虫,但是并不是每个爬虫都会主动遵守Robots协议。

恶意爬虫可以带来很多潜在威胁,比如电商网站的商品信息被爬取可能会被竞争对手利用,过多的爬虫还会占用带宽资源、甚至导致网站宕机。

反恶意爬虫是一件漫长而艰巨的任务,如果依靠自身实力难以解决,可以借助岂安科技的业务风险分析平台 WARDEN 来反恶意爬虫,根据自己的需求来定制功能。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • vue项目如何实现返回上一页

    如果使用的是 vue-router ,this.$router.go(-1) 就可以回到上一页。 history.go(-1) 是回到浏览器上一页。

    德顺
  • Javascript操作将session资料存入window.name里

    查了一些资料,大家一致认为除了 Node.js 和服务端,在 JavaScript 里没有 session 这种东西(或者说很不常见),所有的变数,函式等等的资...

    德顺
  • Bootstrap 模态框(Modal)插件的基本应用

    通常用来显示一个单独的源内容或者是对一些模块进行进一步详细的介绍,可以在不离开父窗体的情况下进行一些互动和内容的交互。

    德顺
  • 对一道if-else相关的程序题的简单分析(r5笔记第45天)

    今天同事在微信群里提出了一个问题,看似是一个面试题。 大体的意思就是补充下面if条件使得输出 Hello World if(){ System.out.prin...

    jeanron100
  • 条件型业务规则的抽象与实现——从Spring Profile得到的灵感

    当我们更倾向于使用具体的场景沟通的时候,团队更不容易意识到需要从中寻找稳定的抽象。那么我们需要花费精力去改变用户的思维方式吗,如果需要又应该使用什么样的方式?又...

    ThoughtWorks
  • 笔记86 | 视频在ACC起来后会跳进度问题分析

    3.进度条前面1~2秒是正常的,是根据保存的进度继续往前走,可是突然进度就倒退了,这必然是Handler里面处理进度条的地方导致的

    项勇
  • [From Nand to Tetris] 第8章 虚拟机项目 python 实现

    为防闲逛至此的看官不知所云: From Nand to Tetris 是一个在线课程,目标是指导学生从 Nand 逻辑门开始从头到尾完成一整套计算机系统。

    Alan Zhang
  • 【Flutter 专题】10 页面间小跳转 (二)

    和尚前两天尝试了一下 Flutter 中的页面跳转,主要时通过 Navigator 相关的 push 和 pop 方法进行页面跳转和基本传参,很方便...

    阿策
  • C#对Windows服务组的启动与停止

    Windows服务大家都不陌生,Windows服务组的概念,貌似MS并没有这个说法。 作为一名软件开发者,我们的机器上安装有各种开发工具,伴随着各种相关服务。 ...

    用户1637609
  • CRM客户管理系统实施前需要考虑的要素有哪些?

    实施CRM客户管理系统不一定是企业自上而下的安排,也可以是员工自下而上提出的建议,在实施CRM之前,企业需要对自己的经营环境和企业资源进行分析,通过CRM客户管...

    All in

扫码关注云+社区

领取腾讯云代金券