搜尋抓取

robots.txt 里的抓取邊界:Disallow 規則與 Sitemap 声明的核對

robots.txt 决定蜘蛛能進入哪些路径,也常被用来声明 Sitemap。規則寫得太宽會挡住需要被抓的 URL,寫得太松又可能放開測試目錄。本文梳理路径匹配的常见细节、Sitemap 声明的位置限制,以及用响應、日誌和測試工具核對抓取邊界的具体做法,减少入口被誤挡的情况。

搜尋抓取

robots.txt 里的抓取邊界:Disallow 規則與 Sitemap 声明的核對

抓取邊界先于抓取效率

robots.txt 放在域名根目錄,是蜘蛛在抓取前通常會讀取的文件。它的作用是告诉蜘蛛哪些路径可以抓、哪些不要抓,並不直接控制 URL 是否出現在搜尋结果里。被 Disallow 的 URL 仍可能因為外鏈、歷史记錄等原因出現在结果中,只是頁面内容难以被抓取和理解。理解這一点,才不會把 robots.txt 当成去索引工具,也不會因為寫了一條規則就認為問题已经解决。

路径匹配的几個细节

  • Disallow: / 表示整站禁止抓取,包括首頁,通常只适合還在搭建、不希望被訪問的站点。
  • 規則按路径前缀匹配,不是按目錄匹配。Disallow: /news 會同时挡住 /newsletter、/news-detail 這類以 /news 開头的地址。
  • 通配符 * 和结尾符号 $ 的支持度因蜘蛛而异,寫得太复杂时,建议用測試工具驗證實际匹配结果。
  • Allow 用来在禁止目錄里開例外,一般按最長匹配路径優先,但把 Allow 寫在 Disallow 之後、路径又更短,例外就可能失效。
  • 路径区分大小寫,規則里的大小寫與站点實际 URL 不一致时,等于没有生效。
  • robots.txt 自身應返回 200、内容類型為 text/plain;如果返回 5xx,部分蜘蛛會暂时减少抓取,返回 403 與返回 404 的處理也不完全相同。

Sitemap 声明的位置與限制

在 robots.txt 中寫一行 Sitemap: 地址,是常见的 Sitemap 声明方式。需要注意几点:Sitemap 行不受同文件里 Disallow 規則影响,声明的是地址,不代表其中的 URL 一定會被抓;跨域 Sitemap 通常需要在搜尋平台侧驗證;如果 Sitemap 中大量 URL 同时被 Disallow,提交行為與抓取行為就互相矛盾。更稳妥的做法是,robots.txt 里声明 Sitemap,同时在搜尋平台的提交入口單獨提交一份,两邊保持一致。

抓取延迟與服務器承载

Crawl-delay 的支持度並不统一,實际抓取节奏更多取决于服務器响應時間、错誤率以及入口數量。响應慢、5xx 多,蜘蛛自然會降低抓取频率,URL 發現也會跟着變慢。與其在 robots.txt 里設定抓取延迟,不如先看服務器响應時間和错誤日誌。确實需要限速时,可以考虑在 CDN 或 WAF 层對特定 UA 做限速,但不要把搜尋蜘蛛整体拦截,否則入口會直接從抓取队列中消失。

核對清單

  1. 用浏览器直接訪問 /robots.txt,確認狀態碼、内容類型和内容本身正常,没有被 CDN 或 WAF 替換成驗證頁。
  2. 用 curl 指定蜘蛛 UA 請求被允许與被禁止的 URL,比較返回内容。要记住規則只约束蜘蛛,不改變服務器响應,所以返回 200 不等于允许抓取。
  3. 在搜尋平台的測試工具里輸入具体 URL,確認它是被允许還是被挡,重点检查分頁、排序參數頁、接口路径。
  4. 在服務器日誌中按蜘蛛 UA 篩選,統計各目錄的抓取次數,观察被 Disallow 的目錄是否仍有請求,判断是規則没生效還是其他爬虫在訪問。
  5. 检查是否存在 Disallow 與 noindex 叠加使用的情况。两者同时出現时,noindex 可能永遠没机會被看到。
  6. 改版或迁移时,先更新 robots.txt,再更新内鏈與 Sitemap,观察一到两周日誌後再收紧規則。

容易踩的坑

  • 用 robots.txt 屏蔽測試站,上线後忘记移除,導致正式内容長期不被抓取。
  • 為了屏蔽排序參數頁,把分頁序列一起挡住,深頁 URL 的發現入口随之减少。
  • 把 Sitemap 放在被 Disallow 的目錄下,又希望它稳定被抓取。
  • 把 robots.txt 当作去索引手段,结果 URL 仍出現在结果中,只是没有可讀摘要。
robots.txt 是抓取入口的第一道门。改動前保留舊規則,改動後在日誌里核對一周以上。它只影响抓取行為,不能决定 URL 是否被收錄,也不适合用来掩盖内容质量或服務器稳定性問题。