不少蜘蛛池入口頁為了省事,會在頁面加载完成後再用 JavaScript 把目标 URL 拼進 DOM,或者通過前端路由、组件模板輸出連結。這種做法搜尋蜘蛛會不會跟進,取决于搜尋引擎有没有對頁面做渲染,以及渲染排期和抓取配額。结论先放在前面:有可能被跟進,但不适合当成唯一入口。
搜尋蜘蛛處理一個頁面,通常分两步
第一步是抓取服務器返回的原始 HTML,從這份源碼里提取 a href 之類的連結;第二步是把頁面放進渲染队列,用無头浏览器执行 JavaScript,再從渲染後的 DOM 里找新出現的連結。主流搜尋引擎都具备渲染能力,但渲染是异步的,有延迟,也有配額。
所以同一個入口頁,静態寫死的連結可能在第一次抓取时就被發現,而 JS 生成的連結往往要等到渲染那一步,中間可能隔了几天。
什么样的 JS 連結比較容易被發現
- 連結最终以真實的 a href 寫進 DOM,而不是只绑定 click 事件
- 入口頁本身可抓取,没有被 robots.txt 拦截,也没有返回错誤狀態碼
- 渲染過程不依赖登入、驗證碼或大量用戶交互
- 頁面加载速度正常,控制台报错少,第三方脚本不抢资源
- 入口頁本身有一定抓取频次,能排上渲染队列
容易被漏掉的几種情况
- 纯 onclick 跳轉,元素上没有 href,渲染後也提取不到連結
- 連結藏在需要滚動很遠、点击展開或懒加载之後才出現的位置
- 連結資料来自前端二次請求的接口,而该接口對蜘蛛 UA 返回空内容
- 頁面 JS 依赖大量外部脚本,渲染超时或中途失敗
- 入口頁响應慢、频繁返回 5xx,渲染優先級被压低
渲染不是随抓随渲。優先級通常给的是内容扎實、抓取價值高的頁面。入口頁本身内容單薄、權重低时,等渲染可能要花掉比预期長得多的時間。
更稳妥的做法:關键連結放回初始 HTML
- 入口頁首屏就把指向目标 URL 的 a href 寫進服務端輸出的 HTML,這是最确定的路径
- 确實需要動態生成的,做服務端渲染或预渲染,让原始响應里就带連結
- 不要指望 noscript 标簽兜底,它只覆盖禁用 JS 的少數场景,不能替代真實連結
- 可以一部分連結静態輸出、一部分交给 JS,做對照观察两邊的抓取差异
如果一定要用 JS,注意這几点
- 控制渲染时机,避免把連結拖到用戶滚動到底部才插入
- 不要做無限滚動式的内容加载,入口頁的連結列表尽量有明确终点
- 前端調用的接口對搜尋蜘蛛返回與普通用戶一致的内容,不要按 UA 区別對待
- 單個入口頁輸出的連結總量适度,避免一次性灌入大量低质連結
- 頁面加一点可讀的静態說明文字,让入口頁看起来不是空壳
怎么驗證搜尋蜘蛛有没有跟進
- 看入口頁的訪問日誌里,是否出現對目标 URL 的抓取记錄
- 看目标 URL 所在服務器的日誌,注意 UA 與来源頁
- 用搜尋平台提供的 URL 检查或渲染截图功能,看渲染後 DOM 里到底有没有那條連結
- 對比静態連結入口頁和 JS 連結入口頁的抓取频次,连續观察一段時間再下判断
需要提醒的是,日誌只能證明蜘蛛来過,不能證明目标 URL 會被收錄。發現連結、抓取、收錄是三件事,別用抓取資料去推断收錄结果。
總结一下:JS 生成的連結並非完全没用,但它的發現鏈路更長、更依赖渲染队列。如果希望目标 URL 稳定地被發現,把關键連結寫進初始 HTML 是最省事的确定性方案,JS 生成更适合作為补充手段。