把目标連結交给 JavaScript 動態拼進頁面,是蜘蛛池入口頁里很常见的做法。但從搜尋蜘蛛的角度看,這些連結能不能被發現,取决于它有没有對這個頁面做渲染,而渲染並不是必然發生的。
搜尋蜘蛛處理頁面大致分两步
主流搜尋引擎通常先抓一次原始 HTML,從這份 HTML 里提取正文、連結和资源清單;之後再决定是否把頁面送進渲染队列,用無头浏览器跑一遍脚本,重新提取一次。两次提取不是同步進行的,第一次拿不到的東西,只能等第二次。
這就带来两個事實:原始 HTML 里没有連結,那一次就等于没有發現入口;而渲染队列有取舍、有排队、有滞後,對大量入口頁来说,渲染覆盖率通常明顯低于首次抓取覆盖率。
几種常见寫法的實际表現
相對可控的寫法
- 連結本身以 a 标簽寫在 HTML 里,JS 只负责統計、样式之類的增强。
- 服務端渲染,首屏返回的 HTML 就带完整連結列表。
- 用了前端框架但做了预渲染,返回的 HTML 與渲染後基本一致。
風險較高的寫法
- 等頁面的脚本加载完成後才把連結插入 DOM。
- 需要滚動到底、点击"加载更多"或展開折叠面板才出現連結。
- 連結地址由接口异步返回,拿到資料後再拼進頁面。
- 整站客戶端渲染,首屏 HTML 里只有一個空容器。
這些寫法在浏览器里体驗都正常,但搜尋蜘蛛第一次拿到的 HTML 往往什么連結都没有。
先自测,再改结构
- 用"查看網頁源代碼"或命令行抓取看原始 HTML,不要用開發者工具里的元素面板,那里顯示的是渲染後的结果。
- 關閉浏览器 JavaScript 後打開入口頁,看看目标連結還在不在。
- 用站長工具里的抓取測試,分別查看原始 HTML 和渲染结果,對比連結數量差异。
- 過几天再翻服務器日誌,確認目标 URL 有没有出現抓取记錄,而不是只看有没有收錄。
让 URL 發現更稳的調整方向
- 把最重要的入口連結放回静態 HTML,哪怕只保留一部分。
- 给异步列表配一套静態分頁地址,让搜尋蜘蛛有路可走。
- sitemap 可以作為补充通道,但不要当成唯一發現来源。
- 减少入口頁對第三方脚本和外部接口的依赖,资源加载失敗时,渲染出来的連結也會一起消失。
JS 輸出連結不是不能用,而是不要把它当成唯一通道。URL 發現這件事,静態可讀通常比依赖渲染更可靠。
几個容易踩的誤区
- "我在浏览器里能看到連結,搜尋蜘蛛應该也能看到"——两者拿到的 HTML 常常不是同一份。
- "提交了 sitemap 就不用管 HTML 里的連結"——sitemap 有助于發現,但不等于會被抓取。
- "渲染早晚會發生"——渲染队列存在滞後,也可能跳過,不能当作兜底方案。
回到入口頁本身的设計:能让搜尋蜘蛛用尽量少的资源發現目标 URL,就是合格的入口頁。脚本可以提升訪客体驗,但把整條發現鏈路压在渲染上,等于把不确定性留给了自己。