很多人在搭蜘蛛池时,把精力全放在“怎么让蜘蛛進来”,却很少检查“蜘蛛進来之後能走到哪里”。入口頁被爬到了,但如果頁面上的連結一半是死鏈,或者大量内容根本没有可点击的路径通往下一层,蜘蛛轉两圈就走了,入口頁也就成了一次性的消耗品。
死鏈在入口頁里的几種常见形態
死鏈不只是“点開是 404”這一種。實际运维中更常见的是下面几類,它們的共同点是都在浪費蜘蛛的時間:
- 硬死鏈:返回 404 或 410 的 URL 仍然挂在導航、列表或正文里。蜘蛛每次来訪都撞一次,来回几次之後,這個路径基本不會再被尝试。
- 软 404:頁面返回 200,但正文是“内容不存在”“已下线”之類的提示。蜘蛛拿到的是正常狀態碼,却得不到有效信息,判断成本比直接报错更高。
- 前端渲染失敗:連結由 JS 生成,脚本报错或接口超时,蜘蛛渲染後看到的是一片空白。它不执行点击,也就看不到任何出口。
- 超时連結:目标服務器响應极慢,蜘蛛等不到响應就放弃。在它眼里,這條連結和不存在没有区別。
孤岛頁面是怎么形成的
孤岛頁面指站内没有任何内部連結指向它,只能靠 sitemap 或外鏈被發現的頁面。在蜘蛛池场景里,孤岛通常是這么产生的:模板批量生成时變量拼接出错,連結指向了不存在的路径;分頁逻辑只放出前几頁,後面的頁面没有任何入口;入口頁為了“干净”把連結寫進 JS 点击事件里,而蜘蛛不执行点击;又或者多個入口頁之間的連結只出不進,形成單向的鏈尾。
孤岛頁面本身不一定有問题,但如果它承载着通往目标頁的路径,那么這條路径對蜘蛛来说就是断的。
對抓取的實际影响
影响主要体現在三個层面。
第一是抓取预算。蜘蛛每次訪問都有次數和時間的上限,撞死鏈、等超时、渲染空白頁,都會占用這份額度。真正有價值的 URL 反而排到了後面,甚至当天没被排上。
第二是連結權重與爬行路径的传递。内部連結是蜘蛛理解站点结构的主要依據。死鏈让路径中断,孤岛让路径消失,原本可以一层层传下去的訪問深度就停在了表层。
第三是蜘蛛對站点质量的判断。一個死鏈比例偏高、点击後大量空内容的结构,長期看會降低蜘蛛的訪問意愿,表現為回訪間隔拉長、單次抓取量下降。
排查思路
這類問题不用靠猜,按下面的顺序過一遍通常能定位得比較清楚:
- 看日誌中的狀態碼分布。統計入口頁域名下 404、410、5xx 的請求占比,如果 404 一直有稳定的量,說明有連結長期指向不存在的地址,而不是偶發誤差。
- 從入口頁出發爬一遍。用站内爬取工具或脚本,以入口頁為起点沿着連結走,记錄抓到的 URL 數量與深度。爬出来的數量明顯少于 sitemap 中的數量,就說明存在孤岛。
- 检查渲染後的 DOM。把 JS 执行後的頁面结构拉出来,看連結是否真的存在于 HTML 中。只存在于点击事件里的連結,蜘蛛看不到。
- 比對目标頁的可達性。確認從入口頁到目标頁是否存在完整的点击路径,而不只是 sitemap 里寫了這個 URL。
日常维護的几條建议
- 入口頁上的連結保持有效,失效的路径及时清理或改成 404,不要留在頁面上当装饰。
- 避免用软 404 掩盖問题,该返回错誤碼就返回错誤碼,蜘蛛更容易理解。
- 關键路径上的連結尽量寫在 HTML 里,不要只靠 JS 点击或表單提交。
- 分頁、列表這類會随資料變化的模块,定期检查邊界情况,防止最後一頁之後的所有頁面變成孤岛。
- 把死鏈检查纳入入口頁上线流程,而不是等日誌里堆出几千條 404 再回头處理。
蜘蛛池解决的是“被發現的概率”,不解决“被走完的路径”。入口頁上的每一個連結,都是蜘蛛下一步的落脚点,連結断了,前面的工作就只完成了一半。