☰
自动抓取之前先看清三层边界:规则、条款与法律
2026/10/8 11:44:34 网站建设 项目流程

授权与合规声明
本文全部操作对象均为自建隔离靶场(本机容器或隔离虚拟机),涉及安全测试的环节必须以取得合法授权为前提。未经授权的渗透测试违反《中华人民共和国网络安全法》与《刑法》相关条款,须承担相应法律责任。本文只讲环境配置、版本对照与靶场隔离,不含任何攻击步骤、利用载荷与绕过手法,请勿将文中环境指向任何非自有系统。

一、为什么会卡在这一步

1.1 两种听起来都很有道理的极端

想给一个站点写第一个自动抓取脚本的人,几乎都会在同一个地方卡住:“我到底能不能抓?”

围绕这个问题,网上流传着两种截然相反的答案,而且两种都被说得理直气壮。

第一种说:“看 robots.txt 就行了,它写了 Disallow 的地方你就不能碰。”这句话把 robots.txt 当成了一纸法律——仿佛那是一道禁令,违反了就要承担法律责任。

第二种说:“robots.txt 不过是个君子协定,没人真管,随便抓。”这句话又走到了另一个极端——仿佛只要页面没有技术拦阻,就默认获得了许可。

两种说法各自抓住了一小块真相,也都漏掉了最关键的一小块。它们共同的错误其实只有一个:把三个不同层次的东西,硬压成了一层。

1.2 三层边界,得拆开看

真相是:从"我想抓"到"我能抓、我该抓",中间隔着三层完全不同的边界,而且这三层是由三类完全不同的主体分别定下来的。

层次谁定的它的性质
协议规则层(robots.txt)网站方按 RFC 9309 书写一份"请求爬虫遵守"的技术声明
网站条款层(使用条款 / API 条款)网站方自己拟定一份你和网站之间的约定
法律层(《网络安全法》《刑法》)国家立法机关具有国家强制力的底线

这三层不是"同一件事的三种说法",而是三个彼此独立的关卡。过得了第一层,不代表过了第二层;把前两层都走顺了,也不代表没有触碰第三层。

举个方向性的对照,就能看出它们差在哪:robots.txt 写的是"我请求你别碰这些路径";网站条款写的是"你使用本站,即表示同意这些条件";法律写的是"这些行为国家不允许"。三句话的语气不同、来源不同、后果也不同。把它们压成一句"能不能抓",就必然出错。

本文要做的事只有一件:把这三层逐层拆开,让"我到底站在哪一层"这个问题有明确的答案。

1.3 本文明确不写什么

动笔之前先把边界钉死。本文不是抓取教程,以下内容一个字都不写:

  • 不写抓取脚本、不写请求构造;
  • 不写反爬绕过、限速规避、代理轮换、并发抓取;
  • 不写任何会改变远端状态的请求;
  • 不点名任何具体站点或具体爬虫的行为。

全文只做两件事:教你怎么读懂一份 robots.txt,以及帮你把三层边界分清。读懂规则、分清层级,本身就是"动手之前"该做完的功课。

本章可以带走的一句:把"能不能抓"当成一个问题,出发点就已经错了——它其实是三个问题。

二、第一层:robots.txt 到底是什么

2.1 它是一份放在固定位置的文件

先把第一层的事实基础立稳。按照《Robots Exclusion Protocol》这份文档,它的状态是Standards Track(标准轨道),2022 年 9 月发布,RFC 编号9309,作者来自 Google LLC(台账 R01)。它要解决的问题写在摘要里:让服务方控制其服务所提供的内容可以如何、乃至是否可以,被自动客户端——也就是爬虫——访问(台账 R02)。

这份协议在实现上落得很实:规则必须放在一个名为robots.txt的文件里(台账 R05)。也就是说,第一层的入口是一个位置固定、名字固定的文本文件——它固定挂在站点的根路径下,而不是随便放在哪个目录里:

某页面地址: https://<站点>/某个栏目/某个页面 规则文件地址: https://<站点>/robots.txt

上面这个对照只是想说明"位置固定"这件事:无论你想抓的是哪一个页面,规则文件都在同一个根路径上;判断你能不能碰那些页面的那份声明,也只有这一个入口。

这里初学者最容易犯的错,是先入为主地认为"没有 robots.txt"和"robots.txt 里没写我"是一回事。其实不是——这个文件存不存在、写了什么,是两个独立的问题。第四章会专门讲"取不到"的两种情形,它们处理方式完全相反。

2.2 协议语言只有两个构件:rule 与 group

打开一份 robots.txt,你看到的并不是"一堆禁令",而是一种结构非常简单的语言。按 RFC 9309 的描述,这套协议语言由两个构件组成(台账 R05):

  • rule(规则):一组键值对,最常见的键就是User-agent、Allow、Disallow;
  • group(组):一组user-agent行,后面跟着若干条规则。

换句话说,robots.txt 不是"一句话",而是"按组组织的一小段配置"。读它的时候,正确的顺序是先判断这条规则属于哪个 group,再看这条规则说了什么——顺序反了,就会把甲组写给某类爬虫的规则,误当成对所有人的规定。

一条规则长什么样?下面用 RFC 自带的写法示意(这是协议文档里的示例形态,用于说明语言,不是在教你部署):

User-agent: * Allow: /example/page/ Disallow: /example/page/disallowed.gif

说明一句:这里之所以标成bash围栏,是为了让代码块有明确标注、内容能对齐显示;它本身不是一段可执行脚本,只是用来展示协议语言的形态。

2.3 最后一个 group 可以没有规则,等于隐式允许

这是 R05 里最容易被忽略、但对"读"最关键的一条:

最后一个 group 可以没有规则,这意味着它隐式地允许一切。

也就是说,一个 group 里只写了User-agent:行、后面一条Allow/Disallow都没有,这不表示"禁止",恰恰表示"允许":

User-agent: SomeCrawler

上面这个 group 只声明了"这段话是说给SomeCrawler听的",没有给出任何限制,因此它对该爬虫等于隐式放开全部路径。

这一条之所以重要,是因为它直接推翻了很多人的直觉——看见User-agent就以为在设限制。事实上,限制来自规则本身,不来自User-agent行。User-agent只是"这段话是说给谁听的"。

本章可以带走的一句:robots.txt 是一种"按组组织的语言",只写User-agent而不写规则,含义反而是允许。

三、第二层之前先学会读一条规则

3.1 匹配从路径的第一个八位组开始

读懂一条规则,关键在"它到底匹配什么"。RFC 9309 把判定规则讲得很细(台账 R06),其中第一句就该记住:

匹配必须从路径的第一个八位组开始。

这句话的专业味道很重,翻译成人话是:规则是拿 URL 的路径部分,从头一个字符一个字符地比,不是"包含"关系。所以一条Disallow: /admin管的并不是"任何地址里含 admin 的页面",而是"路径从/admin开头的那一批"。

同一节还并列给出了几条判定原则(台账 R06),一并记住:

  • 必须使用最具体的匹配,也就是匹配到的八位组最多、最长的那一条;
  • 当allow与disallow的匹配等价(一样长、指向同一处)时,allow应被采用;
  • 如果某个 group 里没有任何规则匹配上,或者这个 group 根本没有规则,那么该 URI被允许;
  • /robots.txt本身被隐式允许——这是一条有意思的例外:你为了读规则而读规则文件,规则文件自己是允许被读的。

3.2 最长匹配:一条示例讲透

"最长匹配"最容易理解的方式,是看 RFC 自己给的例子(台账 R13)。对 URI

example.com/example/page/disallow.gif

当同时存在Allow: /example/page/与Disallow: /example/page/disallowed.gif两条规则时,必须采用更长的/example/page/disallowed.gif。

注意这个例子里两条规则的"具体性"差异:它们只差几个字符,但机器不会"猜",它只数从开头起连续匹配的八位组个数,谁多就听谁的。这就是"最长匹配"的全部含义。

顺带把"allow 优先"补上:如果两条匹配一样长,却一条是 allow、一条是 disallow,那就按allow处理(台账 R06)。也就是说,规则冲突时协议选择的是放宽,而不是收紧。

3.3 大小写、百分号编码,还有"该忽略就忽略"

再往下还有两条细节(台账 R07),它们决定了"为什么你手写的规则和机器读出来的结果不一样":

  • 大小写:匹配应当是大小写敏感的(原文用的是 SHOULD,即推荐如此,而非绝对强制);
  • 百分号编码:URL 与规则路径中,ASCII 之外的八位组、以及 RFC 3986 保留范围内的八位组,必须先按 RFC 3986 百分号编码之后再比较;而 URL 中已经是百分号编码的 ASCII 八位组,必须先解码再比较(保留字符与 unreserved 范围之外的除外)。

这两条合起来只说明一件事:读规则要用"机器看到的形态"去读,不能按你眼睛看到的、或者你手敲时的样子去理解。URL 里一个中文、一个空格、一个保留符号,到机器眼里就是另一串东西。

最后一条是"该忽略就忽略"(台账 R08):不属于任何 group 的 allow / disallow 规则应当被忽略——最典型的例子,就是写在第一条user-agent行之前的那些规则。

本章可以带走的一句:读一条规则只看三件事——从哪开始匹配、谁最长、遇到编码先换回机器视角。

四、取不到 robots.txt 的时候

4.1 4xx:规则文件"不可用"

现在处理一个绕不开的现实问题:如果我根本取不到 robots.txt 呢?

RFC 9309 把"取不到"分成了两种情形,处理方式截然相反——这正是本节最容易读错的地方。

第一种是 4xx。当服务器的状态码表示 robots.txt 对爬虫不可用(例如 HTTP 400–499)时,规范给出的措辞是爬虫MAY 访问服务器上的任意资源(台账 R09)。

注意 MAY 这个词的分量:它是一条允许性的规定——规范没有禁止爬虫在这种情况下访问,它只是不再把 robots.txt 当作设置来用。

4.2 5xx:不可达,MUST 假定完全禁止

第二种是 5xx,处理方式刚好相反。

当 robots.txt 因服务器或网络错误而不可达时,该文件被视为未定义,爬虫MUST 假定完全禁止(complete disallow)(台账 R10)。

而且规范还给了时间维度的补充:如果这种不可达状态持续相当长的时间(例如 30 天),爬虫MAY 改为按"不可用"处理,或者继续使用缓存副本(台账 R10)。

把两节并排看,结论相当反直觉:

取回结果规范措辞方向
4xx(不可用)爬虫 MAY 访问任意资源放宽
5xx(不可达)爬虫 MUST 假定完全禁止收紧

也就是说,在协议眼里"服务器出错了、文件没了"不等于"规则消失了",而是默认全面禁止。这一点和很多人的直觉刚好相反:越是取不到,协议的态度越收紧。

想亲眼看清自己遇到的是哪一种,只需要一个只读动作,把状态码单独打印出来看看:

⚠️代码待验证

curl-s-o/dev/null-w"%{http_code}\n"https://example.com/robots.txt

这里的-o /dev/null表示把正文丢弃、不看内容,-w只把状态码打到屏幕上。看到 4 开头的码,对应"不可用";看到 5 开头的码,对应"不可达"。这一步只是观察,不改变任何远端状态。

4.3 容错解析、解析上限,以及必须钉死的一句话

再补两条实现侧的细节。第一,解析要逐行容错:爬虫MUST尝试解析 robots.txt 的每一行,并且MUST使用其中能解析出来的那些规则(台账 R11)——不会因为某一行语法出错就整体放弃。第二,解析要有上限:爬虫SHOULD为保护自身设置解析上限,而这个上限MUST 至少为 500 KiB(台账 R12)。

到这里,本章有一个极其容易被写歪的地方,必须单独钉死。

上面所有那些"MAY 访问"“假定完全禁止”“容错解析”“解析上限”,说的是规范对爬虫实现者的要求,不是对网站所有者的建议。它回答的是"一个按规范实现的爬虫遇到这种文件时会怎么做",而不是"你现在该怎么去抓"。

更要紧的是:"能不能访问"和"该不该访问"是两件完全不同的事。规范在 4xx 处说 MAY,描述的是协议层面的自由,它没有、也不打算给出任何"因此你可以去访问"的许可——因为规范本身在第一章就把这件事否掉了(台账 R03,下一章会逐字引)。

所以,本章的正确读法只有一句:这些是"实现怎么工作"的说明,不是"你该怎么行动"的指南。把实现要求读成行动许可,是这一章唯一的致命误读。

本章可以带走的一句:取不到文件时,协议关心的是"爬虫默认怎么做",它从不等于"你被允许了"。

五、第二层:协议规则不是授权

5.1 逐字原文:规则不是授权

现在进入全篇最核心的一句话。RFC 9309 在第一章 Introduction 的末句,用一句极短的英文,把第一层和第二层一刀切开(台账 R03):

These rules are not a form of access authorization.

翻译过来就是:这些规则不是一种访问授权。

这一句话,把前面四章讲的所有东西重新定位了一遍:robots.txt 是一份服务方写给爬虫看的声明,它既不是禁令,也不是许可。由此推出两个方向都成立的结论:遵守它,不等于取得了许可;不遵守它,也不自动等于违法。

这两个方向同样重要,任何一边被说成绝对,都会滑向错误。下一章会把它们各自对应到法律层再讲一次。

5.2 措辞里的态度:是"被请求遵守",不是"获得许可"

如果 R03 还不够清楚,规范在第一章里还有另一处措辞可以作证。它在描述规则对爬虫的效力时,用的词是“are requested to honor”——被请求遵守(台账 R04),而不是"必须获得许可"。

"请求"和"许可"是两种完全不同的关系,值得停一下:

  • 许可意味着"你有权做,我同意"——这是一种授权关系;
  • 请求遵守意味着"我希望你配合"——这是一种礼貌关系。

规范自己选择了后者。这也就是为什么第一层只能叫"协议规则层"——它的力量来自双方的默契,不来自强制。换个说法:robots.txt 是网站对着爬虫的一次表态,而不是一次批准。

5.3 第二层是另一份东西:网站条款与 API 条款

那么,"授权"这件事在第一层之外归谁管?答案是第二层:网站自己拟定的使用条款。

这一层和第一层有本质区别:robots.txt 是按一份公开协议写的技术声明,而使用条款是网站方自己拟定的、你和网站之间的约定。你的访问行为一旦超出条款允许的范围,性质就从"没配合协议"变成了"违反了约定"。常见的形态包括:

  • 网站使用条款里关于"自动化访问"“数据抓取”"账号行为"的那几条;
  • 如果网站提供官方 API,那么API 条款是比使用条款更具体的约定——它往往明确写了能怎么调用、能调多少。

第二层的门槛,比第一层低得多、也硬得多:第一层你"没配合",通常不会有直接后果;第二层你"违反了约定",对方就可以据此中止服务、追究违约责任。这也是为什么"能抓"和"该抓"必须分开问——第一层回答的是前者,第二层才开始回答后者。

本章可以带走的一句:robots.txt 说的是"我请求你配合",网站条款说的才是"我们之间的约定"——这是两层,不能混为一谈。

完整版合规边界速查表:覆盖协议规则层、网站条款层与法律层三层的对照关系,和本章讲的"规则不是授权"正好配套,放在资料包里,扫码即可获取:

六、第三层:法律边界在哪

6.1 《网络安全法》:现行禁令在第二十九条

走到第二层之外,才进入真正具有国家强制力的一层。这里有个容易记错的点要先说清楚:《网络安全法》的禁令条款现行是第二十九条(2025-10-28 通过修改决定,2026-01-01 施行),不是过去常被引用的第二十七条。

第二十九条的核心内容,可以拆成三层禁令来记:

  • 不得非法侵入他人网络、干扰他人网络正常功能、窃取网络数据;
  • 不得提供专门用于侵入等危害网络安全活动的程序、工具;
  • 明知他人从事危害网络安全活动,不得为其提供技术支持、广告推广、支付结算等帮助。

把这三层禁令和"爬虫"这个主题对上,关系其实很直接:如果自动化访问越过了"未经授权"这条线,“侵入”“干扰”"窃取"就可能被对应上。反过来说,法律层盯的从来不是"你有没有用工具",而是"你有没有获得授权、有没有造成损害"。

6.2 《刑法》:两个常见条文

比《网络安全法》更重的一层,是《刑法》。和这个主题相关的主要是两个条文:

  • 第二百八十五条:非法侵入计算机信息系统罪;非法获取计算机信息系统数据、非法控制计算机信息系统罪;提供侵入、非法控制计算机信息系统程序、工具罪;
  • 第二百八十六条:破坏计算机信息系统罪。

这两个条文的共同点是:它们管的都是**“未经授权"或"造成破坏”**这类情形。换句话说,法律层真正在意的,依旧是"有没有获得授权"和"有没有造成损害"——这一点和上一节《网络安全法》的判断逻辑是一致的,只是层级的轻重不同。

关于量刑,这里只提一句:另有司法解释规定了量化门槛。至于具体的数字门槛——比如达到多少条、多少台——属于另一篇文章已经写透的范围,本文一个数字都不给,免得把"门槛"误读成"目标线"。

6.3 robots.txt 在中国的直接法律效力:本文标"待验证"

最后必须正面回答一个所有人都想知道、但本文**必须诚实说"不知道"**的问题:在中国法下,robots.txt 本身有没有直接的法律效力?

本文的答案是:待验证。截至目前(截至 2026-10-07),本文未核到任何中国法律条文或司法解释直接点名 robots.txt(台账 NB10)。因此在核实之前,有两句话两个方向都不能写:

  • 不能写"违反 robots.txt 就是违法"——因为本文没有核到这条依据;
  • 也不能写"robots.txt 没有法律效力,所以随便抓"——这是把"没核到直接条文"偷换成了"没有效力",同样没有依据。

稳妥的表述只能是:robots.txt 属于第一层的协议规则;它是不是、以及在多大程度上能作为法律层的判断依据,截至 2026-10-07 仍未核到直接条文,标"待验证"。把"没查到"说成"没有",和把"请求遵守"说成"法律强制",是同一种错误的两面。

本章可以带走的一句:法律层管的是"有没有授权、有没有损害",而 robots.txt 能否直接充当法律依据,本文标"待验证",两个方向都不要下结论。

七、三层怎么合起来用

7.1 一张表把三层并排

把前面六章收拢成一张表,后面遇到具体情境,对着表定位就行:

层谁定的有没有强制力你能做什么
协议规则层(robots.txt)网站方按 RFC 9309 书写无;规范措辞是"被请求遵守"读懂它,据此判断边界
网站条款层(使用条款 / API 条款)网站方自己拟定约定层面有约束力读条款,确认自动化访问是否被允许
法律层(《网络安全法》《刑法》)国家立法机关有国家强制力确保访问本身有授权、不造成损害

这张表要表达的核心只有一句:三层是三个独立的关卡,通过前一层不自动带到下一层。

实际使用这张表时,顺序建议从下往上核对:先确认法律层没有越线(有没有授权、会不会造成损害),再看条款层是否允许(条款和 API 条款怎么写的),最后才回到协议规则层逐个路径去看 robots.txt。把顺序倒过来——只盯着 robots.txt 判断"能不能抓"——正是本文开篇说的那种"把三层压成一层"的做法。

7.2 一份"只读动作"自查清单

落到动手之前,可以按下面这份清单逐条自问。注意:清单一律是只读的观察与判断,不涉及任何抓取动作。

  • 我有没有明确授权?对象是我自己的资产,还是书面授权覆盖的范围?
  • 我读懂了这个站点的 robots.txt 吗?(组、规则、最长匹配——第三章那套)
  • 这个站点的使用条款里,关于自动化访问是怎么写的?
  • 如果它提供官方 API,我是否应该走 API,而不是别的路径?
  • 这件事会不会干扰到对方服务的正常功能?

清单里没有一条是"怎么抓",全是"我站在哪一层、有没有越线"。这正是本文和抓取教程的分界线:教程从"怎么发请求"开始,本文到"该不该发"为止。

7.3 只读观察:怎么把 robots.txt 取回来读

最后给一个只读的观察动作:只是把 robots.txt 取回来看,不发起任何抓取。

⚠️代码待验证

curl-Ihttps://example.com/robots.txt

⚠️代码待验证

curl-shttps://example.com/robots.txt

第一条用-I只取响应头,用来观察这个文件在不在、返回什么状态码——正好对应第四章那两种情形;第二条把正文取回来阅读。example.com是保留的示例域名,这里只用来说明"取回来看"这一步,不指向任何具体站点。

再强调一次:取回来看是在读规则;本文到此为止,不写任何"取回来之后怎么发请求"的东西。

本章可以带走的一句:动手前先过一遍三层和这份只读清单,把"我能做"和"我该做"分开回答。

完整版三层边界对照表:把协议规则层、网站条款层、法律层三层的判定要点与自查清单整理在一张表里,和本章的收尾正好呼应,放在资料包里,扫码即可获取:

附表 A:本文引用事实与官方出处对照表

事实出处本文位置
RFC 9309 状态为 Standards Track、2022 年 9 月发布,作者来自 Google LLCRFC 9309 页首2.1
协议用途:服务方控制内容如何、乃至是否被爬虫访问RFC 9309 Abstract2.1
“These rules are not a form of access authorization.”RFC 9309 §1 末句5.1
效力措辞为 “are requested to honor”RFC 9309 §15.2
规则必须放在名为robots.txt的文件;语言由 rule 与 group 构成;最后一个 group 可以无规则=隐式允许全部RFC 9309 §2.12.2 / 2.3
匹配必须从路径第一个八位组开始;必须用最具体(最长)匹配;allow 与 disallow 等价时采用 allow;无匹配即允许;/robots.txt隐式允许RFC 9309 §2.2.23.1
匹配应为大小写敏感(SHOULD);百分号编码比较规则RFC 9309 §2.2.23.3
应忽略不属于任何 group 的规则RFC 9309 §2.2.2 末3.3
4xx:robots.txt 不可用时爬虫 MAY 访问任意资源RFC 9309 §2.3.1.34.1
5xx:不可达时视为未定义,爬虫 MUST 假定完全禁止;持续约 30 天 MAY 改按不可用处理RFC 9309 §2.3.1.44.2
解析错误 MUST 逐行尝试并采用可解析出的规则RFC 9309 §2.3.1.54.3
解析上限 SHOULD 存在,且 MUST 至少 500 KiBRFC 9309 §2.54.3
最长匹配示例:/example/page/disallowed.gif胜出RFC 9309 §5.23.2
《网络安全法》2025-10-28 通过修改决定、2026-01-01 施行;现行禁令条款为第二十九条本账号法律轴已核事实6.1
《刑法》第 285 条、第 286 条本账号法律轴已核事实6.2
robots.txt 在中国法下的直接法律效力未核到直接条文(台账 NB10,待验证)6.3

附表 B:术语速查表

术语一句话解释层次
robots.txt网站按 RFC 9309 放在固定位置的规则文件第一层
RFC 9309《Robots Exclusion Protocol》,2022-09 标准轨道文档第一层
rule(规则)协议语言里的键值对,如 Allow / Disallow第一层
group(组)一组 user-agent 行,加上其后的规则第一层
最长匹配匹配到的八位组最多的那条规则胜出第一层
allow 优先两条匹配等价时采用 allow第一层
4xx / 5xx 处理文件"不可用"与"不可达",规范分别给 MAY 与 MUST第一层
访问授权"你有权做、我同意"的许可关系第二层
使用条款 / API 条款网站自己拟定、与访问者之间的约定第二层
《网络安全法》第二十九条现行禁令条款,侵入 / 干扰 / 窃取等三层禁令第三层
《刑法》第 285 / 286 条非法侵入 / 获取 / 控制,破坏计算机信息系统第三层
待验证本文未核到直接依据、因而不下结论的标注第三层

写在最后:这篇用到的资料

写这篇文章时,把 robots.txt 背后的 RFC 9309 原文逐条对着读了一遍,才发现"规则不是授权"这句话早就写在规范第一章里,顺手也整理了几份配套的东西:

  • 三层边界对照表:协议规则层、网站条款层、法律层三层的判定要点与自查清单
  • Web 安全学习路线图:从基础打牢到安全管理,四个阶段各学什么
  • 常用靶场清单:每个靶场练什么、适合哪个阶段

资料是我自己整理的,放在下面这个码上,扫码即可获取:

添加时备注「靶场」,优先通过。

拿到之后建议先看三层边界对照表那一份,把"规则、条款、法律"三层的关系先理顺,再动手做任何自动化的事。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询