搜尋抓取

软 404 與空壳頁:蜘蛛拿到 200 之後看到的是什么

頁面返回 200,内容却是空的——這類软 404 常被忽略。本文說明蜘蛛如何對待空壳頁、它們常见的产生场景,以及從日誌與頁面特征识別後该怎么處理,避免白白消耗抓取预算。

搜尋抓取

软 404 與空壳頁:蜘蛛拿到 200 之後看到的是什么

狀態碼说的是“有”,内容说的是“空”

蜘蛛判断一個 URL 能不能抓,第一眼看的不是正文,而是响應狀態碼。返回 200,意味着服務器認為這個地址存在、可以正常訪問,蜘蛛會把它放進待抓取队列,並按常規方式下载、解析、提取連結。問题在于,很多頁面在狀態碼层面完全正常,打開之後却几乎没有内容:篩選條件组合出一個空结果、商品已经下架但模板還在、站内搜尋關鍵詞没人用過、分頁翻過了最後一頁。

這類頁面通常被称為软 404或空壳頁。它和硬 404 的区別是:硬 404 明确告诉蜘蛛“這里没有東西”,蜘蛛记下之後就不再频繁回訪;而软 404 让蜘蛛每次都以為有東西,抓回来一看是空的,下一次可能還會再来。

蜘蛛為什么會把空頁面当成正常頁面

抓取是一件按信号执行的机械工作。蜘蛛拿到 200、响應時間正常、頁面能解析出 HTML,就會走完整個流程:建立索引候選、提取出鏈、记錄内容指纹。至于内容是不是有獨立價值,属于後續的判定环节,而不是抓取环节的前置條件。

也就是说,空壳頁並不會在抓取阶段被自動拦下。它先消耗掉一次請求、一次下载、一次解析,之後才可能被内容层面的規則過滤掉。如果這類 URL 數量很多,每次刷新又都返回 200,那么它們在队列里會持續占據位置。

空壳頁常见的几個来源

  • 篩選與參數组合:多個篩選條件叠加後没有匹配结果,頁面仍然渲染出一套完整的框架和導航。
  • 站内搜尋结果頁:關鍵詞無结果、或结果极少时,頁面主体接近空白。
  • 已下架内容:商品、文章被移除,但詳情頁 URL 仍返回 200,只剩标题和推荐位。
  • 超出范围的分頁:列表只有 5 頁,第 6 頁及之後的地址没有做邊界處理。
  • 依赖脚本渲染:内容需要接口返回後由 JS 填充,接口異常或超时,蜘蛛拿到的是一個空壳。
  • 地区、語言變体:模板生成了一堆變体 URL,但只有少數真正有内容。

它比硬 404 多消耗什么

硬 404 是一次性的:蜘蛛抓到、確認、降低回訪频率,成本有限。软 404 的成本是持續的——同样的 URL 會在一段時間内被反复抓取,每一次都占用抓取预算。

更麻烦的是信号上的失真。站点向蜘蛛呈現的“有效頁面”數量里混進了大量無内容地址,抓取配額被分摊到這些地址上,真正需要更新的頁面反而排得更靠後。同时,頁面内容高度重复或近乎空白,也會让蜘蛛對這個目錄下 URL 的质量判断變得模糊。

判断标准可以简化成這样一句:如果這個 URL 明天返回 404,會不會有用戶或业務受影响?如果不會,它很可能就是空壳。

怎么從日誌和頁面上認出来

  • 日誌里狀態碼是 200,但字节數明顯偏小,和同目錄其他頁面差出一截。
  • 响應時間很短,往往說明没有走資料库查询或查询直接返回空。
  • 頁面标题是模板名或關鍵詞拼接,正文区域几乎是導航和頁脚。
  • 同一批 URL 在日誌中反复出現,抓取频次不低,却看不到内容更新。
  • 搜尋控制台或類似工具中會出現“软 404”“已抓取但未编入索引”類別的报告。

處理方式:先分层,再動手

  1. 確認頁面是否具备獨立價值。有真實内容、有搜尋需求的篩選组合,可以保留並补齐說明文字;纯模板拼接的,不必强留。
  2. 無價值的直接返回 404 或 410。410 表示永久移除,语义更明确,對已经下架的内容更合适。
  3. 有過渡價值的用跳轉。下架商品可以 301 到同類目或替代商品,無结果篩選可以 302 回上級分類頁,让用戶和蜘蛛都有落点。
  4. 需要保留但不希望被抓的用 noindex。注意 noindex 的頁面仍可能被抓取,只是不進索引,因此它並不能替代狀態碼處理。
  5. 修渲染鏈路。如果空壳是脚本没跑起来造成的,要检查接口稳定性、必要的降級渲染,而不是简單地把頁面删掉。

一個容易被忽略的平衡

把所有内容量偏少的頁面一律当作空壳處理,同样會出問题。有些頁面正文确實短,但承担着明确的入口作用;有些篩選组合虽然今天没有结果,明天可能就有了。判断的依據應当是“這個地址是否稳定地提供獨立信息”,而不是單纯的字符數。

更稳妥的做法是定期從日誌里筛出“200 且字节數偏低”的 URL 集合,按目錄归類,看它們是被同一套模板批量生成的,還是零散存在的。批量生成的通常是規則問题,改模板或加邊界判断就能收敛;零散的則要逐個確認内容狀態。抓取预算從来不是被一次错誤吃掉的,而是被成百上千個看似正常的空壳頁慢慢摊薄的。