蜘蛛池的入口頁是批量存在的,失效往往也是批量發生的:目标頁下线、内容被删、模板改版、域名不再續費,都會让一批 URL 進入打不開的狀態。很多人只關心怎么把蜘蛛引進来,却很少關心這些頁面挂掉时返回了什么。而返回什么,往往决定了蜘蛛下一次還愿不愿意来。
几種狀態碼在蜘蛛眼里的差別
404:頁面不存在,但不是终点
404 表達的是這個地址現在没有内容。對搜尋引擎来说,它意味着這次抓取没有拿到東西,但地址本身並没有收到永久刪除的明确信号。结果是蜘蛛可能在一段時間里反复回来確認,尤其是那些之前抓取過、還有点重要性的入口頁。少量 404 無所谓,成百上千條同时出現,抓取资源就會被大量消耗在確認這些死鏈上。
410:明确告诉對方不用再来了
410 的语义比 404 更强,等于這個地址已被永久移除。搜尋引擎收到 410 後,通常會更果断地把 URL 從待抓队列里清掉,重复確認的次數比 404 少。對于确定不會再恢复的入口頁,410 是更省抓取预算的一種表達。不過要注意,返回 410 之後這段歷史基本就断了,如果後面還想恢复,等于從头再来。
软 404:頁面能打開,内容却是空的
服務器返回 200,但頁面只有一個空模板、一段暂無内容或者一段跳轉脚本,這是最容易出問题的一種。搜尋引擎需要額外判断才能识別出這是一個空頁面,判断成本高,而且不同爬虫的策略不一样,有的會当成正常頁面繼續抓,有的會降低對整站的整体印象。批量入口頁如果都用同一套空模板,特征會非常集中。
301/302:把訪問者送去別處
跳轉本身不是失效處理,而是轉移。入口頁不再需要、但目标頁仍然存在时,可以用 301 把訪問關系一起送過去;如果只是临时調整,用 302。要注意的是,跳轉目标必须真實相關,否則蜘蛛跟過去發現内容對不上,反而會把這批跳轉当成異常。用跳轉兜底时,尽量避免多級跳轉鏈。
按场景選,而不是一套規則用到底
入口頁只是暂时停用
如果只是暂时不推這個入口,内容還在、以後可能恢复,建议保留頁面並返回 200,或者做一個简短的說明頁。返回 404 或 410 之後再想恢复,之前积累的抓取记錄基本要重新建立。
目标頁已经彻底下线
入口頁存在的意义就是導向目标頁。目标頁没了,入口頁繼續返回 200,只會让蜘蛛一次次抓到空壳。這種情况下,如果整批入口頁都不再有價值,返回 410 是比較干净的做法;如果還有一部分内容可以保留,就把入口頁改成一個有實际内容的落地頁,而不是留一個跳空的跳轉。
整個域名准备弃用
停止解析、直接让域名不可訪問,是較差的選擇——蜘蛛拿到的是连接失敗,既学不到已刪除,也無法判断這套站点是否還活着,可能還會在較長時間里繼續尝试。更稳妥的顺序是:先让入口頁统一返回 410,等抓取记錄里這些 URL 的訪問明顯减少之後,再考虑停止解析或释放服務器。
几個常见的誤区
- 把 404 当成已经删干净:404 之後蜘蛛仍可能反复確認,數量一多消耗的是整站的抓取预算。
- 首頁返回 200、其他頁返回 404:狀態不一致會让蜘蛛难以判断站点狀態,通常不如整体统一處理。
- 用 JS 跳轉代替服務端狀態碼:JS 跳轉對蜘蛛来说仍是一次正常的頁面抓取,起不到告知失效的作用。
- 批量改成空白頁:空白頁返回 200,属于典型的软 404,特征集中且容易被识別。
- 改完就不看了:狀態碼改了之後,蜘蛛的行為要過一段時間才反映出来,不看日誌就不知道有没有生效。
一個可执行的處理顺序
- 先列出失效入口頁清單,区分暂时停用、彻底不用、目标頁仍在三類。
- 目标頁仍在的,優先用 301 指向最相關的替代頁面,並確認目标頁可訪問。
- 彻底不用的,统一返回 410,並確認返回的是真正的服務端狀態碼,而不是頁面里的文字說明。
- 暂时停用的,保留可訪問的頁面並给一点實际内容,不要只留空模板。
- 處理完成後观察一段時間的抓取日誌,看這些 URL 的訪問频次有没有下降,再决定下一步動作。
狀態碼是给蜘蛛看的語言,不是给用戶看的装饰。與其让一批空頁面繼續返回 200,不如用明确的狀態碼告诉對方這里已经結束了。