robots.txt 是纯文本文件,必须部署在网站根目录且响应头为 text/plain,用于告知搜索引擎爬虫可抓取路径,其规则基于前缀匹配,不支持完整正则,且仅对遵守协议的爬虫生效。

robots.txt 不是 HTML 文件,不能放在网页里、不能用 <link> 引入、也不能靠前端 JS 控制——它必须是纯文本文件,部署在网站根目录下,且响应头为 text/plain。
robots.txt 文件必须放在根目录,且只能是纯文本
很多开发者误以为可以把 robots.txt 写成 robots.txt.html 或塞进 /static/ 目录,这是无效的。搜索引擎爬虫只认一个路径:https://example.com/robots.txt(注意:必须是域名后直接跟 /robots.txt,不多不少)。
常见错误现象:
- 把文件命名为
robots.txt.html或robots.html→ 爬虫根本不会读 - 放在
/assets/robots.txt或/public/robots.txt→ 返回 404,等同于“无限制” - 用 Nginx/Apache 配置了重写规则,导致实际返回的是 HTML 页面或 302 跳转 → 爬虫可能忽略或报错
正确做法:
立即学习“前端免费学习笔记(深入)”;
- 用任意文本编辑器(如 VS Code)新建文件,保存为
robots.txt(无扩展名、无 BOM) - 确保 Web 服务器对该路径返回
Content-Type: text/plain,不是text/html - 用 curl 验证:
curl -I https://example.com/robots.txt,检查响应头中的Content-Type和状态码(应为 200)
Disallow 和 Allow 的路径匹配规则容易踩坑
Disallow 和 Allow 后面填的是**路径前缀**,不是正则表达式,也不支持通配符(除 * 和 $ 外,且仅部分爬虫支持)。比如 Disallow: /admin 会同时屏蔽 /admin、/admin/、/admin-user —— 因为它是按字符串前缀匹配的。
关键细节:
-
Disallow: /admin/(结尾有斜杠)→ 只禁用该目录及其子路径,不匹配/admin-api -
Disallow: /admin(无斜杠)→ 匹配所有以/admin开头的路径,包括/administer -
Allow: /admin/login.html在Disallow: /admin/之后生效,但仅对支持Allow优先级的爬虫有效(Google、Bing 支持;旧版 Bingbot 不一定) -
Disallow: /*.pdf$这种带$的结尾匹配,仅 Googlebot、Yandex 等少数爬虫识别,requests或自研爬虫默认不解析
Python 爬虫里怎么真正读取并遵守 robots.txt?
不能只靠人工看一眼就开爬。要用代码主动请求 + 解析 + 判断。Python 标准库提供 urllib.robotparser,但它不支持 Crawl-delay、Sitemap,也不处理多个 User-agent 分组逻辑。
实操建议:
- 用
requests.get("https://example.com/robots.txt")获取内容,先检查状态码:404 表示无限制;401/403 表示拒绝访问;200 才继续解析 - 别依赖
robotparser的can_fetch()判断全部路径——它对Allow规则支持弱,且不校验大小写(而实际协议要求路径区分大小写) - 简单场景可手写判断逻辑:对每个待抓 URL,逐条比对
Disallow和Allow规则,按顺序匹配,最后一条生效(Allow优先于Disallow) - 如果发现
Crawl-delay: 5,就在每次请求后加time.sleep(5),而不是只在首次解析时记录
示例片段(判断是否允许抓取):
url_path = urllib.parse.urlparse(target_url).path
for rule in disallow_rules:
if url_path.startswith(rule):
return False # 被禁止
for rule in allow_rules:
if url_path.startswith(rule):
return True # 显式允许
return True # 默认允许动态网站和 SPA 项目怎么处理 robots.txt?
Next.js、Nuxt、Vue Router History 模式等生成的前端路由,本身不产生真实路径,robots.txt 无法直接控制客户端渲染页面。这时候要分两层看:
- 静态资源(如
/_next/、/js/、/css/)可明确Disallow,避免爬虫浪费带宽 - 服务端是否真实返回这些路径的内容?如果所有路由都 fallback 到
index.html,那Disallow: /user/实际无效——因为服务器根本没这个路径,只是前端跳转 - 真正起作用的是
<meta name="robots" content="noindex">或X-Robots-Tag响应头,它们针对具体页面生效,比robots.txt更精准
所以,单页应用必须配合服务端设置:SSR 页面在响应头中加 X-Robots-Tag: noindex,或在 HTML <head> 中注入 meta 标签,robots.txt 只能作为辅助策略。
最常被忽略的一点:robots.txt 是活的。今天允许的路径,明天可能被加进 Disallow;Crawl-delay 可能从 1 秒改成 10 秒。硬编码规则或只检查一次就缓存,迟早出问题。



















