常见問题

蜘蛛池入口頁被 robots.txt 挡住:Disallow 誤伤、crawl-delay 與抓取超时的排查

入口頁做了不少准备,蜘蛛却始终没来,常见原因出在 robots.txt 這一层。本文梳理 Disallow 通配誤伤、Allow 優先級、crawl-delay 拖慢节奏、robots.txt 自身返回 5xx 或超时等几種情况,並给出按蜘蛛视角逐步核對的排查顺序。

常见問题

蜘蛛池入口頁被 robots.txt 挡住:Disallow 誤伤、crawl-delay 與抓取超时的排查

入口頁的連結排布、响應速度、連結深度都調好了,日誌里却始终看不到搜尋蜘蛛的請求 —— 這類情况下,問题往往不在頁面本身,而在抓取前的那一步:robots.txt。

robots.txt 是抓取前的第一道闸门

搜尋蜘蛛准备抓取某個 URL 之前,通常會先請求该主机下的 robots.txt。如果規則不允许抓取這個路径,頁面返回什么内容、放了多少連結,都不再重要,蜘蛛不會進入這一步。

robots.txt 管的是“能不能抓”,頁面上的 noindex 管的是“能不能收錄”。前者一旦挡死,後者根本没有生效的机會。

几種常见的誤配

宽泛的 Disallow 誤伤入口頁

  • Disallow: /:整站被挡,入口頁和目錄頁都進不来。有时是上线初期為了屏蔽測試环境,後来忘了删。
  • Disallow: /pool/:如果入口頁實际部署在 /pool/entry/ 這類子路径下,會被一並挡掉。
  • 用目錄名做前缀拦截:例如想挡住後台的 /admin,寫成 Disallow: /a,會连带影响所有以 /a 開头的路径。

通配符與结尾符寫错

* 在 robots.txt 中匹配任意字符,$ 表示路径结尾。寫成 /entry* 會同时匹配 /entry2、/entry-old、/entrytest;寫成 /entry$ 則只匹配正好以 /entry 結束的地址。規則寫得越具体,誤伤的半径越小。

忽略 Allow 與 Disallow 的優先級

多數實現里,当 Allow 與 Disallow 的規則長度相同时,Allow 優先。但如果先寫了一條很宽的 Disallow,再想放行某個子目錄,就需要顯式寫一條足够具体的 Allow,否則放行常常不生效。

crawl-delay 设得過大

這個字段並非所有搜尋引擎都支持,但支持它的爬虫會按延迟放慢抓取节奏。入口頁本身承担 URL 發現的职责,节奏被压得很低时,新連結被看到的周期會明顯拉長。如果站点抓取压力不大,没有必要設定過大的值。

robots.txt 本身返回異常

  • 返回 404:一般视為没有限制,允许抓取,属于正常情况。
  • 返回 5xx 或超时:多數爬虫會保守處理,短時間内减少甚至暫停對该主机的抓取,這類影响的面比單條規則更大。
  • 返回 200 但内容是 HTML 或空白頁:解析失敗,蜘蛛的實际行為不可预期。
  • HTTP 與 HTTPS 各有一份且内容不同:改規則时只改了其中一份,另一份仍在挡。

按蜘蛛视角逐步核對

  1. 用工具直接請求 robots.txt,確認狀態碼、内容類型和實际返回内容,观察 CDN 或 WAF 是否改寫了它。
  2. 確認蜘蛛訪問的是哪個域名與协议版本,與自己浏览器打開的是否一致。
  3. 把入口頁的完整 URL 與規則逐條比對,注意路径大小寫、结尾斜杠、查询參數。
  4. 查看服務器日誌中 robots.txt 的請求记錄,確認蜘蛛讀取正常,而不是偶尔 5xx。
  5. 修改後重新观察日誌,看入口頁的請求是否恢复,而不是只看一次结果就下结论。

頁面級設定的邊界

頁面里的 meta robots 與响應头里的 X-Robots-Tag 不會阻止抓取,它們影响的是收錄和連結传递。入口頁寫成 noindex 时,蜘蛛通常仍會讀取頁面上的連結;如果同时加了 nofollow,可用的發現路径就只剩 sitemap 與外部連結了。

几個實操建议

  • robots.txt 越短越好,只保留必须挡住的目錄。
  • 優先使用具体路径,少用通配符;必须放行时补一條明确的 Allow。
  • 改動前先备份,改動後至少观察几天日誌再判断效果。
  • 不要把後台路径、接口地址寫進 robots.txt,那等于把目錄结构公開一遍。

robots.txt 是一份很小的文件,但它决定了蜘蛛能否走到入口頁這一步。連結密度、抓取节奏、响應速度這些優化,都排在它之後。