搜尋抓取

狀態碼是蜘蛛的反馈信号:404、410、503 分別會带来什么影响

蜘蛛每次抓取都會拿到一個 HTTP 狀態碼,它不只看能不能取到内容,還會據此調整對该 URL、该目錄乃至整個站点的抓取节奏。本文梳理 404、410、403、5xx 等响應分別传递了什么信号,以及怎样從日誌里看清狀態碼分布、少走弯路。

搜尋抓取

狀態碼是蜘蛛的反馈信号:404、410、503 分別會带来什么影响

蜘蛛每次抓取一個 URL,服務器返回什么狀態碼,是它判断這個站点目前状况最直接的依據。它不只看“能不能拿到内容”,還會根據狀態碼調整對這個 URL、這個目錄甚至整個站点的抓取节奏。理解這一层,能解释不少“為什么蜘蛛最近来得少了”的現象。

200 與 304:正常路径

200 表示内容正常返回,304 表示内容没變、蜘蛛省下传輸成本。這两類响應不會给抓取带来负面信号。需要注意的是 200 頁面本身的体积和响應時間,那属于另一個话题,這里不展開。

404 與 410:一個“没找到”,一個“已刪除”

404 是“現在没找到”,410 是“已经明确刪除”。對蜘蛛来说,410 的信号更干脆,它會更早停止對這個 URL 的尝试,也不會再把它当作有效入口。404 則不同,如果同一個 URL 長期返回 404,蜘蛛會在一段時間内反复回来確認,這段反复本身就是抓取浪費。

更麻烦的是软 404:頁面返回 200,但正文是“该商品已下架”“找不到该頁面”。蜘蛛拿到 200,會按正常頁面處理,甚至可能把它当成有内容的頁面留在索引里。该用 404 或 410 的地方,不要用 200 兜底。

什么时候用 410 更合适

  • 内容确定永久刪除,不會再恢复
  • 批量下架、整個栏目撤掉
  • 你希望蜘蛛尽快停止訪問,而不是繼續回来確認

403 與 401:別把“拒绝”当成“刪除”

返回 403 或 401,並不等于告诉蜘蛛“這個頁面不存在”,它只說明這次訪問被拒绝,蜘蛛可能改天再来试试。如果因為防火墙規則、UA 拦截、地区限制導致蜘蛛拿到 403,長期看會表現為抓取量下滑,而你在頁面上看不出任何異常。

排查抓取問题时,先看蜘蛛拿到的狀態碼分布,再看頁面本身。很多“頁面没問题但抓取變少”的情况,原因其實在响應层。

5xx:服務器不稳定时蜘蛛會自己降速

500、502、503 属于服務端临时故障。蜘蛛遇到這類响應,通常會减少對本站的抓取频率,過一段時間再逐步恢复。這本身是一種保護机制,但恢复速度取决于故障持續了多久——短時間抖動影响有限,连續几天大面积 5xx,抓取量可能几周才回到原来的水平。

503 可以配合 Retry-After 响應头,明确告诉蜘蛛“多久之後再来”,比让它自己猜更省事。計划内维護、临时限流都可以用這個方式。要注意 Retry-After 的時間不要设得太短,否則蜘蛛回来後仍然撞在故障上,反而把降速期拉長。

怎么從日誌里看清狀態碼分布

  1. 按蜘蛛 UA 過滤出抓取日誌
  2. 按狀態碼分组統計請求數
  3. 把 404 和 5xx 的 URL 單獨列出来,看是否集中在某類模板或某個目錄
  4. 對照同一時間段的服務器监控,確認 5xx 是蜘蛛引起的還是全站性問题

如果 404 集中在參數頁、已下架商品這類可预期的位置,考虑用 robots.txt 或 noindex 收敛,而不是放任蜘蛛反复訪問。

几個容易踩的坑

  • 把 404 全部重定向到首頁:蜘蛛看到的是 200 加首頁内容,容易把大量無關 URL 当成首頁的重复版本
  • 出错时统一返回 200 的错誤頁:蜘蛛無法判断頁面是否有效
  • 長期 5xx 不做處理:抓取频率下降後,恢复需要時間
  • 用 403 屏蔽蜘蛛:這和主動告诉它“別来”不是一回事,效果並不稳定

狀態碼是站点和蜘蛛之間最基础的一层沟通。返回得准确,蜘蛛的判断就准确;返回得含糊,它只能靠反复试探来確認,而试探的成本最终會体現在抓取效率上。