搜索抓取

robots.txt 的边界:挡住的不只是抓取,还有 URL 的发现与检查

robots.txt 常被当成收录开关,但它只控制抓取。Disallow 的通配符写宽一点,可能顺手挡住整片栏目;和 noindex 同时使用,还会让 noindex 永远读不到。本文梳理 robots.txt 的实际边界:路径匹配的误伤、Crawl-delay 的局限、被屏蔽 URL 仍被内链指向带来的队列积压,以及上线前值得逐条核对的地方。

搜索抓取

robots.txt 的边界:挡住的不只是抓取,还有 URL 的发现与检查

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 的边界和站内链接的边界保持一致。

上线前值得逐条核对的地方

  1. robots.txt 是否放在域名根目录,并且直接返回 200,而不是被重定向到别处或者返回 404。
  2. Sitemap 声明是否写在文件里,地址与实际的 sitemap 位置是否一致。
  3. 规则是否按“更具体的路径排在前面”来组织,避免一条宽规则盖住后面的细规则。
  4. 是否清理了测试环境留下的临时规则,尤其是屏蔽全站这一类。
  5. 抓一份访问日志,对照当天蜘蛛实际抓到的 URL,看看有没有本该抓取的路径一条都没出现。
robots.txt 是一份抓取许可,既不是收录控制,也不是安全措施。它比较理想的状态是:表述清楚、范围收敛、和站内实际的内链结构对得上。