蜘蛛每次抓取一個 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 的時間不要设得太短,否則蜘蛛回来後仍然撞在故障上,反而把降速期拉長。
怎么從日誌里看清狀態碼分布
- 按蜘蛛 UA 過滤出抓取日誌
- 按狀態碼分组統計請求數
- 把 404 和 5xx 的 URL 單獨列出来,看是否集中在某類模板或某個目錄
- 對照同一時間段的服務器监控,確認 5xx 是蜘蛛引起的還是全站性問题
如果 404 集中在參數頁、已下架商品這類可预期的位置,考虑用 robots.txt 或 noindex 收敛,而不是放任蜘蛛反复訪問。
几個容易踩的坑
- 把 404 全部重定向到首頁:蜘蛛看到的是 200 加首頁内容,容易把大量無關 URL 当成首頁的重复版本
- 出错时统一返回 200 的错誤頁:蜘蛛無法判断頁面是否有效
- 長期 5xx 不做處理:抓取频率下降後,恢复需要時間
- 用 403 屏蔽蜘蛛:這和主動告诉它“別来”不是一回事,效果並不稳定
狀態碼是站点和蜘蛛之間最基础的一层沟通。返回得准确,蜘蛛的判断就准确;返回得含糊,它只能靠反复试探来確認,而试探的成本最终會体現在抓取效率上。