這是做蜘蛛池和站点运营时被問得很多的一個問题:入口頁的連結列表不是寫死在 HTML 里的,而是頁面加载後用 JavaScript 拼出来、再插入 DOM 的。這種情况下,搜尋蜘蛛還能顺着這些連結發現目标 URL 吗?答案不是简單的“能”或“不能”,取决于連結最终出現在哪一层、渲染能力如何,以及連結本身是否可被提取。
先分清連結存在哪一层
搜尋蜘蛛拿到一個 URL,第一步是抓取服務器返回的原始 HTML。如果連結只存在于 JS 执行之後的结果里,那它就不在原始 HTML中。搜尋引擎是否愿意再执行一遍 JS、走渲染流程,取决于它的渲染策略和资源安排:原始 HTML 中的内容通常會被優先、更快地處理,渲染队列則可能延後,也可能因為资源紧張而跳過。
- 服務端直出:連結出現在原始 HTML 里,最容易被發現。
- 客戶端渲染:連結要等 JS 执行後才出現,能否被發現依赖渲染队列。
- 混合模式:首屏直出、後續懒加载,往往只有一部分連結在原始 HTML 中。
哪些寫法容易让連結“消失”
即便蜘蛛执行了 JS,下面這些寫法也常導致連結提取不到:
- 用 div、span 之類的元素加点击事件代替标准連結标簽,地址只寫在脚本變量里。
- 連結是相對路径,拼接时多一层或少一层斜杠,生成出無效地址。
- 連結要等用戶滚動、点击“加载更多”之後才插入頁面。
- 連結来自接口返回值,而接口需要登入態或特定請求头。
- 連結被放進 shadow DOM 或 canvas 绘制的区域里。
怎么自测
- 打開頁面“查看源代碼”,搜尋目标 URL 的路径片段,看它是否出現在原始 HTML 中。
- 在浏览器里禁用 JavaScript 再打開入口頁,對比還能看到多少條連結。
- 查看服務器日誌,確認目标 URL 上是否出現過蜘蛛的請求;没有請求,說明连發現這一步都没走通。
- 如果使用的是第三方抓取測試工具,注意它和真實蜘蛛的渲染行為並不完全一致,结果只能參考。
實操上可以怎么做
與其纠结蜘蛛會不會渲染,不如把不确定性降下来:
- 尽量让入口頁的關键連結以标准連結形式、静態可讀地出現在原始 HTML 中,服務端直出優先。
- 如果必须用 JS 渲染,至少保證首屏的連結直出,把渲染逻辑推迟到非關键部分。
- 控制入口頁的連結總數和嵌套层級,別让重要目标 URL 埋在很深的节点里。
- 不要把發現路径压在入口頁一個点上,sitemap 和主動提交可以並行使用,互相补位。
- 入口頁内容保持一定更新频率,方便观察蜘蛛的訪問是否稳定。
渲染只是“發現”环节的一环。被發現不等于會被抓取,被抓取也不等于會被收錄。入口頁方案應当作為提高發現概率的手段,而不是對结果的保證。