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 辅助整理,示例数据为合成内容,实验结果为本机实际运行结果。