入口頁跑一段時間後,總會出現一批打不開的 URL:改過路径的、被删掉的、域名到期没續的。這些失效連結如果放着不管,爬虫每次来訪都會撞上一堵墙,抓取次數被白白消耗,入口頁整体的抓取反馈也會變差。處理失效連結不算难,难的是選對狀態碼。
先分清三種狀態碼的区別
- 301(永久跳轉):舊地址的内容搬到了新地址,且新地址内容基本等價。适合改版、換目錄、合並頁面。
- 404(未找到):頁面暂时不存在,或者你暂时不确定要不要恢复。爬虫會在一段時間内反复回来確認。
- 410(已刪除):頁面确定不再存在,而且没有替代頁。這是一個“別再来了”的明确信号,爬虫確認後通常會更快放弃這個地址。
简單说:有等價新頁就 301,没有替代且确定不做了就 410,介于两者之間、可能恢复的就先用 404。
三種常见誤用
把死鏈全部 301 到首頁
這是最省事也最伤的做法。几十上百個不相關的舊地址全部指向首頁,會被理解成一批没有意义的跳轉,既不會给首頁带来什么,也让原本的失效信号變得混乱。批量跳轉只适合结构上确實等價的頁面。
返回 200 的“软 404”
頁面明顯已经没有内容,服務器却還返回 200,用戶和爬虫看到的是“這個頁面正常,只是内容很空”。這類頁面留在入口頁集合里,只會持續消耗抓取次數。判断方法很简單:看返回碼,不看頁面上寫了什么。
一邊 410,一邊繼續挂連結
一邊告诉爬虫頁面已刪除,一邊在入口頁里繼續挂着這個連結,两個信号會互相抵消。决定放弃某個地址,就把它從入口頁的連結列表里也一並撤掉。
狀態碼描述的是资源本身的狀態,入口頁的連結列表描述的是你希望爬虫去的地方。两者不一致时,爬虫的行為往往會跟着連結走,而不是跟着狀態碼走。
一個可执行的清理流程
- 定期掃描入口頁集合,把非 200 的地址單獨列出来。
- 逐個判断:有没有内容等價的新地址?有就 301,没有就 410,或者先用 404 观察一阵。
- 检查跳轉是否只有一跳。A→B→C 這種鏈式跳轉會削弱信号,尽量收敛成一跳。
- 把决定放弃的地址從入口頁連結里移除,別让它們繼續被訪問。
- 观察一段時間日誌,確認這些地址的訪問量在下降。
几個容易忽略的细节
- 跳轉目标要相關。301 到不相關的頁面,效果接近于什么都没做,甚至不如直接 410。
- 不要用失效頁当入口。入口頁的职责是承接抓取,返回 404 或 410 的地址不适合放在這一层。
- 批量生成的頁面要留记錄。没有清單,過几個月就分不清哪些地址是主動放弃的、哪些是意外挂掉的。
- 停用不等于刪除。如果只是暂时停止投放,保留 200 但撤掉互鏈也可以,不必急着改成 410。
失效連結處理是一件長期的小事,不會立刻带来什么變化,但能让入口頁集合保持干净。對整個蜘蛛池来说,干净意味着爬虫把有限的訪問次數花在真正需要被抓的地方。