常见問题

蜘蛛池入口頁的連結用 JavaScript 動態插入,搜尋蜘蛛會执行並發現目标 URL 吗

入口頁連結用 JS 動態插入,搜尋蜘蛛未必能在同一次抓取里發現目标 URL,關键要看它有没有進入渲染阶段。本文說明渲染抓取的两個阶段、哪些寫法容易被抽取、哪些容易漏掉,以及如何用日誌判断渲染是否真的發生。

常见問题

蜘蛛池入口頁的連結用 JavaScript 動態插入,搜尋蜘蛛會执行並發現目标 URL 吗

把連結交给 JavaScript 動態插入,是不少蜘蛛池入口頁的常见做法,原因是改起来方便、批量生成也快。但搜尋蜘蛛能不能因此發現目标 URL,答案不是简單的“能”或“不能”,而是要看它有没有走到渲染那一步

搜尋蜘蛛處理 JS 分两個阶段

多數主流搜尋蜘蛛對 JavaScript 的處理不是一次完成的,而是分成两步:

  • 原始抓取阶段:先取回服務器返回的 HTML。如果連結只寫在 script 标簽里,這一步只能看到脚本文本,看不到任何目标 URL。
  • 渲染阶段:把頁面放進渲染环境执行 JS,等 DOM 相對稳定後,再從渲染结果里抽取連結。

两個阶段之間往往有時間差,短的几分钟,長的几天。也就是说,入口頁被抓過一次,並不代表目标 URL 已经被發現。

哪些寫法更容易被發現

  • 原始 HTML 里就有静態 a 标簽:最稳,完全不依赖渲染。
  • JS 在渲染时把 a 标簽插入 DOM,且 href 是完整可解析的 URL:多數情况下渲染後能被抽取。
  • 只用數组存 URL、靠後續逻辑跳轉或只做字符串展示:一般不會被当成連結。
  • onclick 里寫 window.location:搜尋引擎通常不把它当作連結處理。
  • 連結要等点击、滚動、hover 才插入:抓取时不會触發,效果等于没有。
  • 相對路径拼错、base 标簽缺失:渲染後拿到的是坏 URL,等于白做。

現實中會影响發現的几個因素

  • 渲染配額:渲染比纯抓取昂贵得多,入口頁數量越多,排队時間越長。
  • 资源被挡:JS 文件被 robots.txt 屏蔽,或被 CDN、WAF 拦截,渲染根本拿不到。
  • 接口依赖:連結資料靠 fetch 或 XHR 获取,接口需要登入態或被拦,渲染就拿不到資料。
  • 脚本报错:前面一句报错,後面的插入逻辑全部不执行。
  • 渲染超时:DOM 還没稳定流程就結束,連結来不及出現。

想稳定一点,可以這样做

  1. 把關键連結寫成静態 a 标簽放在原始 HTML 里,JS 只用来做增强,而不是唯一来源。
  2. 確認 JS、CSS 资源本身可以被抓取,路径別落在 robots.txt 的 Disallow 規則里。
  3. 能用服務端渲染或预渲染的,就把連結直接寫進返回的 HTML。
  4. 入口頁數量與自身抓取能力匹配,別一次铺太多,導致渲染排队排到很後面。
  5. 用日誌驗證渲染是否真的發生,而不是凭感觉判断。

從日誌判断渲染有没有發生

  • 看有没有蜘蛛請求 JS、CSS 等资源。只抓了一個 HTML、完全没有资源請求,通常說明没進渲染。
  • 看渲染請求是否出現過。部分搜尋引擎的渲染請求會带不同的 UA 或标识,可以對比观察。
  • 看目标 URL 有没有抓取记錄。入口頁天天被抓、目标頁一直没動静,多半就是連結没被發現。
發現只是第一步。即使目标 URL 被正确抽取,後面還有抓取、解析、索引等多個环节,任何一個环节卡住都不會有结果,不要把它当成确定性的收錄手段。

两個常见誤区

  • 把 JS 連結和静態連結视為等價,實际上两者的發現概率和速度差距不小。
  • 以為入口頁铺得越多,渲染就越快,實际情况往往是排队更長。

如果你在跑蜘蛛池入口頁,又希望連結能被稳定發現,最省事的做法還是“静態為主、JS 為辅”:關键連結寫在原始 HTML 里,JS 负责交互和补充。至于能發現多少、多久發現,交给抓取日誌去回答,比靠猜测靠谱。