狀態碼本身就是調度信号
很多站点在排查抓取量變化时,先看内容质量、内鏈结构和 Sitemap,却忽略了服務器返回的狀態碼。對蜘蛛来说,狀態碼不是一句客套话,而是關于「現在能不能抓、以後還要不要来」的判断依據。同一台服務器,返回 200 和返回 503,會走向完全不同的抓取安排。
理解這些信号的前提是:蜘蛛的抓取资源有限,它會根據歷史响應情况决定對某個站点的訪問频率。狀態碼的语义越明确,它做判断就越干脆;语义越模糊,它越倾向于保守,也就是少来。
429:明确的限流信号
429 Too Many Requests 表示請求過多,是最容易被正确理解的拒绝方式。蜘蛛收到 429 後,通常會降低對目前主机的並發與频率,並在稍後重试。如果响應中带有 Retry-After 头,重试的时机更有依據。
适合使用 429 的场景:短時間的流量高峰、批量任務占用带宽、需要给資料库留出恢复時間。相比直接把請求挂到超时,主動返回 429 更清晰,也更容易在恢复後把抓取量带回来。
503:暂时不可用,但不要長期挂着
503 Service Unavailable 的语义是服務暂时不可用,常用于维護窗口、後端崩溃、依赖不可達。蜘蛛一般會把這個 URL 标记為稍後再试,短期内不會当作頁面消失。
需要注意的是「暂时」的时長。连續多天返回 503,蜘蛛會逐步降低抓取频率,恢复之後也需要一段時間才能回到原来的水平。如果维護計划很短,返回 503 加 Retry-After 是合理的;如果站点長期處于 503,本质上等于让蜘蛛慢慢忘记這里。
临时故障用 429 或 503,長期屏蔽用 403 或 401,頁面消失用 404 或 410。把這三類混着用,蜘蛛就难以判断你的真實意图。
403 與 401:容易被誤用的長期屏蔽
403 Forbidden 與 401 Unauthorized 表達的是「不允许訪問」。蜘蛛收到之後,通常不會反复尝试,而是降低對该站点的抓取意愿。問题在于,很多 403 並不是有意設定的:WAF 規則誤伤、地域限制、UA 黑名單、防盗鏈配置,都可能让正常抓取被拒。
如果你只是想在高峰期减缓压力,却返回了 403,蜘蛛很可能把它理解為長期拒绝,恢复後抓取量也不會立刻回来。類似地,把登入墙後的頁面直接返回 401,對公開内容部分也是一種誤伤。
404 與 410:URL 的正常退场
頁面确實下线时,404 和 410 都是合理選擇。两者都會让 URL 逐步离開抓取队列,410 的语义更确定,通常退场更快;404 可能被反复確認几次,但最终结果一致。
需要注意的是,不要让本该 404 的 URL 返回 200。批量下线的舊頁面、已合並的參數頁、废弃的分類頁,如果仍然返回 200,就會被当作有效頁面持續抓取,占用本可以留给新内容的预算。
软 404 與 200 的空頁面
软 404 指的是返回 200,但頁面内容為空、报错或提示「该内容不存在」。對蜘蛛来说,這仍然是一次成功的抓取,只是拿到的東西没有價值。它不會像真 404 那样把 URL 移出队列,反而可能因為内容變化而反复回訪。
常见的软 404 来源包括:空搜尋结果頁、無库存商品頁、被清空的标簽頁、模板渲染失敗但狀態碼仍為 200 的頁面。這類 URL 越多,抓取预算被無效消耗的比例就越高,新 URL 的發現速度也會受影响。
连接层的失敗:超时、重置與截断
有些請求根本没走到狀態碼這一步:连接超时、TCP 重置、TLS 握手失敗、响應被中途截断。這些情况在日誌里表現為抓取失敗,蜘蛛會尝试重试,但如果失敗持續出現,它會主動降低訪問频率,避免给服務器加压。
與狀態碼相比,连接层失敗的信号更模糊,排查也更麻烦。它可能来自防火墙、负载均衡、源站進程數不足,也可能来自某個邊缘节点的異常。只看狀態碼統計,很容易漏掉這部分。
把狀態碼当成运维指标
- 按主机統計各狀態碼的比例,尤其是 5xx 與 429 的日變化。
- 区分「人為設定的拒绝」與「故障導致的拒绝」,前者可控,後者需要尽快定位。
- 检查是否存在 200 但内容為空的 URL 集合,评估它們占用的抓取量。
- 维護窗口尽量使用 503 加 Retry-After,並控制在較短时長内。
- 發現抓取量下降时,先看狀態碼趋势,再去看内容和内鏈。
狀態碼的作用不是讨好蜘蛛,而是让服務器和抓取調度之間的沟通更准确。语义清晰,恢复就快;语义混乱,恢复往往比故障本身更慢。