搜索抓取

robots.txt 放行与拦截:蜘蛛进站前读到的第一份指令

robots.txt 是蜘蛛进站前读到的第一份文件,它只决定能不能抓,不决定是否收录。本文梳理它的读取方式、Disallow 与 Allow 的写法、与 noindex 的区别、常见的误屏蔽场景,以及改版过渡和上线前的检查要点。

搜索抓取

robots.txt 放行与拦截:蜘蛛进站前读到的第一份指令

站点抓取出问题时,很多人的第一反应是查 Sitemap、查内链,却忽略了蜘蛛进站前读到的第一份文件:robots.txt。它不负责让页面被收录,只负责告诉蜘蛛哪些路径可以来、哪些不要来。这份文件写错,往往不只是少抓几页,而是整站的抓取入口被直接收窄。

蜘蛛是怎么读到 robots.txt 的

标准位置是域名根目录下的 robots.txt,蜘蛛在抓取某个 URL 之前,会先按协议去取这份文件。它本身也是一次 HTTP 请求,所以服务器状态会直接影响结果:

  • 返回 200 且内容正常:按文件里的规则执行。
  • 返回 404 或 410:视为没有限制,站内 URL 基本都可以抓。
  • 返回 5xx 或连接超时:不同引擎的处理不完全一致,但普遍会变得保守,可能减少甚至暂停抓取。

所以把 robots.txt 挂在会频繁报错的动态逻辑上是很危险的做法,它更适合作为一个几乎不变的静态文件存在。

Disallow 与 Allow 的基本写法

规则按 User-agent 分组,路径按前缀匹配。最容易出问题的地方是结尾的斜杠:写目录时带上斜杠,匹配范围才准确。

  • 写成 /search/ 表示屏蔽搜索结果目录;写成 /search 则可能连带屏蔽 /search-help 这类路径。
  • Allow 用来在整体屏蔽的目录里开口子,规则顺序上更具体的路径通常优先。
  • 通配符和结尾符号可以覆盖一批相似 URL,但用得越多,越容易误伤正常页面。

写完最好用抓取工具或日志验证一遍,光靠肉眼看规则很容易漏。

最容易踩的坑:Disallow 之后 noindex 也失效了

页面被 Disallow 之后,蜘蛛不会去抓它,也就读不到页面里的 noindex。如果你真正想要的只是不收录,而不是不抓取,那应该用 noindex。

这是两个常被混用的东西,作用完全不同:robots.txt 管的是抓取,noindex 管的是索引。希望页面保留抓取能力但不出现在结果里,就让它可抓,再在 HTML 中加上 noindex。反过来,如果某类页面确实没有抓取价值,比如带多个参数的站内筛选结果、后台路径,用 robots.txt 拦掉,反而能把抓取机会留给更重要的 URL。

通常不建议拦掉的东西

有些人为了节省抓取预算,把 CSS、JS、图片一起拦了。结果蜘蛛拿到的页面结构不完整,渲染出来和用户看到的有差距,判断页面内容时容易失真。以下几类建议保持可抓:

  • 页面渲染依赖的 CSS 与 JS 文件。
  • 正文图片以及懒加载所用到的资源。
  • 列表页与分页链接,除非确实不打算被收录。
  • 移动端对应的页面地址。

Crawl-delay 与抓取节奏

部分爬虫会参考 Crawl-delay,也有不少并不使用它。真正影响抓取节奏的,更多还是服务器的响应速度和稳定性:响应快、持续可用,蜘蛛自然愿意多来;时不时 500 或超时,它就会主动降频。与其指望用 Crawl-delay 精确控速,不如先把服务端稳定下来。

站点改版时的过渡处理

改版后旧目录不再存在,常见的错误是直接在 robots.txt 里把旧目录 Disallow 掉。这样蜘蛛既进不去旧页面,也就看不到页面上的 301,URL 的迁移信号传不过去。

更稳妥的顺序是:先让旧 URL 保持可抓,并在服务端配置好 301 指向新地址;等跳转被识别、流量迁移基本完成之后,再考虑用 robots.txt 收掉确实无需再抓的路径。

上线前的检查清单

  1. 确认域名根目录下的 robots.txt 能正常返回 200,且内容是当前版本。
  2. 检查是否误屏蔽了整站,例如把整个根目录都 Disallow 掉。
  3. 确认测试环境的 robots.txt 没有被带到线上。
  4. 确认需要抓取的目录没有被通配符意外匹配。
  5. 把 robots.txt 从动态逻辑中剥离,避免它跟着后端一起报错。

robots.txt 不需要写得很复杂,它更像一道门槛,而不是策略中心。该放行的放行,确实没有价值的路径拦掉,剩下的交给内链、Sitemap 和稳定的服务器去完成就好。