搜尋抓取

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 当成一張抓取资源的分配表来维護:哪些路径值得蜘蛛花時間,哪些不值得,寫清楚,观察日誌,定期复核。這比一次寫完就忘,要有效得多。