搜索抓取

robots.txt 与 noindex:蜘蛛在哪一步决定不抓、哪一步决定不收录

robots.txt 和 noindex 经常被当成同一件事,实际上一个拦在请求发出之前,一个要等页面被抓回来才生效。两者混用,容易出现写了 noindex 仍被收录、或者重要目录突然没有蜘蛛访问。本文拆开讲生效时机、常见误配,以及从 URL 发现到索引决策的完整链路。

搜索抓取

robots.txt 与 noindex:蜘蛛在哪一步决定不抓、哪一步决定不收录

日常运维里,“这个页面不想被搜到”经常被一句话带过,然后在 robots.txt 里加一行 Disallow,或者在页面里加一个 noindex,甚至两个一起上。两种做法看起来都能达到目的,但蜘蛛在这两种情况下走的路径完全不同,出问题的概率也不一样。

两个指令作用在不同的环节

可以把抓取过程粗略拆成两段:取回页面和决定是否把页面放进索引。robots.txt 管的是前一段,它告诉蜘蛛哪些路径不必来取;noindex 管的是后一段,页面已经被取回,蜘蛛读到了这个标记,于是不把它作为可展示的搜索结果。

所以严格说,robots.txt 挡的是“抓”,noindex 挡的是“收”。这两件事混在一起谈,就容易做出自相矛盾的配置。

生效时机:一个在请求之前,一个在请求之后

Disallow:请求还没发出就结束

蜘蛛开始工作前,通常会先取一次 robots.txt,按里面的规则判断队列中的 URL 能不能抓。被 Disallow 命中的 URL,请求一般不会发出,服务器日志里也就看不到这条记录。但要注意:URL 依然可能被“发现”——比如别的站链过来,或者你自己在别处提到它。蜘蛛知道这个地址存在,只是不去取。

noindex:页面已经取完才生效

noindex 写在 HTML 的 meta 标签里,或者放在 HTTP 响应头 X-Robots-Tag 里。蜘蛛必须先把页面抓下来,才读得到这条指令。如果是靠 JavaScript 渲染出来的 meta,还得等渲染这一步完成。

换句话说,noindex 页面会被抓取,只是不以正常结果出现在搜索里。它消耗的抓取资源是真实存在的,访问日志里也看得见。

一个常见的坑:既在 robots.txt 里 Disallow 这个路径,又在页面里写 noindex。蜘蛛被挡在外面,读不到 noindex,于是这个 URL 有可能只凭链接信息被收录成一条没有摘要的结果。

一条 URL 走完的决策链

  1. 蜘蛛从外链、内链、Sitemap 等入口发现 URL。
  2. 取 robots.txt,判断该路径是否允许抓取。
  3. 允许抓取则进入抓取队列,按权重和频率安排请求。
  4. 取回页面,读取状态码、响应头和 HTML 里的指令。
  5. 结合 noindex、canonical 等信号决定是否进入索引,以及以哪个 URL 为准。

任何一步出问题,最终结果都可能和预期不同。比如 robots.txt 读取失败返回 5xx,不同引擎的处理策略不完全一样,有的会暂时收紧抓取范围,直到能正常读取为止。

怎么选:先想清楚你要的是什么

  • 只是不想让蜘蛛把时间花在某些路径上(后台、站内搜索结果页、大量参数页面):用 robots.txt。
  • 希望页面能被读到,但不想出现在搜索结果里:用 noindex,并且不要用 robots.txt 挡住它。
  • 非 HTML 文件(PDF、图片、XML)写不了 meta:用 X-Robots-Tag 响应头。
  • 整站临时下线:返回 503 通常比一刀切 Disallow 更合适,恢复后也更容易被重新抓取。
  • 已上线页面要彻底移除:先 noindex 并等蜘蛛抓过一轮,再考虑 301 或 410,顺序反了容易留下长期不更新的快照。

日常检查清单

改动 robots.txt 之后,建议在日志里对照看几天:原本有抓取记录的路径是否消失,消失的是否正是你想挡的。如果某个重要目录突然没有蜘蛛访问,先检查是不是规则写宽了。

对于 noindex 页面,可以用抓取测试类工具确认蜘蛛看到的响应和你的源站一致——特别是那些依赖前端渲染的页面,源 HTML 里没有 meta,就别指望蜘蛛一定读得到。

Sitemap 里尽量不放被 robots.txt 屏蔽的 URL,这类清单对抓取没有帮助,还会让有限的抓取预算花在不该花的地方。