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

相关推荐
wuyk5551 天前
PyQt6-第14讲-数据库与Excel双向同步
数据库·python·ui·excel·pyqt
我的xiaodoujiao1 天前
Django 权限系统项目实战详细图文教程 3--系统登录功能实现
后端·python·django
努力变大白1 天前
ReAct Agent 创建:tools 协议与文本 ReAct 双路线实践
python·agent·react框架
乐观的Terry1 天前
AI翻译助手-JWT与redis无状态认证
数据库·redis·缓存
vipxieliang1 天前
Python 面向对象编程:类、继承、多态与组合
python
Nuanyt1 天前
Agent 学习笔记(下篇二):Claude Code 生态、RAG 与 Memory(Stage 5–6)
笔记·python·memory·rag·aiagent·claude code·agentskill
用户298698530141 天前
Python 实战:Markdown 转 PDF 的代码实现与页面设置
python·api·markdown
thusloop1 天前
零门槛接入 GPT-6-astra 与 claude-opus-5-5,三大场景实战指南
python·gpt·算法·agent·claude·codex
程序猿乐锅1 天前
Streamlit 实现 AI 聊天 Agent:角色提示词、流式输出与会话管理
开发语言·前端·笔记·后端·python·学习
小南知更鸟1 天前
【2026 年 Python 包管理工具选型:从“工具崇拜”回到工程约束】
开发语言·python