搜索抓取

robots.txt 与抓取范围:放行、拦截和 URL 发现的边界怎么划

robots.txt 常被当成收录开关,其实它只决定蜘蛛能不能抓。本文梳理 Disallow 与 noindex 的分工、规则的最长匹配逻辑,以及它与 Sitemap、内链配合时容易出现的浪费,并给出一份可长期维护的写法与日志检查步骤。

搜索抓取

robots.txt 与抓取范围:放行、拦截和 URL 发现的边界怎么划

很多人把 robots.txt 当成“收录开关”,其实它只处理一件事:告诉蜘蛛哪些路径可以来抓。至于抓到的页面要不要进索引、以什么形式展示,是另一套机制的事。把这两件事混在一起,最容易出现的情况就是——某个目录已经 Disallow,外链还在,搜索结果里仍然可能以无摘要的形式出现,而你却以为早就处理干净了。

管的是抓取许可,不是收录结果

被 Disallow 的 URL 不会被抓取,页面里的 noindex 也就没机会被看到。所以如果一个页面你希望它不进索引、但又不想让它彻底消失,正确顺序通常是:先放行抓取,再加 noindex,等搜索引擎确认后再考虑收紧。反过来做的结果,往往是页面以各种意料之外的形式留在结果里。

三种常见的误用写法

  • 拦住 CSS 和 JS 资源。页面能抓到,但渲染判断失真,蜘蛛看到的是残缺版本,对内容理解和移动适配都不利。
  • 用 Disallow 处理筛选参数页。减少重复抓取确实有效,但如果这些 URL 同时也是通往详情页的路径,URL 发现会被一起掐断。更稳的做法是让筛选页可抓,用规范链接和 noindex 收口。
  • 顺手拦住分页。分页 URL 是内容发现通道,拦掉之后,深层老内容就只能靠 Sitemap 兜底,发现速度会明显变慢。

规则匹配:最长的那条说了算

以 Google 为例,同一份 robots.txt 里多条规则命中同一个 URL 时,会比较匹配部分的长度,最长的那条生效;长度相同时 Allow 优先。通配符 * 和结尾的 $ 是支持的,但不同蜘蛛对语法的支持程度并不完全一致,跨引擎使用的站点要留一点余量。

所以别指望在一条笼统的 Disallow: / 后面随手加一条 Allow 就能精确放行——要么把 Allow 写得足够具体(更长),要么干脆把目录结构本身理清楚,减少规则之间的重叠。

与 Sitemap、内链的配合

Sitemap 里塞一堆被 Disallow 的 URL 没有意义,蜘蛛拿到也不会去抓。同理,站内链接大量指向被拦路径,等于把抓取机会丢进黑洞。检查方法很直接:从服务器日志里挑出被抓最多的目录,再看这些目录在 robots.txt 里的状态,两边对不上的地方,就是需要处理的地方。

一份能长期维护的写法

  1. 先从日志看现状:哪些目录被抓得最多,哪些几乎没人来。
  2. 把 URL 分成三类——必须抓的(内容页、分页、必要资源)、可以不抓的(后台、站内搜索结果页、纯参数组合)、完全不想被索引的。
  3. 对第三类优先用 noindex(前提是能抓到),只有确实不想让蜘蛛浪费请求的路径才用 Disallow。
  4. 改完先验证:用站长工具里的 robots.txt 测试功能,逐个确认具体 URL 的判定结果符合预期。
  5. 上线后继续看日志,观察被拦目录的抓取量是否下降、重点目录是否上升。

文件本身要稳

robots.txt 必须放在根目录,返回 200 和纯文本。返回 404 通常被理解为没有限制,等于全部放行;返回 5xx 时蜘蛛会保守处理,短期内可能沿用上一次成功获取的版本,长时间不可用则可能降低抓取频率。所以别把它挂在会超时的动态接口上,也别让 200 状态码返回一个 HTML 页面。

robots.txt 是给守规矩的蜘蛛看的礼貌约定,不是安全边界。真正需要保护的目录,靠的是权限控制和访问控制,而不是一行 Disallow。

把 robots.txt 当成一张抓取资源的分配表来维护:哪些路径值得蜘蛛花时间,哪些不值得,写清楚,观察日志,定期复核。这比一次写完就忘,要有效得多。