搜尋抓取

被 robots.txt 挡住的 URL,蜘蛛還會從哪里知道它存在

robots.txt 决定的是要不要去抓,而不是這個 URL 會不會被發現。本文拆開讲蜘蛛遇到被禁路径时的分叉方式、Allow 與 Disallow 的匹配邊界,以及运营侧该检查的内鏈、Sitemap 與日誌信号,帮助把 URL 發現和抓取權限分開管理。

搜尋抓取

被 robots.txt 挡住的 URL,蜘蛛還會從哪里知道它存在

不少站点在 robots.txt 里寫上一段 Disallow,就預設那部分内容從搜尋里消失了。實际情况要分開看:被禁的路径,蜘蛛通常不會去抓,但它仍然可能通過別的入口知道這些 URL 的存在。抓取和發現是两條线,混在一起判断,很容易做出错誤决策。

robots.txt 管的是抓取,不是發現

robots.txt 的規則作用于“是否去取這個 URL 的内容”。它不阻止外鏈提到這個地址,也不阻止 Sitemap 里寫下這個地址,更不阻止別人轉载你的頁面。只要 URL 被寫到了某個蜘蛛能讀到的地方,它就可能進入待抓取队列,只是在真正發起請求前被規則拦下。

所以會出現一種情况:日誌里某些被禁目錄没有抓取记錄,但搜尋结果里仍然能看到相關地址。這不是規則失效,而是發現和抓取發生在不同环节。

蜘蛛到達被禁路径时會怎么走

一個常见的路径是這样的:蜘蛛從入口頁進入,抓取一個允许訪問的列表頁,在 HTML 中找到若干連結。指向允许路径的連結會繼續排队抓取;指向被禁路径的連結,通常會被记錄為“已知但不可抓取”,本轮不再請求。

分叉点就在這里。如果列表頁本身也被 Disallow,蜘蛛可能根本到不了這個頁面,連結自然也不會被讀到。反過来,如果列表頁允许、詳情頁被禁,URL 仍然會被發現,只是内容取不到。

  • 允许頁指向被禁詳情頁:URL 被發現,内容不抓取。
  • 被禁列表頁指向允许詳情頁:路径在這一层断開,後面的 URL 基本没有入口。
  • Sitemap 中列出被禁 URL:蜘蛛讀到地址,但同样受規則约束。

Allow 與 Disallow 的寫法會改變邊界

規則匹配不是简單的“包含即命中”,通常按路径長度做最長匹配,Allow 可以覆盖 Disallow。常见坑有几個:

  • 目錄前缀誤伤:寫 Disallow: /shop 时,/shop-guide 這類同前缀路径也可能被一起挡住,需要更精确到 /shop/。
  • 通配符與结尾符:$ 用于精确结尾,* 用于匹配任意字符串,滥用會让規則變得难以预测。
  • 意图没寫清:先 Allow 整站再 Disallow 某目錄並不會改變顺序,但規則维護时容易互相矛盾。

运营侧可以對照检查的几件事

  • 被禁目錄里是否還有需要被抓的正常頁面。如果只是屏蔽篩選參數,尽量用參數級規則,而不是整目錄封禁。
  • Sitemap 里是否混入被禁 URL。這類地址會让蜘蛛反复讀到却取不到,消耗的是它的時間。
  • 内鏈是否指向被禁路径。導航、面包屑、相關推荐中的這類連結,會让抓取路径在同一處分叉後断掉。
  • 日誌里是否出現大量 403。因 robots 被拦通常表現為“未發出請求”,出現成片 403 更可能是 WAF 或權限配置的問题。

把 URL 發現和抓取權限分開管理

更稳妥的做法是:先用内鏈、Sitemap、提交接口保證重要 URL 被發現,再用 robots.txt 决定哪些允许被抓。两件事分開看,排查时就不會把“没被抓”和“没被發現”混為一谈。

robots.txt 只表達站点的抓取意愿,搜尋引擎是否采纳、是否收錄,由對方决定。調整規則後,建议用日誌观察一段時間再判断效果。