蜘蛛抓取一個 URL 时,最先拿到的不是頁面内容,而是服務器返回的狀態碼。狀態碼决定了這次抓取算不算成功、這個 URL 還要不要再来。問题在于,不少站点把 200 当成萬能返回——只要請求能被處理,一律给 200。结果是:明明没有有效内容的頁面,在蜘蛛眼里却是“正常頁面”,于是被反复抓取,占掉了抓取配額,真正有價值的 URL 反而排不上队。
蜘蛛怎么判断一個 URL 值不值得再来
大致會看三件事:返回的狀態碼是否正常、正文内容是否有效、内容與 URL 指向的主题是否一致。狀態碼正常但内容為空或高度重复,就落到了“软 404”的范围。與直接返回 404 不同,软 404 需要蜘蛛多抓几次才能確認,這個過程會額外消耗抓取资源。
常见的狀態碼誤用
- 空搜尋结果返回 200:站内搜尋没有结果,頁面只是“未找到”,却渲染出完整模板並返回 200,容易被当成低质頁面。
- 商品或内容下架後頁面仍在:正文清空但 URL 保留,狀態碼仍是 200,蜘蛛會持續回訪。
- 错誤頁返回 200:出错时展示“系統繁忙”“稍後再试”,狀態碼却给 200,蜘蛛會把它当正常内容處理。
- 临时维護统一返回 404:本该用 503 表示暂时不可用,结果给出 404,可能让正常 URL 被判定為已消失。
软 404 的几種典型形態
需要交互才出現的内容
頁面骨架先返回 200,正文要等点击、滚動或輸入之後才加载。蜘蛛拿到的是空壳,却仍按正常頁面记帳。
大量 URL 指向同一份空内容
參數组合、篩選條件能翻出很多地址,内容却几乎一致或干脆為空,這類 URL 容易一起被判定為無效。
自查:從日誌里把問题挑出来
- 按狀態碼分组統計蜘蛛訪問,看 200 的占比是否高得反常。
- 抽一批 200 的 URL,用不带 Cookie、不执行脚本的方式請求,確認正文是否有實质内容。
- 重点检查站内搜尋、篩選、分頁這三類模板,是否存在“無结果也返回 200”。
- 對照抓取频次:被反复抓取、却從来不带来訪問的 URL,往往是空壳。
處理思路
真正不存在的頁面,该给 404 就给 404;已经彻底下架、不會再恢复的,用 410 表達更明确。站内搜尋無结果、篩選结果為空這類情况,可以選擇返回 404,或至少在頁面上明确說明無结果,並减少内鏈指向。维護、限流造成的暂时不可用,用 503 並配合 Retry-After,比直接 404 更稳妥。已经被大量抓取的空壳 URL,可以先撤掉站内入口,让蜘蛛自然降低訪問频次。
noindex 與狀態碼別混用
noindex 解决的是“頁面有效但不想被收錄”,狀態碼解决的是“頁面是否還存在”。用 noindex 處理已经删掉的頁面,等于让蜘蛛繼續回訪一個没有價值的地址;反過来,给正常但不想收錄的頁面返回 404,只會制造更多無谓的抓取失敗。
狀態碼是蜘蛛判断頁面生死的首要信号,含糊的返回會让它一直猜。让有效頁面拿到 200,让無效頁面得到明确的否定,抓取次數才會花在该花的地方。
最後提醒一句:調整狀態碼属于影响面較大的改動,動手前先用小范围 URL 驗證,观察一到两周日誌變化,再决定是否扩大范围。