不少蜘蛛池入口頁為了省事,把正文、連結甚至跳轉都交给 JavaScript 去生成。站点在浏览器里看着没問题,但蜘蛛拿到的可能只是一段空壳 HTML。這篇文章讨论入口頁用 JS 渲染时實际會發生什么,以及怎么取舍。
蜘蛛拿到的第一份 HTML 才是關键
搜尋引擎的抓取一般分两步:先按 URL 請求一次,拿到服務器返回的原始响應;如果頁面需要渲染,才排進渲染队列,用類似無头浏览器的方式再跑一遍 JavaScript。問题在于第二步不是必然發生,而且通常有延迟和配額限制。
- 渲染队列有积压,新域名、低權重 URL 可能等很久,甚至等不到。
- 渲染會消耗額外资源,搜尋引擎會控制每個站点的渲染次數。
- 如果初始 HTML 里既没有正文也没有連結,蜘蛛這一轮能“發現”的東西基本為零。
所以入口頁的核心目标——被發現、被繼續抓取——最好在第一份 HTML 里就完成。
入口頁常见的三種渲染方式
服務端渲染或静態輸出
内容在服務器端拼好再返回,蜘蛛拿到什么,用戶大致也看到什么。入口頁的連結、标题、可讀文本都在這份 HTML 里,是最省事也最稳的做法,纯静態頁面尤其如此。
客戶端渲染
返回的 HTML 几乎是空模板,内容靠接口回来後插入 DOM。對用戶没問题,對蜘蛛要看渲染服務的脸色。入口頁如果只有一條 JS 跳轉,比如 location.href 或框架路由,風險更明顯:蜘蛛可能既不讀内容,也讀不到跳轉目标。
混合渲染
首屏關键部分服務端輸出,其余交互由 JS 增强。這是折中方案,入口頁建议至少把連結和短文本放進初始 HTML。
判断标准很简單:把浏览器 JavaScript 關掉刷新一次,頁面上還剩多少能讀的文本和能点的連結?剩得越少,入口頁的價值越依赖渲染服務,可控性就越低。
几個容易踩的誤区
- 把蜘蛛等同浏览器。蜘蛛的渲染能力、版本、执行時間都和你的浏览器不同,本地測試通過不代表抓取时也能跑通。
- 用 JS 跳轉代替 HTTP 跳轉。能用 301/302 表達的跳轉交给 JS 去做,等于把结果交给不确定的渲染环节。
- 内容藏在接口里。接口地址如果没在 HTML 里出現,蜘蛛没有理由去請求它。
- 依赖登入態或 Cookie。渲染环境通常不带你的會话,靠 Cookie 判断展示内容,蜘蛛看到的往往和你不一样。
- 第三方脚本過多。渲染超时经常卡在加载慢的外部资源上,頁面越重,渲染越容易失敗。
怎么驗證蜘蛛看到了什么
- 關閉 JS 或禁用脚本,直接看頁面源碼里有没有正文和連結。
- 用 curl 或抓包工具請求一次,確認响應体里包含關键内容,而不是待填充的容器。
- 查看服務器日誌,观察同一 URL 是否出現多次請求(一次取 HTML,一次取渲染资源),渲染請求频繁失敗通常有迹可循。
- 使用搜尋引擎官方提供的抓取測試工具,對比返回的 HTML 與渲染後结果。
给入口頁的几点建议
- 蜘蛛池入口頁優先用服務端渲染或纯静態輸出,成本低、结果可预期。
- JS 做增强,不做地基:跳轉、連結、核心文本放在初始 HTML 中。
- 减少首屏依赖的外部請求,降低渲染超时概率。
- 跳轉、狀態碼、robots 相關指令按 HTTP 层面處理,別用脚本模拟。
- 改版後重新驗證一次原始 HTML,避免构建流程改動把内容推到客戶端。
入口頁是否要渲染,本质是“把不确定性放在哪一环”的問题。把内容放在第一份 HTML 里,後面任何环节出問题,损失都有限;全部押在 JavaScript 上,就等于把入口頁是否有效交给渲染队列去决定。