抓取边界先于抓取效率
robots.txt 放在域名根目录,是蜘蛛在抓取前通常会读取的文件。它的作用是告诉蜘蛛哪些路径可以抓、哪些不要抓,并不直接控制 URL 是否出现在搜索结果里。被 Disallow 的 URL 仍可能因为外链、历史记录等原因出现在结果中,只是页面内容难以被抓取和理解。理解这一点,才不会把 robots.txt 当成去索引工具,也不会因为写了一条规则就认为问题已经解决。
路径匹配的几个细节
- Disallow: / 表示整站禁止抓取,包括首页,通常只适合还在搭建、不希望被访问的站点。
- 规则按路径前缀匹配,不是按目录匹配。Disallow: /news 会同时挡住 /newsletter、/news-detail 这类以 /news 开头的地址。
- 通配符 * 和结尾符号 $ 的支持度因蜘蛛而异,写得太复杂时,建议用测试工具验证实际匹配结果。
- Allow 用来在禁止目录里开例外,一般按最长匹配路径优先,但把 Allow 写在 Disallow 之后、路径又更短,例外就可能失效。
- 路径区分大小写,规则里的大小写与站点实际 URL 不一致时,等于没有生效。
- robots.txt 自身应返回 200、内容类型为 text/plain;如果返回 5xx,部分蜘蛛会暂时减少抓取,返回 403 与返回 404 的处理也不完全相同。
Sitemap 声明的位置与限制
在 robots.txt 中写一行 Sitemap: 地址,是常见的 Sitemap 声明方式。需要注意几点:Sitemap 行不受同文件里 Disallow 规则影响,声明的是地址,不代表其中的 URL 一定会被抓;跨域 Sitemap 通常需要在搜索平台侧验证;如果 Sitemap 中大量 URL 同时被 Disallow,提交行为与抓取行为就互相矛盾。更稳妥的做法是,robots.txt 里声明 Sitemap,同时在搜索平台的提交入口单独提交一份,两边保持一致。
抓取延迟与服务器承载
Crawl-delay 的支持度并不统一,实际抓取节奏更多取决于服务器响应时间、错误率以及入口数量。响应慢、5xx 多,蜘蛛自然会降低抓取频率,URL 发现也会跟着变慢。与其在 robots.txt 里设置抓取延迟,不如先看服务器响应时间和错误日志。确实需要限速时,可以考虑在 CDN 或 WAF 层对特定 UA 做限速,但不要把搜索蜘蛛整体拦截,否则入口会直接从抓取队列中消失。
核对清单
- 用浏览器直接访问 /robots.txt,确认状态码、内容类型和内容本身正常,没有被 CDN 或 WAF 替换成验证页。
- 用 curl 指定蜘蛛 UA 请求被允许与被禁止的 URL,比较返回内容。要记住规则只约束蜘蛛,不改变服务器响应,所以返回 200 不等于允许抓取。
- 在搜索平台的测试工具里输入具体 URL,确认它是被允许还是被挡,重点检查分页、排序参数页、接口路径。
- 在服务器日志中按蜘蛛 UA 筛选,统计各目录的抓取次数,观察被 Disallow 的目录是否仍有请求,判断是规则没生效还是其他爬虫在访问。
- 检查是否存在 Disallow 与 noindex 叠加使用的情况。两者同时出现时,noindex 可能永远没机会被看到。
- 改版或迁移时,先更新 robots.txt,再更新内链与 Sitemap,观察一到两周日志后再收紧规则。
容易踩的坑
- 用 robots.txt 屏蔽测试站,上线后忘记移除,导致正式内容长期不被抓取。
- 为了屏蔽排序参数页,把分页序列一起挡住,深页 URL 的发现入口随之减少。
- 把 Sitemap 放在被 Disallow 的目录下,又希望它稳定被抓取。
- 把 robots.txt 当作去索引手段,结果 URL 仍出现在结果中,只是没有可读摘要。
robots.txt 是抓取入口的第一道门。改动前保留旧规则,改动后在日志里核对一周以上。它只影响抓取行为,不能决定 URL 是否被收录,也不适合用来掩盖内容质量或服务器稳定性问题。