robots.txt 不是门禁:RFC 9309 规则、缓存与 Python 爬虫的 10 个边界

robots.txt 不是门禁:RFC 9309 规则、缓存与 Python 爬虫的 10 个边界

爬虫启动前,经常有人问"robots.txt 能不能爬"。更准确的说法是:它是站点公开给自动客户端的访问约定,不是登录鉴权,也不是防火墙。RFC 9309 将 Robots Exclusion Protocol 定义为服务方控制爬虫访问 URI 的规则,并明确这些规则不是访问授权。

本文用离线合成的 robots.txt 做 5 项检查,重点讲清 user-agent 分组、Allow/Disallow 的最长匹配、文件不可用和缓存边界。没有访问任何真实站点,也没有据此推断某个站点的抓取许可。

1. 文件放在哪里

RFC 9309 要求规则位于服务顶层、全小写的 /robots.txt,内容使用 UTF-8 和 text/plain。例如:

text 复制代码
https://example.test/robots.txt

规则只对对应 authority 生效。example.test/robots.txt 的规则不能直接套到 api.example.test,也不能把一个站点的 robots 文件当成所有域名的统一配置。

2. user-agent 是分组匹配

一个最小文件可以这样写:

text 复制代码
User-agent: *
Disallow: /private
Disallow: /tmp/
Allow: /private/public

User-agent: DemoBot
Disallow: /
Allow: /public

* 是通配组;更具体的 user-agent 组需要按实现和协议规则选择。不要看到"有一条 Allow"就全站放行,也不要把 User-agent: DemoBot 当成 HTTP 身份认证。它只是爬虫声明自己使用的标识。

3. 最长匹配决定具体路径

对 /private/public/x,/private/public 比 /private 更长,所以 Allow 规则覆盖较短的 Disallow;对 /private/a,没有更长的 Allow,仍然禁止。实际实现需要保留原始路径和命中的规则,方便解释一条 URL 为什么被放行或拒绝。

Python 标准库 urllib.robotparser 可以快速处理基础 Disallow,但本机 Python 3.13.13 实验显示它没有按 RFC 9309 的 Allow 例外得到预期结果:同一个文件里 /private/public 仍被判为禁止。因此不能只看 API 名称就宣称"完全兼容 RFC";如果业务依赖 Allow 和最长匹配,应选经过核验的实现或明确编写并测试规则引擎。

4. 本地 5 项实验

保存为 robots_demo.py 运行,环境是 macOS arm64、Python 3.13.13。实验同时保留标准库结果和一个仅针对上述固定规则的最长匹配实现:

text 复制代码
stdlib_private_block=PASS
rfc_longest_match_allow=PASS
rfc_longest_match_block=PASS
rfc_tmp_block=PASS
stdlib_allow_gap_documented=PASS
checks=5
stdlib_allow_gap=urllib.robotparser on this Python ignores Allow; use a standards-aware parser or implement the rule deliberately
environment={"python": "3.13.13", "platform": "macOS-27.2-arm64-arm-64bit-Mach-O"}

最后一项不是"标准库正确通过",而是把差异明确记录下来,防止把库的行为误称为协议行为。

5. 获取失败时不能写成"允许"

RFC 9309 区分成功、重定向、不可用、不可达和解析错误。成功下载后应遵守可解析规则;重定向应按规范处理;文件暂时不可达时,是否沿用缓存需要和错误策略一起设计。协议还建议缓存 robots.txt 不超过 24 小时,除非文件不可达。

工程上至少记录:请求 URL、状态码、最终 URL、响应编码、抓取时间、缓存命中与命中的规则。把超时、DNS 失败或 5xx 直接当成"没有限制"会造成意外访问;把所有异常都永久当成"全站禁止"又会让恢复困难。根据你的合规策略选择 fail-closed 或人工复核,不能伪造一个"官方默认值"。

6. robots.txt 不是安全措施

RFC 9309 明确指出,robots.txt 不是访问控制。文件本身公开,写进其中的路径也会被发现。需要保护内容时仍要使用鉴权、签名 URL、网络策略或服务端授权;不要把密钥目录、备份路径当作"写进 Disallow 就安全"。

参考:RFC 9309 Robots Exclusion Protocol。本文由 AI 辅助整理,示例数据为合成内容,实验结果为本机实际运行结果。

相关推荐
沉下心来学鲁班1 小时前
DeepAgents 记忆机制:让 AI Agent 拥有“跨对话“的记忆
服务器·人工智能·python
for_ever_love__1 小时前
缓存穿透、击穿、雪崩:三个经典问题与完整解决方案
java·数据库·redis·缓存·哈希算法·布隆过滤器·雪崩
Helix2501 小时前
Python与其他编程语言优劣势对比:2026初学者选型指南
java·python·教程·编程语言·入门·初学者编程选型
零基础1231 小时前
深度强化学习驱动的 Agent 后训练:原理、实践与前沿路线
人工智能·python·机器学习
I Am a robert girl2 小时前
PhysStream 源码级拆解:流式视频生成如何做到“边生成边控制“
python·音视频·源码解析·视频生成·可控生成·流式生成·物理控制
高洁012 小时前
数字孪生驱动大模型工业知识库
人工智能·python·深度学习·机器学习·transformer
远航计算机2 小时前
AI 爬虫分三种,你 robots.txt 里挡的是哪一种?
人工智能·爬虫·aigc
RS迷途小书童2 小时前
Python+FFmpeg提取大疆无人机MP4内嵌mov_text遥测SRT字幕并做完整性校验
python·ffmpeg·大疆·srt字幕·dji
幻影123!2 小时前
AlphaZero 五子棋实战(番外二):白棋专项训练的一种方案
python·机器学习·强化学习·五子棋·alpha zero