搜尋抓取

蜘蛛是先看到 HTML 還是先渲染:JS 連結在抓取路径里的位置

很多站長以為蜘蛛會和浏览器一样执行 JavaScript,再把頁面里的連結全部找出来。實际抓取通常先下载 HTML 並解析已有連結,渲染是後續步骤,且不一定覆盖所有頁面。本文梳理抓取與渲染的分工,以及 JS 連結、前端路由和動態加载對 URL 發現的影响,並给出让連結更早進入抓取队列的實用做法。

搜尋抓取

蜘蛛是先看到 HTML 還是先渲染:JS 連結在抓取路径里的位置

不少运营者會把“蜘蛛抓取”和“浏览器打開頁面”当成同一件事,認為只要用戶能看到連結,蜘蛛也能立刻看到。實际流程通常分成两步:先下载 HTML 文档,再决定是否执行 JavaScript 渲染。連結能不能進入發現队列,往往取决于第一步里有没有可解析的 href。

抓取阶段:蜘蛛先拿到的是 HTML

搜尋蜘蛛請求一個 URL 时,首先拿到的是服務器返回的 HTML 源碼。它會解析源碼里的 a 标簽 href、link 标簽、图片地址等,把新 URL 放進待抓取队列。這個阶段不依赖浏览器环境,也不會等待頁面上的异步請求全部完成。

如果連結只存在于 JS 變量、点击事件或前端路由里,抓取阶段就看不到它。蜘蛛可能仍然抓到了目前頁面,但不會顺着這些隐藏連結繼續走。

渲染阶段:不是每個頁面都會执行 JS

為了處理 JS 生成的内容,搜尋引擎會有渲染队列。但渲染资源有限,通常只對部分頁面、部分優先級較高的 URL 执行。渲染可能延迟數小时甚至更久,也可能因為頁面太复杂、接口超时、robots 限制而失敗。

  • 新站或低權重站点的頁面,進入渲染队列的等待時間可能更長。
  • 依赖第三方接口返回資料的頁面,渲染时接口不稳定,連結就可能漏掉。
  • 無限滚動、点击“加载更多”才出現的連結,通常不會在首次渲染中全部暴露。
把 URL 發現完全押在 JS 渲染上,等于把抓取路径交给一個不确定的後續步骤。

哪些寫法容易让連結迟到

常见情况包括:用 onclick 跳轉而不是 a 标簽;用 div 模拟按钮;前端路由只改 history 不生成可訪問地址;列表内容由接口返回後拼接到頁面;分頁只顯示“下一頁”按钮,没有静態連結。蜘蛛即使执行了 JS,也可能只看到首屏或前几條内容。

让 URL 更早進入發現队列

更稳妥的做法是让關键連結在 HTML 源碼里就存在。下面這些措施可以组合使用:

  1. 使用标准 a 标簽承载主要導航、列表和分頁連結,href 指向真實可訪問的 URL。
  2. 服務端渲染或预渲染首屏内容,让蜘蛛拿到 HTML 时就能看到連結和正文。
  3. Sitemap 补充那些确實需要 JS 才能到達、但你又希望被發現的 URL,並保持 URL 可訪問、狀態碼正常。
  4. 分頁静態化,至少让上一頁、下一頁和頁碼連結出現在 HTML 中。
  5. 前端路由提供可訪問地址,避免只靠点击事件切換视图。

怎么驗證連結是不是被看到了

可以看服務器日誌里蜘蛛對目标 URL 的請求记錄,也可以借助搜尋控制台里的抓取統計和 URL 检查工具,對比“已抓取 HTML”和“已渲染”的结果。如果某個頁面在 HTML 源碼里没有連結,而渲染又不稳定,它在日誌里長期不出現就不奇怪。

抓取和渲染的分工决定了:能被 HTML 解析的連結,發現路径最短;只能靠 JS 暴露的連結,發現路径更長也更不确定。先把主路径做扎實,再考虑動態加载带来的体驗優化,通常更符合蜘蛛的抓取习惯。