狀態碼是蜘蛛判断 URL 存留的第一手信号
蜘蛛抓一個 URL,最先看的是响應狀態。它不了解你的业務,只能靠狀態碼、頁面内容和歷史记錄去推断這個地址還该不该留在队列里。所以狀態碼寫错,往往不只是“服務器报错”這種小事,而是直接影响 URL 的發現與去留。
200 與 3xx:正常路径
200 表示内容可取。需要注意的是,只有正文真正有内容时,200 才有意义。
3xx 是跳轉。一跳的 301 能把訪問者和發現信号顺着传到新地址,鏈條拉長了就會损耗。永久搬家用 301,临时活動用 302,別長期用 302 顶替 301。
404 與 410:刪除也要给個明确答案
两者都表示内容不在,但语义不同。
- 404:暂时找不到或狀態不确定,蜘蛛會保留观察,過段時間再来看看。
- 410:确定永久移除,通常比 404 更快让蜘蛛把地址從队列里清出去。
如果是批量下架的商品、過期活動頁,用 410 更干脆;如果不确定以後會不會恢复,404 更稳妥。
還要提醒一点:如果這個地址本身有外部連結、也有真實用戶訪問,直接给 404 不如先做 301 到相關頁面,把訪問者和信号接住。
软 404 是最容易踩的坑
頁面返回 200,正文却寫着“该商品已下架”“暂無相關内容”——這就是软 404。蜘蛛拿到 200,會当成正常頁面繼續抓、繼續占配額,甚至反复回来確認。判断方法很简單:在服務器日誌或抓取工具里看看,那些空结果頁是不是長期被反复抓取。如果是,把它們改成真正的 404 或 410。
503:临时停服的正确寫法
维護、压测、临时過载时用 503,表示“現在不行,稍後再来”。它比 500 友好,因為语义上明确是临时的。
- 配合 Retry-After 响應头,告诉蜘蛛多久之後再来。
- 不要長期挂着 503,拖得太久,蜘蛛可能開始降低訪問频率。
- 不要用 503 冒充 404 去藏地址,這样只會让蜘蛛反复重试。
5xx 持續出現會拖慢整站
500、502、504 這類错誤偶發問题不大。但如果某個目錄、某類模板经常 5xx,蜘蛛會判断這块区域不稳定,降低抓取频率,连带影响同一批 URL 的發現速度。
排查顺序一般是:先看是不是某個接口超时,再看資料库连接,最後看是否有模板在處理異常參數时崩溃。把出错集中在少數 URL 上,比让整站响應變慢要好。
狀態碼要前後一致
常见的不一致有几種:
- 同一個 URL,有时 301 到 A,有时 301 到 B。
- 移動端返回 404,PC 端返回 200。
- 带參數返回 200,不带參數返回 404,而两者其實是同一内容。
這些都會让蜘蛛反复试探,浪費抓取配額。處理原則是:一個 URL 只對應一種结果,跳轉目标固定,设备差异交给自适應或對應的标注方式處理。
狀態碼不是给用戶看的装饰,而是给机器看的结论。寫得越确定,蜘蛛做决定越快。
一份可执行的检查清單
- 導出近期日誌里的 4xx、5xx 地址,按目錄归類。
- 区分哪些是真正下线的(该 410),哪些是跳轉没做好(该 301)。
- 找出返回 200 但正文為空的頁面,逐個改成 404 或 410。
- 检查维護頁是否用了 503 並带 Retry-After。
- 检查同 URL 的狀態碼是否稳定,特別是移動端與 PC 端。
- 改完後观察一周,看這類地址的抓取频次是否下降。
狀態碼處理干净,URL 發現的队列才會干净。它不會直接带来排名,但能减少無效抓取,让蜘蛛把時間花在真正需要被看见的地址上。