常见問题

入口頁的連結由 JavaScript 動態渲染,搜尋蜘蛛還能發現目标 URL 吗?

入口頁用 JavaScript 動態渲染連結,搜尋蜘蛛到底能不能顺着發現目标 URL?本文說明爬虫的抓取與渲染两個阶段、常见的渲染失敗场景,並给出用原始 HTML 對比、日誌排查、站点地图兜底的實操方法,帮助你把入口頁的發現路径做得更稳定。

常见問题

入口頁的連結由 JavaScript 動態渲染,搜尋蜘蛛還能發現目标 URL 吗?

入口頁用 JavaScript 拼出連結,是前端框架站点里很常见的做法。很多人關心的是:這些連結如果不执行 JS 就看不到,搜尋蜘蛛還會顺着它們發現目标 URL 吗?答案不是简單的“會”或“不會”,而是取决于渲染阶段能不能顺利完成。

先给结论

主流搜尋引擎的爬虫大多具备一定的 JS 渲染能力:先取回原始 HTML,再排入渲染队列,用類似無头浏览器的方式执行脚本後拿到最终 DOM,然後從渲染结果里提取連結。所以理论上,纯 JS 渲染的連結也有可能被發現。

但“有渲染能力”和“一定會渲染你的頁面”是两件事。渲染會消耗額外的抓取资源,爬虫會根據頁面重要性、渲染队列积压情况来决定優先級和是否重试。因此 JS 渲染出来的連結属于“可能被發現”,而不是“稳定被發現”。

哪些情况容易發現不到

  • 連結要等用戶点击、滚動或悬停之後才插入 DOM,初始狀態里根本不存在。
  • 脚本里寫了較長的定时器,或者依赖某個接口先返回資料,渲染窗口已经關閉。
  • 入口頁本身很重,JS 文件被阻塞、报错或加载超时,渲染完成後連結仍未出現。
  • 關键 JS、CSS 被 robots.txt 屏蔽,渲染器拿不到脚本,自然也渲染不出連結。
  • 連結依赖登入態、Cookie 或地域判断,爬虫訪問时走了另一條分支。
  • 入口頁在渲染队列里優先級靠後,長期没被渲染,于是目标 URL 一直停在“已發現未抓取”。

怎么判断自己属于哪種情况

  1. 看原始 HTML。用 curl 或關閉 JS 的环境請求入口頁,確認源碼里是否已经包含可直接点击的 a 标簽連結。如果源碼里没有,就完全依赖渲染阶段。
  2. 對比渲染後的 DOM。用浏览器開發者工具查看渲染完成後的 HTML,確認連結是否真的出現、href 是否是真實地址而不是 javascript:void(0) 這類占位寫法。
  3. 查服務器日誌。观察入口頁的抓取频率、返回狀態碼,以及有没有目标 URL 的請求记錄,区分是“没發現”還是“發現了没抓”。
  4. 用站点地图兜底。把重要的目标 URL 放進 sitemap,並保證入口頁有稳定的站内連結指向,减少對單一發現路径的依赖。

更稳妥的做法

  • 關键連結尽量由服務端輸出,或者在頁面首屏的静態 HTML 里就存在。
  • 無法完全服務端渲染时,至少把導航、列表、分頁這類“發現型”連結做静態化處理。
  • 避免用点击事件或滚動加载生成唯一入口,把必要連結放在初始 DOM 中。
  • noscript 标簽里的連結只能算补充,不要把它当成主要發現通道。
  • 頁面保持可訪問:狀態碼正常、响應不要過慢、不要拦截爬虫 UA。
需要提醒的是,以上做法只是提高被發現的概率,蜘蛛池或任何技術手段都不能保證收錄或排名,抓取和渲染的最终决定權仍在搜尋引擎。

如果你的入口頁依赖 JS 渲染,建议先用上面的步骤確認現状,再决定要不要把連結改為服務端輸出。發現路径越简單直接,後續的抓取和收錄過程就越容易观察和维護。