搜尋抓取

410、403、500:蜘蛛看到不同狀態碼之後會做什么

蜘蛛抓取时最先看的是狀態碼,它决定了要不要讀正文、要不要繼續回訪。本文梳理 304、404、410、403 以及 5xx 各自的含义,說明服務器错誤為什么會拖慢抓取节奏,以及怎样用日誌核對狀態碼分布,把抓取资源留给真正有内容的頁面。

搜尋抓取

410、403、500:蜘蛛看到不同狀態碼之後會做什么

蜘蛛拿到一個 URL 之後,第一件事並不是讀内容,而是看响應头里的狀態碼。狀態碼决定了它要不要讀正文、要不要繼續走這個目錄下的其他連結,以及隔多久再来一次。同一個頁面,返回 200 和返回 304,對抓取资源的消耗完全不是一回事。

304:让蜘蛛少搬一次内容

如果服務器支持條件請求,蜘蛛再次訪問时带上上次拿到的 Last-Modified 或 ETag,頁面没變就返回 304,正文不必再传一遍。對蜘蛛来说,這相当于收到一句“内容没變,不用重新處理”,带宽和抓取配額都省下来了。

  • Last-Modified 要给准,時間跳来跳去會让蜘蛛誤判頁面一直在更新
  • ETag 最好基于文件内容或版本号生成,避免每次請求都變化
  • CDN 回源和缓存策略如果不透传這些响應头,蜘蛛就享受不到 304

404 與 410:都是“没有”,但语气不同

404 表示暂时找不到,410 表示這個地址已经明确下线。蜘蛛對 410 的處理通常更干脆:確認之後會更快停止回訪,也不再把它当作待發現的 URL。如果頁面是永久刪除,用 410 比一直留着 404 更省抓取资源;如果只是临时調整,返回 404 甚至 503 更合适。

需要留意的是,頁面返回 200 但正文為空的软 404,會让蜘蛛反复回来確認,属于典型的抓取浪費。

403、401:蜘蛛被挡在门外之後

403 表示服務器拒绝了這個請求。蜘蛛一般不會因為一次 403 就放弃這個地址,但持續 403 會让它降低對這批 URL 的抓取频率。401 是要求身份驗證,爬虫通常没有帳號,同样進不去。這两種狀態碼如果是因為 WAF、防火墙或地域限制誤伤,需要在日誌里對照蜘蛛的 IP 和 UA 排查,而不是等頁面從结果里消失才發現。

5xx:不是“没有頁面”,是“服務器現在不行”

500、502、503 這類狀態對蜘蛛而言是临时故障信号。多數蜘蛛會把 URL 放回队列稍後重试,而不是立刻刪除。但如果 5xx 持續出現,蜘蛛會認為站点整体不稳定,主動放慢抓取速度,甚至减少並發,结果是本来能抓到的頁面也被推迟。

  • 维護时段用 503 配合 Retry-After 明确告知,比直接關站返回连接错誤更好
  • 全站 5xx 持續一两天,恢复後抓取速度往往需要一段時間才能回到原来水平
  • 個別接口 5xx 却挂着 200 的頁面,蜘蛛拿到的就是半成品,容易被当成低质量内容

用日誌核對狀態碼分布

光看代碼里寫了什么並不够,實际返回给蜘蛛的是什么才重要。建议按周抽取蜘蛛日誌,統計各狀態碼在總請求里的占比,重点看三個數:304 的比例够不够高、5xx 是否集中在某個时段或某台机器上、404 和 410 是否集中在舊 URL 上。

狀態碼是服務器给蜘蛛的暗号,寫错不會立刻有反馈,但會在抓取节奏、回訪频率和资源消耗上慢慢体現出来。

把這些狀態碼管好,並不保證頁面被收錄,但能让蜘蛛把有限的抓取次數用在真正有内容、有更新的地址上,這對日常站点运营来说是更可控的一步。