搜尋抓取

robots.txt 挡住了抓取,但挡不住 URL 發現:容易踩坑的几個细节

robots.txt 常被当成收錄開關,但它约束的只是抓取行為,並不能阻止 URL 被連結發現。本文梳理 Disallow、Sitemap 声明、Crawl-delay 等常见寫法對 URL 發現的實际影响,以及 robots.txt 自身返回異常时蜘蛛會怎么處理,並给出更稳妥的配置思路。

搜尋抓取

robots.txt 挡住了抓取,但挡不住 URL 發現:容易踩坑的几個细节

在讨论搜尋蜘蛛时,robots.txt 经常被当成一個開關:寫上 Disallow,就觉得這個頁面從此從搜尋引擎里消失了。實际情况比這复杂——robots.txt 约束的是抓取行為,不是 URL 的發現。把這两件事分開看,很多“明明屏蔽了却還是有痕迹”的現象就有了解释。

發現、排队、抓取,是三件獨立的事

一個 URL 進入搜尋引擎的流程大致是:被發現(来自内鏈、外鏈、Sitemap、站点地图之外的推送渠道等)→ 進入待抓取队列 → 蜘蛛按計划發起請求 → 内容被解析 → 决定是否進入索引。robots.txt 只作用在第三步,也就是“這次請求能不能讀到内容”。

所以一個被 Disallow 的 URL,依然可能因為別處有連結而被發現、被放進队列。它不會被抓取,但如果外部連結的锚文本足够明确,搜尋引擎仍可能把它当成一個“已知但未抓取”的地址保留在结果里,表現出来就是只顯示 URL、没有摘要。

robots.txt 里几條常见寫法的影响

Disallow:阻止抓取,不阻止發現

Disallow 只是告诉蜘蛛“別請求這個路径”。它不刪除已经存在的记錄,也不切断別人指向它的連結。新 URL 照样可能通過站外連結、歷史 Sitemap、社交分享被纳入已知集合,只是抓取阶段被拦下。

Sitemap 声明:最容易被忽视的一行

在 robots.txt 末尾寫上 Sitemap 地址,相当于把 URL 發現的一個入口直接摆在蜘蛛面前,省掉一次“先找到、再驗證”的环节。它不保證任何頁面被抓取,但确實减少了發現成本。對多域名、多子目錄的站点,這條声明的價值更明顯。

Crawl-delay:並不是所有蜘蛛都認

主流搜尋引擎的蜘蛛對 Crawl-delay 的遵循程度並不一致,有的直接忽略,抓取节奏更多由其自身根據服務器响應速度動態調整。想控制抓取压力,比起寫死一個 delay 值,更有效的是先把响應時間稳住。

分组寫法要成對

只寫 Disallow 不寫 User-agent、或者把多個規則拆成互相矛盾的多個分组,容易让解析结果和预期不一致。最稳妥的寫法是每個 User-agent 分组下面只放该组自己的規則,不依赖解析器的“就近合並”行為。

当 robots.txt 自己拿不到时

如果 robots.txt 返回 5xx 或者請求超时,主流蜘蛛的保守做法是暫停對该站点的抓取,而不是当作“全部允许”随意抓。返回 404 則一般被视為没有規則,可以正常抓取。這一点在服務器不稳定、CDN 回源異常或者防火墙誤拦时特別容易踩坑:一次临时的 5xx,可能让整站抓取停摆一段時間,恢复後還要重新爬升。

還有一類情况是 robots.txt 被放在需要登入、需要脚本渲染或者被 WAF 挑战頁拦截的路径上,蜘蛛拿到的是挑战頁而不是規則文本,解析结果往往不可预期。

更稳妥的配置思路

  • 想彻底不索引,優先用 noindex 或 410/404,而不是只用 Disallow。Disallow 會让蜘蛛看不到頁面里的 noindex,两者叠加时常常互相抵消。
  • 不要整站一刀切 Disallow。那會连带切断内鏈路径,目錄里的其他頁面也可能因此更难被發現。
  • 把 Sitemap 地址寫進 robots.txt,减少一次發現环节,同时保證 Sitemap 文件本身可正常訪問。
  • 保持 robots.txt 静態可讀,不要依赖動態參數、登入態或前端渲染。
  • 改完規則後看抓取日誌,確認蜘蛛的請求量、狀態碼分布和路径覆盖符合预期,而不是改完就放着。

几個判断口径

  1. 某個 URL 要從索引中移除:優先 410/404 或 noindex,Disallow 排在後面。
  2. 某個目錄只是不想被频繁抓取:可以用 Disallow 或調低抓取压力,但要接受它仍可能被連結、被發現。
  3. 想控制抓取节奏:先從日誌里找到真實的請求峰值和响應時間,再决定措施,而不是只加一行 Crawl-delay。
robots.txt 是一份给蜘蛛的請求說明,不是贴在站点的封條。把“發現”和“抓取”分開對待,很多看起来矛盾的現象就能對上号。