搜尋抓取

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,這類清單對抓取没有帮助,還會让有限的抓取预算花在不该花的地方。