入口頁的狀態碼看起来只是服務器层的细节,但它直接影响蜘蛛下一次還愿不愿意来。同一批入口頁里,如果错誤碼给得随意,蜘蛛會把“暂时讀不到”理解成“這里没有東西”,把“永久下线”理解成“過段時間再来看看”,结果就是抓取预算被反复浪費在同一個地址上。
狀態碼在蜘蛛眼里意味着什么
蜘蛛不讀你的心情,只讀响應头里的三位數。它决定要不要保留這個 URL、要不要降低抓取频率、要不要稍後重试,基本都靠這個數字。所以入口頁的狀態碼要尽量表里如一:頁面是什么狀態,就给什么碼。
200 與 304:常態與未變
内容正常就返回 200。已经抓過的地址,如果 HTML 没有變化,用 Last-Modified 或 ETag 让蜘蛛收到 304,能省下带宽,也省下蜘蛛的解析時間。入口頁數量大的时候,這一項對整体效率的影响比想象中明顯。
404 與 410:不在,和确定不在
404 表示暂时找不到,410 表示已经永久移除。410 的信号更明确,蜘蛛通常會更快地把這個地址從待抓队列里划掉。但前提是真的不再用了——如果過几天又把同一個地址放出来,反而會让蜘蛛困惑。拿不准就先给 404。
301 與 302:換地址的两種情况
入口頁換域名或換路径,用 301 把抓取顺势带過去;只是临时切換,用 302。跳轉鏈要短,最好一跳到位,连續多跳几次,蜘蛛走到一半就可能放弃。
429、503 與 5xx:別用错誤碼掩盖問题
服務器扛不住时返回 503 是合理的,但不要長期挂着 503 当作停机保護。5xx 属于服務器侧的問题,蜘蛛會降低抓取频率並稍後重试;長期 5xx 會让一批入口頁被冷處理。429 更适合“抓太快了,慢一点”的场景,而不是把所有異常都丢成這一個碼。
软 404 與“友好错誤頁”
最容易被忽略的是软 404:頁面内容已经寫明“该内容不存在”,狀態碼却依然返回 200。蜘蛛無法区分這是空壳還是正常頁,只會反复来抓。同样,“友好的错誤頁”如果返回 200 並带一堆導航和推荐連結,等于在批量制造低质量入口頁。
實操上的几條建议
- 批量检查响應头:定期用脚本拉一遍入口頁的头部信息,把狀態碼異常的單獨挑出来,別只看頁面能不能打開。
- 区分暂时與永久:临时维護给 503,別顺手给 404;真不做了就给 410,別一直挂 404。
- 错誤頁要短:自定义错誤頁不要塞满内鏈和推荐位,蜘蛛會把它当成正常頁面繼續往里爬。
- 日誌對照着看:狀態碼分布和訪問日誌一起讀,才能判断蜘蛛是没来,還是来了吃了閉门羹。
- 策略保持稳定:同一批入口頁的狀態碼規則別频繁切換,蜘蛛需要的是稳定信号。
狀態碼是给蜘蛛看的最直接的一句话,说清楚比说好听重要。
最後提醒一点:狀態碼本身不解决内容問题。入口頁能不能被持續抓取,归根到底還是看頁面有没有值得抓的東西。狀態碼的作用,只是让這個過程少一些誤會。