robots.txt 通常只有几行,却决定了蜘蛛进门之后能看到什么。它最容易被误解的地方是:很多人把它当成“收录开关”,实际上它只是抓取许可的一部分,管的是蜘蛛能不能来取这个 URL,不管取回来之后是否被索引。
Disallow 挡抓取,不等于挡收录
一个 URL 被 Disallow,蜘蛛不会去抓它的内容,但如果站外有链接指向它,搜索引擎仍然可能把它放进索引,只是没有标题和摘要,用户点进去看到的是提示页或者被跳回首页。这种结果通常比直接放行更难控制。
更常见的错误是同时使用 Disallow 和 noindex。noindex 写在页面里,蜘蛛必须先抓到页面才能读到这条 meta 指令;一旦路径被 Disallow,蜘蛛进不来,noindex 就永远不生效。想让某个页面从索引里消失,比较稳妥的顺序是先放开抓取、让 noindex 被读到,等页面确实从结果里消失之后,再考虑是否屏蔽抓取。
路径匹配的误伤,往往出在几个字符上
- 前缀匹配:只写 Disallow: /search,会连 /search-engine-guide 这类正常页面一起挡住,需要写完整路径或补上结束符。
- 通配符过宽:用一条规则拦掉所有带参数的 URL,订单确认页、筛选页、分页参数会被一并挡住,其中有些恰恰是有内容价值的。
- 根目录全挡:测试环境遗留的 Disallow: / 被带到线上,蜘蛛一条都抓不到,站内其他优化做得再好也没有入口。
- 大小写与尾斜杠:路径匹配区分大小写,/About 和 /about 是两条不同的规则;站点上如果两种写法并存,规则也要跟着覆盖。
Crawl-delay 能做的事比想象中少
Crawl-delay 只有部分蜘蛛支持,主流搜索引擎的爬虫早已不把它当作主要节流手段。它更像一份建议,不是硬性限速。真正影响抓取节奏的是服务器返回的响应状态:持续返回 429、503 并给出 Retry-After 头,比在 robots.txt 里写一个固定延迟更有效,也更贴近实际的负载情况。把 Crawl-delay 当成服务器扛不住时的挡箭牌,往往既不及时也不精确。
被挡住的 URL 如果还被内链指着,就变成了积压
站内链接指向一个 Disallow 的路径时,蜘蛛会在别处看到这个 URL,标记为“已发现”,然后按规则不去抓取。这类 URL 会长期占着发现队列,也让抓取路径的判断变得模糊:蜘蛛知道有这么一个地址,却拿不到任何内容来判断它的价值。比较稳妥的做法是,把导航、列表、详情页里指向被屏蔽路径的链接一并处理掉,让 robots.txt 的边界和站内链接的边界保持一致。
上线前值得逐条核对的地方
- robots.txt 是否放在域名根目录,并且直接返回 200,而不是被重定向到别处或者返回 404。
- Sitemap 声明是否写在文件里,地址与实际的 sitemap 位置是否一致。
- 规则是否按“更具体的路径排在前面”来组织,避免一条宽规则盖住后面的细规则。
- 是否清理了测试环境留下的临时规则,尤其是屏蔽全站这一类。
- 抓一份访问日志,对照当天蜘蛛实际抓到的 URL,看看有没有本该抓取的路径一条都没出现。
robots.txt 是一份抓取许可,既不是收录控制,也不是安全措施。它比较理想的状态是:表述清楚、范围收敛、和站内实际的内链结构对得上。