在robots.txt三十年的历史中,它大部分时间只是一种礼貌:一份纯文本文件,请求爬虫不要访问某些路径,除了良好礼仪之外别无支撑。这一点已经改变。它在2022年成为正式的互联网标准。在欧盟,机器可读的选择退出机制现在决定了文本与数据挖掘是否合法,而人工智能模型提供商负有法律义务去发现并遵守这些机制。与此同时,一批新的信号涌现出来,每一种都声称在表明某个网站允许人工智能系统对其内容做什么。
对于任何采集公开网络数据的人来说,尤其是那些数据最终会用于训练或输入人工智能模型的人来说,实际的问题很简单:哪些信号是你必须遵守的,它们意味着什么,以及你应该如何应对?本指南阐述了截至2026年9月的现状。
关键要点
- robots.txt是一项IETF标准,即RFC 9309。它定义了精确的匹配规则,但明确指出其规则”并非一种访问授权形式”。
- 在欧盟,商业性文本与数据挖掘的例外情形仅适用于权利人尚未”以适当方式,例如机器可读手段”就在线内容保留其权利的情况。德国法院已裁定,此类权利保留只有以机器可读形式作出才有效。
- 自2025年8月2日起,通用人工智能模型提供商已被要求识别并遵守这些权利保留。委员会对其处以罚款的权力自2026年8月2日起适用。
- 新的偏好信号已经出现,从Cloudflare的Content Signals到IETF起草中的AI偏好词汇表,但目前都还不是成熟的标准。即便这些信号不具约束力,也应予以记录。
- 使用代理网络并不改变一个网站所要求的内容。相关义务附着于你所采集的内容以及你如何使用它,而不是附着于你采集数据所用的IP地址。
robots.txt现在是一项标准
RFC 9309于2022年9月发布,将一项事实上的惯例变成了拟议标准(Proposed Standard)。其中几项规则会让那些只是肉眼读过robots.txt文件的人感到意外:
- 最具体的规则胜出。“必须使用找到的最具体匹配项”,以匹配规则的长度来衡量,当一条allow规则与一条disallow规则等效时,优先采用
allow。文件中的顺序并不重要。 - 代理匹配不区分大小写,如果爬虫没有匹配到的分组,则会回退到
*分组。 - **错误的含义各不相同。**如果robots.txt不可用,返回4xx响应,爬虫可以访问任何内容。如果由于服务器或网络错误而无法访问,爬虫”必须假定完全禁止访问”。
- **缓存有时限。**爬虫”不应将缓存版本使用超过24小时,除非robots.txt文件无法访问”。
而其中最重要的限制是:“这些规则并非一种访问授权形式。“robots.txt并不能使内容变为私密,忽略它也不等同于闯入系统。在某些情境下赋予它分量的,是法律,而非协议本身。
为什么它在欧盟具有法律意义
欧盟的版权规则允许对合法可访问的内容进行文本与数据挖掘,但设有两种不同的例外情形。一种适用于从事科学研究的研究机构和文化遗产机构,没有选择退出机制。另一种适用于其他所有人,包括商业性挖掘,但仅在使用行为”尚未被权利人以适当方式明确保留,例如就公开在线提供的内容而言以机器可读手段保留”的情况下适用。
《人工智能法案》随后将这一规则适用于人工智能。通用人工智能模型的提供商必须”建立一项政策,以遵守欧盟关于版权及相关权利的法律,尤其是要识别并遵守”根据版权规则作出的”权利保留,包括通过最先进的技术手段”。这些义务自2025年8月2日起已经适用。委员会对通用人工智能提供商处以最高全球营业额3%罚款的权力,自2026年8月2日起适用,而在2025年8月之前投放市场的模型则有时间至2027年8月2日进行合规。
2025年7月发布的自愿性《通用人工智能行为准则》(General-Purpose AI Code of Practice)将这一点具体化。签署方承诺”使用能够读取并遵循按照《机器人排除协议》(robots.txt)所表达指令的网络爬虫”,该协议依据RFC 9309规定,并识别和遵守其他适当的机器可读协议。该准则中有两点值得注意的但书。遵守该准则”并不构成对欧盟版权及相关权利法律的合规”。而且该承诺不影响版权如何适用于”由第三方从互联网上抓取或爬取”并由签署方使用的内容。购买一个数据集并不能洗清适用于其数据来源的权利保留。
法院的相关裁决
判例法仍在形成之中,以下两项裁决展示了发展方向。
在德国,一名摄影师起诉非营利组织LAION,指控其在人工智能训练数据集中使用了他的图片。汉堡的法院驳回了该诉讼请求。在上诉中,高级地区法院(按照联邦最高法院总结的措辞)认为,对在线作品的权利保留只有”以机器可读形式”(in maschinenlesbarer Form)作出才有效,而原告未能证明其以自然语言写在使用条款中的权利保留,在相关时间点是机器可读的。联邦最高法院于2026年9月3日审理了进一步上诉,并已将裁决日期定于2026年12月17日。
在荷兰,阿姆斯特丹一家法院于2024年10月30日就报纸出版商与一家新闻聚合平台之间的纠纷作出裁决。该聚合平台辩称(而出版商方面对此并无异议),其robots.txt仅排除了特定的人工智能机器人,例如GPTBot、ChatGPT-User和CCBot。这不足以证明针对该聚合平台的使用行为,权利已以适当的机器可读方式被保留,因此该例外情形得以适用。
两项裁决都指向同一个方向:起决定性作用的是机器可读的信号,而针对特定机器人的信号可能并不构成对其他所有人的权利保留。两者都不是最终定论,并且都取决于具体事实。具体问题应咨询律师。
你会遇到的信号
| 信号 | 位置 | 状态 | 表达的内容 |
|---|---|---|---|
| robots.txt的Allow和Disallow | /robots.txt | IETF标准,RFC 9309 | 指定的爬虫是否可以访问某个路径 |
| Content Signals | robots.txt中的行,例如Content-Signal: search=yes, ai-train=no | Cloudflare政策,2025年9月发布 | 对搜索、AI输入和AI训练的偏好 |
| AI偏好(Content-Usage) | robots.txt行或HTTP头,例如Content-Usage: train-ai=n | IETF工作组草案,尚未成为标准 | 对AI训练、AI使用和搜索的偏好 |
| TDMRep | /.well-known/tdmrep.json、tdm-reservation HTTP头或HTML meta标签 | W3C社区组报告,并非W3C标准 | 文本与数据挖掘权利是否被保留 |
| 服务条款 | 网站的法律页面 | 合同性质,在欧盟若为机器可读则可能构成权利保留 | 网站条款所规定的一切内容 |
有两个细节值得注意。Cloudflare的Content Signals定义了search、ai-input(用于检索、依据事实作答以及生成答案)和ai-train,该政策声明”内容信号表达的是偏好;它们并非针对抓取的技术性反制措施”。它还声明,通过这些信号表达的限制,构成欧盟版权规则下明示的权利保留。与此同时,IETF草案确实尚未完成:当前的词汇表草案带有一条说明,称其内容”并未反映工作组的共识(DO NOT REFLECT CONSENSUS of the Working Group)“。预计相关标签还会发生变化。
主要人工智能爬虫如何处理这些信号
各运营方发布了各自的规则,而且这些规则有所不同,尤其是在代表用户发起抓取的情形下。
| 运营方 | 代理 | 按运营方说法,阻止它会产生什么效果 |
|---|---|---|
| OpenAI | GPTBot | 表明内容”不应被用于训练生成式人工智能基础模型” |
| OpenAI | OAI-SearchBot | 该网站不会出现在ChatGPT搜索答案中,但仍可能作为导航链接出现 |
| OpenAI | ChatGPT-User | 由用户发起;“robots.txt规则可能不适用” |
| Google-Extended | 一个robots.txt令牌,没有独立的用户代理;控制其用于训练和为Gemini模型提供依据事实作答的支持,并且”不会影响网站在Google搜索中的收录情况” | |
| 用户触发的抓取器 | ”通常会忽略robots.txt规则” | |
| Anthropic | ClaudeBot、Claude-User、Claude-SearchBot | 阻止ClaudeBot会将未来内容排除在训练之外;阻止Claude-User会阻止针对用户查询的检索;这些机器人遵守robots.txt和crawl-delay |
对数据团队而言,这里的教训是:“阻止AI”并非一个单一开关。一个网站可以允许搜索引擎索引,同时拒绝用于训练;也可以拒绝用于训练,但在用户询问相关内容时仍被实时抓取。请针对你实际的使用方式来阅读相应信号。
有多少网站选择退出
选择退出的比例增长很快。Data Provenance Initiative发布于2024年7月的”Consent in Crisis”研究,对14,000个网络域名进行了审计,发现在短短一年内,robots.txt的限制使得”C4中所有token的约5%以上,或C4中维护最积极、最关键来源的28%以上,被完全限制”,并且”就服务条款方面的爬取限制而言,C4中现有整整45%受到限制”。不过,在网络头部,覆盖率并不均衡:Cloudflare在2025年7月报告称,“在排名前10,000的域名中,目前只有约37%拥有robots.txt文件”,而在这些文件中,GPTBot在7.8%的文件中被禁止访问。
负责任的数据采集者应该做什么
无论你是否训练模型,一项明确的政策都能保护你以及你所依赖的网站。
- **正确抓取并遵守robots.txt。**缓存时间不超过24小时,将服务器错误视为”禁止一切”,并按照RFC 9309的方式匹配规则。
- **明确你的目的。**索引、用于实时回答的检索以及模型训练是不同的用途,较新的信号对这些用途的处理方式也不同。确定你的采集服务于哪种用途,并针对该用途阅读相应信号。
- **将信号与数据一并记录。**将采集时适用的robots.txt规则、内容信号和TDMRep头,与每条记录一起存储。如果某个数据集日后被用于人工智能,这份记录就是你证明已识别相关权利保留的依据。它应当属于与获取角度和采集时间相同的溯源记录的一部分。
- **请律师评估服务条款。**这些条款在任何地方都可能具有合同效力,而在欧盟,如果以机器可读方式表达,它们可能被视为一种权利保留。
- **控制你的采集节奏。**遵守爬取限制,并在负载过高时放缓速度,这也是同样的良好诚意的一部分,详见速率限制与请求节流。
关于工具的一点提醒:Python内置的urllib.robotparser是按照文件中的顺序而非最具体匹配来应用规则的。给定Disallow: /shop后接Allow: /shop/public,它会将/shop/public/item报告为禁止访问;如果调换这两行的顺序,它又会报告为允许。而RFC 9309规定无论顺序如何都应为允许。以下是一个遵循该RFC、并记录其所发现的AI偏好行的小型检查器:
import re
import urllib.error
import urllib.request
def _groups(text):
"""Parse robots.txt into (agents, rules, extras) groups, following RFC 9309 grouping."""
groups, agents, rules, extras, last = [], [], [], [], None
for raw in text.splitlines():
line = raw.split("#", 1)[0].strip()
if ":" not in line:
continue
key, value = (p.strip() for p in line.split(":", 1))
key = key.lower()
if key == "user-agent":
if last != "user-agent" and agents:
groups.append((agents, rules, extras))
agents, rules, extras = [], [], []
agents.append(value.lower())
elif key in ("allow", "disallow") and agents:
rules.append((key, value))
elif key in ("content-signal", "content-usage") and agents:
extras.append((key, value))
last = key
if agents:
groups.append((agents, rules, extras))
return groups
def _pattern(path):
regex = re.escape(path).replace(r"\*", ".*")
return re.compile(regex[:-2] + "$" if regex.endswith(r"\$") else regex)
def check(robots_txt, user_agent, path):
"""Allow/disallow per RFC 9309 (most specific match wins, allow on ties), plus AI signals."""
token = user_agent.lower()
groups = _groups(robots_txt)
matched = [g for g in groups if token in g[0]] or [g for g in groups if "*" in g[0]]
rules = [r for g in matched for r in g[1]]
extras = [e for g in matched for e in g[2]]
best = None
for kind, value in rules:
if value and _pattern(value).match(path):
length = len(value)
if best is None or length > best[1] or (length == best[1] and kind == "allow"):
best = (kind, length)
return {"allowed": best is None or best[0] == "allow", "signals": extras}
def fetch_robots(origin, opener=None):
"""Fetch robots.txt. Per RFC 9309: 4xx means no rules; 5xx or network failure means disallow all."""
opener = opener or urllib.request.build_opener()
try:
with opener.open(origin.rstrip("/") + "/robots.txt", timeout=30) as r:
return r.read(512 * 1024).decode("utf-8", "replace")
except urllib.error.HTTPError as e:
return "" if 400 <= e.code < 500 else "User-agent: *\nDisallow: /"
except OSError:
return "User-agent: *\nDisallow: /"
它刻意保持精简。生产环境中的爬虫在训练用途相关时,还应检查TDMRep头以及/.well-known/tdmrep.json文件,并对其所依据的每一份robots.txt都保留一份带日期的副本。
代理在其中的作用
住宅代理改变的是请求看起来来自何处。它们并不改变一个网站对你的要求,也不改变你在版权法或某个网站服务条款下所负的义务。欧盟的规则附着于内容的使用行为,而《行为准则》明确将第三方采集行为纳入其适用范围。使用代理网络是为了以特定市场真实用户所见的方式查看网络、礼貌地分散负载、并进行诚实的测量,同时应用与你从自己的服务器发起请求时相同的robots.txt与权利保留检查。更全面的论述见用于人工智能数据采集的合乎道德的住宅代理。
结论
robots.txt已经成熟了。它是一项拥有精确规则的标准,而在欧盟,建立在其基础之上以及与之并存的机器可读权利保留,现在决定着文本与数据挖掘是否被允许,人工智能提供商负有直接的法律义务去遵守这些保留,并且自2026年8月起可对其处以罚款。针对搜索、AI输入和训练的新信号正在迅速扩散,尽管其背后的标准尚未完成。
对数据团队而言,无论这些细节最终如何落定,可行的政策都是一样的:正确解析robots.txt,明确你的采集服务于哪种用途,记录采集那一刻所适用的每一个信号,并将那些你并非严格受其约束的偏好视为值得保留的信息,而非可以丢弃的噪音。现在就这样做的团队,日后无需再费力重建这些记录。
来源与参考文献
- IETF,RFC 9309: Robots Exclusion Protocol,2022年9月。
- 《指令(EU) 2019/790》,关于数字单一市场中版权及相关权利的指令。文本与数据挖掘例外情形。
- 《条例(EU) 2024/1689》,即《人工智能法案》。关于通用人工智能模型提供商的义务及适用日期。
- 欧盟委员会,通用人工智能行为准则,2025年7月10日发布,版权章节。
- 联邦最高法院(Bundesgerichtshof),关于I ZR 281/25的第085/2026号新闻稿,以及审理与裁决日期。
- 阿姆斯特丹地方法院(Rechtbank Amsterdam),2024年10月30日判决,ECLI:NL:RBAMS:2024:6563。
- IETF AI Preferences工作组,draft-ietf-aipref-vocab与draft-ietf-aipref-attach。
- W3C社区组,TDM Reservation Protocol,2024年5月10日。
- Cloudflare博客,Content Signals Policy,2025年9月24日,以及Reid Tatoris,关于控制内容用于AI训练,2025年7月1日。
- OpenAI,OpenAI爬虫概览;Google,常见爬虫与用户触发的抓取器;Anthropic,爬虫帮助文章。
- Longpre等,Consent in Crisis: The Rapid Decline of the AI Data Commons,2024年7月。
本文为一般性信息,并非法律建议。关于你在各司法辖区的义务,请咨询律师。