搜尋抓取

robots.txt 不只是開關:几行規則怎样改變蜘蛛的抓取路径

robots.txt 常被当成抓取的總開關,實际它影响的是蜘蛛的路径與预算分配。本文梳理規則缓存带来的延迟、Disallow 與 noindex 的区別、通配符與结尾符的常见寫法問题、Sitemap 声明的注意事項,以及内鏈被挡、站点承压时的處理顺序。

搜尋抓取

robots.txt 不只是開關:几行規則怎样改變蜘蛛的抓取路径

很多站点把 robots.txt 当成一個允许或禁止抓取的總開關,寫完就不再维護。實际執行中,它更像一份寫给蜘蛛的路线說明:哪些目錄可以走,哪些路径不必来,Sitemap 放在哪里。規則寫得不嚴谨时,出問题的往往不是全站被屏蔽這種顯眼故障,而是連結路径被截断、抓取预算消耗在無用地址上。

蜘蛛什么时候讀它,讀到的是哪一版

蜘蛛通常在抓取某個 URL 之前讀取该主机下的 /robots.txt,並且會缓存這份文件。缓存時間没有统一承诺,可能几小时,也可能更久。這意味着两件事:一是刚改完規則不要指望立刻生效;二是如果中途關閉了全站抓取,恢复时可能要等缓存過期。

另一個常被忽略的点是子域與协议。不同子域各自有獨立的 robots.txt,http 與 https 在多數實現里也被视為不同主机。站点迁移协议後,如果只在舊地址更新規則,新地址上可能仍是一份過期的文件。

Disallow 挡住的是抓取,不是收錄

被 Disallow 的 URL 並不會自動從索引中消失。如果其他頁面還在大量連結它,蜘蛛無法抓取内容来判断,只能依據外鏈锚文本等信息處理,结果可能是頁面仍在索引里,但摘要来自別處。想要真正让頁面登出,更稳妥的做法是先允许抓取、让頁面返回 404 或 410,或者用 noindex,確認狀態變化後再考虑屏蔽。

把 noindex 和 Disallow 同时用在一個 URL 上,是一個常见的互相抵消组合:規則挡住了抓取,蜘蛛也就讀不到 noindex。

通配符、结尾符與規則重叠

主流蜘蛛對 * 和 $ 的支持基本一致,但细节仍有差別。几條實用经驗:

  • 用 $ 明确结尾,避免 /search 把 /search-help 一起挡住;
  • 通配符不要连用太多层,規則越長越难维護,也越容易誤伤;
  • 同一路径下,更具体的規則通常優先,但不要依赖直觉顺序,寫規則时就让每條互不重叠;
  • 不要指望用 Disallow 挡參數頁,參數组合無穷,規則往往挡不全,反而留下半開的口子。

Sitemap 声明放在這里,不等于被讀取

在 robots.txt 里寫 Sitemap 地址是方便的做法,但它只是告诉對方文件的位置。文件本身能否被顺利抓取,取决于文件大小、层級數量、返回狀態碼以及是否被規則誤挡。如果 Sitemap 所在目錄被 Disallow,等于声明了一個不让進的入口。定期用抓取工具或服務器日誌確認 Sitemap 文件的訪問狀態,比只看 robots.txt 的内容更有意义。

内鏈被挡住,路径就断了

当關键栏目頁、分頁或标簽頁被規則挡住时,蜘蛛走到這里就停下,後面的連結也就無從發現。這類問题在日誌里表現為:入口頁有大量訪問,深层頁面几乎没有蜘蛛记錄,而你在頁面上明明做了内鏈。排查时可以先看被挡路径下面的 URL,是否還有別的方式能到達。Sitemap 可以作為补充,但内鏈才是日常抓取的主要路径。

用 robots 做节流,效果有限

Crawl-delay 只有部分蜘蛛支持,而且粒度很粗。真正影响抓取节奏的,更多是服務器响應時間、頁面返回狀態和内容更新频率。如果站点压力大,優先做的是缓存、压缩和稳定的响應,而不是在 robots.txt 里加一行延迟——規則不被遵守时,压力依舊存在。

一條可用的排查顺序

  1. 訪問 /robots.txt,確認返回 200,内容與预期一致;
  2. 检查各子域、http 與 https 是否都有對應規則;
  3. 拿具体 URL 對照規則,確認是否存在誤挡;
  4. 查看 Sitemap 文件本身能否被抓取,狀態碼是否正常;
  5. 结合服務器日誌,看蜘蛛在被挡路径下是否完全没有請求。

robots.txt 本身不复杂,复杂的是它與 Sitemap、内鏈、狀態碼之間的配合。把它当成一份需要定期复核的配置,而不是一次性寫死的開關,抓取路径會顺很多。