蜘蛛抓取一個地址时,最先讀到的不是标题也不是正文,而是服務器返回的 HTTP 狀態碼。狀態碼决定了它接下来是讀取内容、換地址,還是直接放弃。很多站点的問题不在内容质量,而在狀態碼長期處于说不清的狀態。
一、几種常见狀態碼分別代表什么
- 200:正常返回。注意软 404——頁面内容已经是空壳,狀態碼却仍是 200,蜘蛛會反复来。
- 301 / 308:永久跳轉。适合站点改版、地址規范化。鏈式跳轉要尽量压平,一跳到位最好。
- 302 / 307:临时跳轉。別用临时跳轉做長期方案,容易让蜘蛛犹豫该记哪個地址。
- 304:内容未變化。合理使用可以省带宽,但前提是内容确實没變。
- 404 / 410:不存在。410 语义更明确,表示永久移除。
- 429:請求過多。用于表達你来得太快了。
- 500 / 502 / 503 / 504:服務端異常。偶尔出現是常態,持續出現就是事故。
二、自查清單:按狀態碼维度過一遍
- 拉取最近一段時間的訪問日誌,按狀態碼分组統計,看 5xx 的占比和集中出現的 URL 段。
- 检查這些 5xx 是否集中在某個栏目、某個模板或某個接口,往往是同一個代碼缺陷。
- 確認每個 5xx 是有意的限流,還是無意的崩溃,两者處理方式完全不同。
- 检查跳轉鏈:是否存在 A 到 B 再到 C 的多級跳轉,或者跳轉目标本身又返回错誤。
- 检查已下线的栏目是否返回 410 或 301,而不是一直挂着 200 空頁面。
- 记錄修复前後的對比資料,否則下次出了問题没有參照。
三、429 與 503:過载时怎么表達
站点流量高峰时,服務器扛不住,常见的错誤做法是直接超时或返回空頁面。更清晰的做法是返回 429 或 503,並在响應头里带上 Retry-After,告诉對方多久之後再来。
限流不等于拒抓。明确地慢一点,比含糊地连不上要好得多——前者是沟通,後者是失联。
需要注意的是,限流策略不要只针對蜘蛛,也不要對同一類請求给出随机结果。規則越稳定,抓取节奏越可预期。
四、几個容易被忽略的细节
- CDN 或反向代理层返回的错誤頁,可能覆盖源站的真實狀態碼,自查时要穿透缓存看源站。
- 维護公告頁不要用 200 長期占位,短暂的维護可以用 503 加 Retry-After。
- 接口類地址如果被大量請求,考虑在 robots.txt 或權限层面處理,而不是靠返回 500 硬挡。
- 监控告警要盯 5xx 的持續时長而不只是次數,瞬时抖動和長期故障是两回事。
五、把狀態碼纳入日常运维
建议在监控里固定几個指标:5xx 比例、429 次數、平均响應時間、错誤 URL 的分布。每周花十分钟看一眼趋势,比出事之後逐個排查要轻松得多。
狀態碼是服務器和蜘蛛之間最基础的對话。把這场對话说清楚,抓取才會有秩序;说含糊了,再多的内容更新也只是堆在门口。定期自查、记錄變化、修复後复看,這三步做扎實,比任何技巧都管用。