搭蜘蛛池的时候,很多人盯着入口頁能不能被爬到、能不能返回 200,却很少回头看一件事:這個 200 到底有没有内容。蜘蛛拿着 200 進来,看到的是空白、模板残頁或者一句“正在加载”,它不會像人一样等待,也不會反馈,它只是安静地把這一頁從待抓队列里划掉。次數多了,整個池子在蜘蛛那邊的印象就變成“這片地址不值得再来”。
狀態碼只是第一步
HTTP 狀態碼是蜘蛛判断頁面是否存在的最粗一层信号。200 表示“有”,404 表示“没有”,301/302 表示“去別處”。但狀態碼只是声明,不是事實。服務器说 200,蜘蛛還是會看正文、看标题、看頁面主体有没有實质内容。声明與事實不符的时候,問题就出在软 404 上。
硬 404 與软 404
- 硬 404:服務器明确返回 404,蜘蛛一次就知道這頁不存在,會較快從索引里移除。
- 软 404:服務器返回 200,但頁面主体是空的、是错誤提示、是“内容已刪除”,或者整頁只有導航和頁脚。蜘蛛要反复抓几次才能確認這頁没價值,這段時間它一直在消耗抓取配額。
蜘蛛池里软 404 的常见来源
- 入口頁模板渲染失敗,資料库查不到對應记錄,程序没抛 404,直接吐了個空壳。
- 跳轉脚本没执行成功,蜘蛛看到的是一個 JS 空頁,正文靠前端填充。
- 采集或伪原创流程把内容過滤没了,剩下一堆标簽。
- 入口頁指向的目标站挂了,代理层返回一個自定义错誤頁,狀態碼仍是 200。
- 泛解析或者通配域名,任何不存在的子路径都能命中同一個空模板。
為什么它比 404 更麻烦
404 是诚實的,蜘蛛学得快。软 404 是含糊的,蜘蛛會把它当成“暂时没抓到内容”,過一阵再来。于是同一個没價值的地址被反复抓,挤掉的是其他真正有内容頁面的抓取机會。如果池子里大量入口頁都是這種狀態,日誌上會看到蜘蛛来得挺勤,但有效抓取很少,收錄自然也不會動。
自查與修复的顺序
- 先看日誌里的狀態碼分布,把 200 但响應体很小的地址筛出来。
- 關閉 JS,用纯文本方式請求這些地址,看返回的 HTML 里有没有正文。
- 確認是模板問题還是資料問题:模板問题改渲染逻辑,資料問题改查询與兜底。
- 确實不存在的地址,改成返回 404 或 410,不要再给 200。
- 暂时没内容但以後會有的,用 503 加 Retry-After,比 200 空頁更清楚。
几個容易忽略的细节
- 自定义错誤頁要在服務端設定正确的狀態碼,只在頁面里寫“頁面不存在”没用。
- 跳轉要尽量用 301/302,而不是 meta refresh 加 200。
- 分頁、篩選參數生成的空结果頁,也属于软 404,別让它們進 sitemap。
- 空頁不要長期留在池子的入口列表里,定期清理比事後补救省事。
判断标准很简單:把這一頁当成一個陌生用戶打開,如果他看不到任何有用的東西,那對蜘蛛来说也一样。
使用建议
蜘蛛池解决的是“让蜘蛛找到入口”的問题,不是“让蜘蛛觉得入口有價值”的問题。狀態碼這一類基础項没做對,後面叠再多入口、铺再多連結,效果都會被稀释。把池子里的入口頁過一遍,该返回 404 的返回 404,该有内容的保證有内容,比繼續加量更值得先做。