搜尋抓取

robots.txt 規則誤配:分组、通配符與抓取路径缺口排查

robots.txt 常被当成寫完就不再维護的静態文件,但分组繼承、通配符匹配和返回狀態碼的细节,都可能让部分 URL 長期失去被發現的机會。本文梳理常见誤配形態,並给出一套可复用的排查顺序,把“不来抓”的問题定位到具体規則。

搜尋抓取

robots.txt 規則誤配:分组、通配符與抓取路径缺口排查

站点出現“部分 URL 長期不来抓”时,很多人的第一反應是内鏈或 Sitemap 出了問题,却容易跳過抓取控制文件本身。robots.txt 是搜尋引擎進入站点前讀取的第一個文件,規則寫得含糊或寫偏,结果往往不是报错,而是安静地少抓一批頁面。

一、先確認文件本身能否被正常讀取

robots.txt 只對位于协议加主机根目錄下的那一個文件生效,放在子目錄里不會被识別。同时,解析器對返回狀態碼的理解並不相同,需要区分對待。

  • 返回 200 且 Content-Type 為纯文本最為稳妥;如果返回的是 200 的 HTML 頁面,部分解析器會判定規則無效,行為接近允许全部。
  • 返回 5xx 與返回 404 的含义相反:前者可能让抓取在一段時間内被暫停,後者通常被视為没有任何限制。
  • 文件開头的 BOM、全角字符、行尾多余空格或中文注释,都可能让首行解析失敗,進而影响整個分组的規則。

二、分组與繼承:規則到底套在谁身上

robots.txt 按 User-agent 分组,爬虫會優先選擇與自己名字最匹配的组,只有找不到更具体的匹配时,才使用星号组。多行 User-agent 寫在一起,表示這些爬虫共享後續規則。

常见誤配

  • 把同一意图的規則拆散到多個星号组,解析时只會采用其中一部分。
  • 只為網頁搜尋爬虫寫了分组,却忽略了图片、视频等资源爬虫的分组,導致资源仍被拦。
  • User-agent 值本身不区分大小寫,但寫成带後缀的名字會被视為另一個组,規則不會按预期生效。

三、通配符與匹配長度

星号匹配任意字符串,美元符号表示路径结尾。規則匹配时按路径長度最長優先,長度相同时允许指令優先,且路径比較区分大小寫。這几條组合起来,很容易出現超出预期的屏蔽范围。

  • 寫 Disallow: /*? 會屏蔽所有带參數的 URL,篩選頁、分頁參數頁會整体失去入口。
  • 寫 Disallow: /search 會连带影响 /search-help 這類同前缀目錄,而不只是搜尋頁。
  • 寫 Disallow: /*.pdf$ 只屏蔽以 pdf 结尾的地址,带參數的同類文件仍可能被抓取。
寫下通配符之前,先想清楚它覆盖的是“一類 URL”還是“一個前缀”。這两者的差集,通常就是缺口出現的位置。

四、別把渲染资源一起挡掉

CSS、JS 和图片被 robots.txt 屏蔽後,頁面本身仍可能被讀取,但渲染结果會不完整。對于依赖前端渲染的頁面,二次抓取时能看到的連結集合會明顯變少,URL 發現能力随之下降。检查是否誤屏蔽了 assets、static、js 這類资源目錄。

五、一套可复用的排查顺序

  1. 直接請求根目錄的 robots.txt,確認狀態碼、Content-Type,以及是否被重定向到登入頁或错誤頁。
  2. 按目标爬虫逐條讀分组,確認它是否落入了星号组的兜底規則。
  3. 從抓取日誌里挑出返回 200 但很少被訪問的 URL,用目前規則做一次人工匹配。
  4. 检查通配符與结尾符的覆盖范围,確認没有誤伤參數頁或资源目錄。
  5. 確認文件内的 Sitemap 声明完整,且指向的地址可以直接訪問。
  6. 修改後保留變更记錄,用抓取日誌观察回訪變化,同时排除缓存與 CDN 带来的干扰。

需要提醒的是,robots.txt 只是抓取建议,並不能保證收錄,也無法替代 noindex 和頁面本身的质量。它更合适的用途是收敛抓取范围,把有限的抓取预算留给真正需要被發現的 URL。