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:

关于语法的一个警告:路径模式中的通配符*$不在原始标准中,但每个主要引擎都支持它们,因此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是一个值得尊重的信号,而不是阻止你的锁或自行约束你的合同。

它的约束——以及它不约束的内容

这是人们最需要澄清的部分。robots.txt本身并不具有法律约束力,也不是技术访问控制机制——它没有锁住任何东西。法院通常将众所周知的公共数据视为公共数据。但“本身不是法律”并不等于“没有后果”。忽视网站的声明愿望可能成为服务条款、侵入或计算机滥用争议中的一个因素,招致封锁和额外审查,而且这只是糟糕的公民行为。务实的立场是:将robots.txt视为你应遵守的伦理底线,并将实际的法律问题——个人数据、合同、管辖权——视为需要正确处理的单独事项。我们对2026年网络爬虫合法性的概述单独介绍了这些问题。

AI爬虫的转变

robots.txt作为AI训练的选择退出渠道获得了第二次生命。网站现在为AI用户代理添加了明确的规则——GPTBotGoogle-ExtendedCCBotClaudeBotPerplexityBot等——表示“索引我,但不要用我训练”。这就是为什么研究人员现在认为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,匹配用户代理,遵守爬行延迟,抓取允许的公共路径
合规抓取首先读取文件,遵守速率指令,并仅访问允许的公共路径。

在获取数据的同时做一个好公民

尊重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是一个小文件,传达了一个大信号:这是该网站希望被抓取的方式。首先阅读它,遵守路径和节奏,声明你是谁,你就可以在完全遵守礼仪和风险的情况下收集你需要的公共数据。

尝试使用robots-aware爬虫的Scraper API