常见問题

蜘蛛池入口頁的連結由 JavaScript 動態生成,搜尋蜘蛛還會跟進目标URL吗

入口頁把目标 URL 用 JavaScript 動態寫入 DOM,是很常见的做法。搜尋蜘蛛一般有渲染能力,但渲染是异步的、有延迟也有配額限制。本文說明哪些 JS 連結容易被發現、哪些情况會被漏掉,並给出把關键連結放回初始 HTML 的實操建议與驗證方法。

常见問题

蜘蛛池入口頁的連結由 JavaScript 動態生成,搜尋蜘蛛還會跟進目标URL吗

不少蜘蛛池入口頁為了省事,會在頁面加载完成後再用 JavaScript 把目标 URL 拼進 DOM,或者通過前端路由、组件模板輸出連結。這種做法搜尋蜘蛛會不會跟進,取决于搜尋引擎有没有對頁面做渲染,以及渲染排期和抓取配額。结论先放在前面:有可能被跟進,但不适合当成唯一入口

搜尋蜘蛛處理一個頁面,通常分两步

第一步是抓取服務器返回的原始 HTML,從這份源碼里提取 a href 之類的連結;第二步是把頁面放進渲染队列,用無头浏览器执行 JavaScript,再從渲染後的 DOM 里找新出現的連結。主流搜尋引擎都具备渲染能力,但渲染是异步的,有延迟,也有配額。

所以同一個入口頁,静態寫死的連結可能在第一次抓取时就被發現,而 JS 生成的連結往往要等到渲染那一步,中間可能隔了几天。

什么样的 JS 連結比較容易被發現

  • 連結最终以真實的 a href 寫進 DOM,而不是只绑定 click 事件
  • 入口頁本身可抓取,没有被 robots.txt 拦截,也没有返回错誤狀態碼
  • 渲染過程不依赖登入、驗證碼或大量用戶交互
  • 頁面加载速度正常,控制台报错少,第三方脚本不抢资源
  • 入口頁本身有一定抓取频次,能排上渲染队列

容易被漏掉的几種情况

  • 纯 onclick 跳轉,元素上没有 href,渲染後也提取不到連結
  • 連結藏在需要滚動很遠、点击展開或懒加载之後才出現的位置
  • 連結資料来自前端二次請求的接口,而该接口對蜘蛛 UA 返回空内容
  • 頁面 JS 依赖大量外部脚本,渲染超时或中途失敗
  • 入口頁响應慢、频繁返回 5xx,渲染優先級被压低
渲染不是随抓随渲。優先級通常给的是内容扎實、抓取價值高的頁面。入口頁本身内容單薄、權重低时,等渲染可能要花掉比预期長得多的時間。

更稳妥的做法:關键連結放回初始 HTML

  1. 入口頁首屏就把指向目标 URL 的 a href 寫進服務端輸出的 HTML,這是最确定的路径
  2. 确實需要動態生成的,做服務端渲染或预渲染,让原始响應里就带連結
  3. 不要指望 noscript 标簽兜底,它只覆盖禁用 JS 的少數场景,不能替代真實連結
  4. 可以一部分連結静態輸出、一部分交给 JS,做對照观察两邊的抓取差异

如果一定要用 JS,注意這几点

  • 控制渲染时机,避免把連結拖到用戶滚動到底部才插入
  • 不要做無限滚動式的内容加载,入口頁的連結列表尽量有明确终点
  • 前端調用的接口對搜尋蜘蛛返回與普通用戶一致的内容,不要按 UA 区別對待
  • 單個入口頁輸出的連結總量适度,避免一次性灌入大量低质連結
  • 頁面加一点可讀的静態說明文字,让入口頁看起来不是空壳

怎么驗證搜尋蜘蛛有没有跟進

  1. 看入口頁的訪問日誌里,是否出現對目标 URL 的抓取记錄
  2. 看目标 URL 所在服務器的日誌,注意 UA 與来源頁
  3. 用搜尋平台提供的 URL 检查或渲染截图功能,看渲染後 DOM 里到底有没有那條連結
  4. 對比静態連結入口頁和 JS 連結入口頁的抓取频次,连續观察一段時間再下判断

需要提醒的是,日誌只能證明蜘蛛来過,不能證明目标 URL 會被收錄。發現連結、抓取、收錄是三件事,別用抓取資料去推断收錄结果。

總结一下:JS 生成的連結並非完全没用,但它的發現鏈路更長、更依赖渲染队列。如果希望目标 URL 稳定地被發現,把關键連結寫進初始 HTML 是最省事的确定性方案,JS 生成更适合作為补充手段。