不少运营者會把“蜘蛛抓取”和“浏览器打開頁面”当成同一件事,認為只要用戶能看到連結,蜘蛛也能立刻看到。實际流程通常分成两步:先下载 HTML 文档,再决定是否执行 JavaScript 渲染。連結能不能進入發現队列,往往取决于第一步里有没有可解析的 href。
抓取阶段:蜘蛛先拿到的是 HTML
搜尋蜘蛛請求一個 URL 时,首先拿到的是服務器返回的 HTML 源碼。它會解析源碼里的 a 标簽 href、link 标簽、图片地址等,把新 URL 放進待抓取队列。這個阶段不依赖浏览器环境,也不會等待頁面上的异步請求全部完成。
如果連結只存在于 JS 變量、点击事件或前端路由里,抓取阶段就看不到它。蜘蛛可能仍然抓到了目前頁面,但不會顺着這些隐藏連結繼續走。
渲染阶段:不是每個頁面都會执行 JS
為了處理 JS 生成的内容,搜尋引擎會有渲染队列。但渲染资源有限,通常只對部分頁面、部分優先級較高的 URL 执行。渲染可能延迟數小时甚至更久,也可能因為頁面太复杂、接口超时、robots 限制而失敗。
- 新站或低權重站点的頁面,進入渲染队列的等待時間可能更長。
- 依赖第三方接口返回資料的頁面,渲染时接口不稳定,連結就可能漏掉。
- 無限滚動、点击“加载更多”才出現的連結,通常不會在首次渲染中全部暴露。
把 URL 發現完全押在 JS 渲染上,等于把抓取路径交给一個不确定的後續步骤。
哪些寫法容易让連結迟到
常见情况包括:用 onclick 跳轉而不是 a 标簽;用 div 模拟按钮;前端路由只改 history 不生成可訪問地址;列表内容由接口返回後拼接到頁面;分頁只顯示“下一頁”按钮,没有静態連結。蜘蛛即使执行了 JS,也可能只看到首屏或前几條内容。
让 URL 更早進入發現队列
更稳妥的做法是让關键連結在 HTML 源碼里就存在。下面這些措施可以组合使用:
- 使用标准 a 标簽承载主要導航、列表和分頁連結,href 指向真實可訪問的 URL。
- 服務端渲染或预渲染首屏内容,让蜘蛛拿到 HTML 时就能看到連結和正文。
- Sitemap 补充那些确實需要 JS 才能到達、但你又希望被發現的 URL,並保持 URL 可訪問、狀態碼正常。
- 分頁静態化,至少让上一頁、下一頁和頁碼連結出現在 HTML 中。
- 前端路由提供可訪問地址,避免只靠点击事件切換视图。
怎么驗證連結是不是被看到了
可以看服務器日誌里蜘蛛對目标 URL 的請求记錄,也可以借助搜尋控制台里的抓取統計和 URL 检查工具,對比“已抓取 HTML”和“已渲染”的结果。如果某個頁面在 HTML 源碼里没有連結,而渲染又不稳定,它在日誌里長期不出現就不奇怪。
抓取和渲染的分工决定了:能被 HTML 解析的連結,發現路径最短;只能靠 JS 暴露的連結,發現路径更長也更不确定。先把主路径做扎實,再考虑動態加载带来的体驗優化,通常更符合蜘蛛的抓取习惯。