robots.txt用于网络爬虫:它的约束与非约束
robots.txt是一种约定,而不是合同,也不是锁。以下是它对爬虫的实际要求、无法强制执行的内容,以及如何在尊重它的同时获取数据。
每次关于爬虫伦理的讨论都从robots.txt开始,而大多数人都会在两个方向上犯错——要么把它当作一条违法会被逮捕的法律,要么完全忽视它。它既不是法律,也不是噪音。robots.txt是一种自愿约定,告诉行为良好的机器人网站希望它们避开的路径。准确了解它的约束和非约束是专业数据操作与鲁莽行为的区别。这是一个实践者指南,提前说明:这仅供参考,不是法律建议。
robots.txt的实际意义
robots.txt实现了机器人排除协议,于2022年标准化为RFC 9309。它是一个位于域名根目录的纯文本文件——https://example.com/robots.txt——每个域或子域一个文件。它是可选的:404仅表示该网站没有文件,也没有表达偏好。关键是,这是一个请求,而不是障碍。提供robots.txt并不能从技术上阻止访问;它依赖于读取它的机器人的诚信。
阅读它是一个简单的请求——在你抓取任何内容之前,每次都要这样做:
# Just read it
curl -s https://example.com/robots.txt
# Through a proxy, as your scraper would see it
curl -s -x http://USER:PASS@gate.quantumproxies.io:8000 https://example.com/robots.txt
重要的指令
词汇量很小。学会这些,你就可以一眼读懂任何robots.txt:
User-agent——以下规则针对哪个机器人。*表示所有机器人;像Googlebot这样的名称针对一个。指令名称不区分大小写,但路径值区分大小写:/Private/不是/private/。Disallow——不应抓取的路径前缀。Disallow: /admin/阻止该文件夹及其下的所有内容。Disallow: /阻止整个网站;空的Disallow:允许所有内容。Allow——一种非标准但普遍认可的覆盖,允许在被禁止的路径内的某个路径。Crawl-delay——一种非标准提示,要求请求之间间隔N秒。要遵守它:忽视它是被标记的最快方式之一。Request-rate和Visit-time——稀有指令,限制每个间隔的请求或限制爬虫在某些UTC时间内运行。Sitemap——指向XML站点地图的绝对URL。这不是限制,而是礼物:它为你映射了网站的结构。
关于语法的一个警告:路径模式中的通配符*和$不在原始标准中,但每个主要引擎都支持它们,因此Disallow: /*.pdf$在实践中常见且有效。
import urllib.robotparser as rp
# Parse robots.txt and check a URL for your user agent
robots = rp.RobotFileParser()
robots.set_url("https://example.com/robots.txt")
robots.read()
UA = "MyResearchBot/1.0"
print(robots.can_fetch(UA, "https://example.com/products")) # True / False
print(robots.crawl_delay(UA)) # seconds, or None

它的约束——以及它不约束的内容
这是人们最需要澄清的部分。robots.txt本身并不具有法律约束力,也不是技术访问控制机制——它没有锁住任何东西。法院通常将众所周知的公共数据视为公共数据。但“本身不是法律”并不等于“没有后果”。忽视网站的声明愿望可能成为服务条款、侵入或计算机滥用争议中的一个因素,招致封锁和额外审查,而且这只是糟糕的公民行为。务实的立场是:将robots.txt视为你应遵守的伦理底线,并将实际的法律问题——个人数据、合同、管辖权——视为需要正确处理的单独事项。我们对2026年网络爬虫合法性的概述单独介绍了这些问题。
AI爬虫的转变
robots.txt作为AI训练的选择退出渠道获得了第二次生命。网站现在为AI用户代理添加了明确的规则——GPTBot、Google-Extended、CCBot、ClaudeBot、PerplexityBot等——表示“索引我,但不要用我训练”。这就是为什么研究人员现在认为robots.txt本身已不足以将公共数据排除在模型之外:这完全取决于每个爬虫是否选择遵守,并且它只对声明的、行为良好的代理有效。如果你运营一个爬虫,声明一个诚实的User-Agent并尊重这些选择退出是基本要求。相反意图的新兴伴随文件——邀请AI工具进入——是llms.txt,我们在llms.txt指南中介绍。
# A modern robots.txt often carries AI-specific opt-outs:
# User-agent: GPTBot
# Disallow: /
#
# User-agent: Google-Extended
# Disallow: /
#
# User-agent: *
# Crawl-delay: 5
# Sitemap: https://example.com/sitemap.xml

在获取数据的同时做一个好公民
尊重robots.txt并收集你需要的公共数据并不矛盾。保持你受欢迎的纪律也是保持你不被封锁的纪律:遵守Crawl-delay并合理安排请求,诚实地识别你的机器人,积极缓存以避免重新获取相同页面,并避免网站试图保护的昂贵端点。社区规范,在论坛上很好地表达了,robots.txt主要是为了阻止产生巨大流量的机器人——所以不要成为那个机器人。我们的礼貌爬虫指南将其转化为具体的节奏规则。
对于希望默认处理合规的团队,Scraper API可以在请求中读取并尊重robots.txt,同时进行合理的速率限制——因此良好的公民行为是工具的默认行为,而不是你可能忘记的复选框。它还保持了一个干净、声明的足迹,而不是从一个IP进行的原始脚本攻击。
常见问题解答
robots.txt在法律上适用于网络爬虫吗?
本身不适用。robots.txt是一个自愿约定(RFC 9309),不是法律或合同,并且在技术上不阻止访问。但忽视它可能导致服务条款、侵入或计算机滥用索赔,并招致封锁和审查。将其视为你应遵守的伦理底线,并单独处理实际的法律问题——个人数据、合同。这不是法律建议。
我如何阅读网站的robots.txt?
向域名根目录发送一个HTTP GET请求,附加/robots.txt,例如https://example.com/robots.txt。curl或任何HTTP客户端都可以;在Python中,urllib.robotparser解析它并为给定的用户代理和URL回答can_fetch()。404表示该网站没有robots.txt,也没有声明抓取偏好。
Disallow: /是什么意思?
它要求所有匹配的机器人不要抓取网站上的任何路径——整个域名根据请求是禁止的。空的Disallow:表示相反:所有内容都被允许。记住,这些是对行为良好的爬虫的请求,而不是强制的障碍,并且路径值区分大小写,而指令名称不区分大小写。
如果数据是公开的,我可以忽略robots.txt吗?
从技术上讲,你可以,因为它不强制执行,但通常不应该。忽视它是糟糕的公民行为,会更快地导致你被封锁,并可能在争议中加强网站对你的论点。专业的方法是尊重它,只抓取允许的公共路径,合理安排请求,并完全排除个人数据。
robots.txt是一个小文件,传达了一个大信号:这是该网站希望被抓取的方式。首先阅读它,遵守路径和节奏,声明你是谁,你就可以在完全遵守礼仪和风险的情况下收集你需要的公共数据。