自动抓取之前先看清三层边界:规则、条款与法律

发布时间:2026/10/8 11:44:42
自动抓取之前先看清三层边界:规则、条款与法律
授权与合规声明本文全部操作对象均为自建隔离靶场本机容器或隔离虚拟机涉及安全测试的环节必须以取得合法授权为前提。未经授权的渗透测试违反《中华人民共和国网络安全法》与《刑法》相关条款须承担相应法律责任。本文只讲环境配置、版本对照与靶场隔离不含任何攻击步骤、利用载荷与绕过手法请勿将文中环境指向任何非自有系统。一、为什么会卡在这一步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 的描述这套协议语言由两个构件组成台账 R05rule规则一组键值对最常见的键就是User-agent、Allow、Disallowgroup组一组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。对 URIexample.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}\nhttps://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 的末句用一句极短的英文把第一层和第二层一刀切开台账 R03These 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.34xxrobots.txt 不可用时爬虫 MAY 访问任意资源RFC 9309 §2.3.1.34.15xx不可达时视为未定义爬虫 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.2robots.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 安全学习路线图从基础打牢到安全管理四个阶段各学什么常用靶场清单每个靶场练什么、适合哪个阶段资料是我自己整理的放在下面这个码上扫码即可获取添加时备注「靶场」优先通过。拿到之后建议先看三层边界对照表那一份把规则、条款、法律三层的关系先理顺再动手做任何自动化的事。