搜尋觀點
你不知道的GSC:抓取與渲染——3行代碼監控JS渲染,加速動態站點SEO收錄提升!
做技術SEO的同學,大概率都踩過這個坑:頁面HTML能被谷歌抓取,可JS動態渲染的核心內容(比如商品列表、工具頁面)卻遲遲不收錄,排查時完全找不到方向——谷歌什麼時候渲染的、渲染耗時多久、有沒有執行完JS,全是“黑盒”。
推薦一種「自定義元標籤監控渲染」的方法,用來觀察谷歌無頭瀏覽器WRS服務的渲染時間。
谷歌怎麼渲染JS頁面的?
很多人以為谷歌爬蟲會“實時爬取+實時渲染”,其實它的邏輯是“分步走”,這也是收錄異常的核心原因:
1. 第一步:抓取靜態HTML:谷歌爬蟲先快速抓取頁面的純HTML代碼(不含JS執行結果),效率優先,此時動態內容是空白的;
2. 第二步:異步調度渲染:抓取完成後,谷歌會把頁面丟給專門的“網頁渲染服務(WRS)”,用無頭Chromium瀏覽器執行JS,生成完整內容,這裏提醒一點,為了提高效率,WRS服務可能會忽略緩存頭的有效時間,繼續使用老的js渲染,避免這一點你需要使用動態生成的js文件命名,一般框架會支持如:main.1875499476.js;
3. 關鍵痛點:抓取和渲染是兩個獨立環節,時間差可能很大,可能超過24小時,且渲染過程的狀態(成功/失敗/耗時),無法通過日誌或工具查看。
簡單説:你以為谷歌看到了完整頁面,其實它可能還沒開始渲染,或者渲染到一半就中斷了——這就是很多JS頁面“爬而不錄”的核心真相。
核心方案:3個自定義元標籤,破解渲染黑盒
既然谷歌不主動暴露渲染狀態,我們就主動給頁面加“監控器”:通過服務器端和客户端代碼,在頁面中插入3個自定義元標籤,分別記錄「抓取時間」「渲染時間」「渲染耗時」,直接把“黑盒”變“白盒”。
核心邏輯拆解如下:
「服務器時間標籤」:記錄谷歌抓取HTML時的服務器時間,作為時間錨點; 「客户端時間標籤」:通過JS實時更新,記錄谷歌WRS渲染頁面時的實際時間; 「渲染耗時標籤」:計算JS從開始執行到核心內容渲染完成的時間,判斷渲染是否完整。
通過這三個標籤的數值,我們能快速判斷3個關鍵問題:
1. 谷歌有沒有渲染頁面?(客户端時間≠服務器時間,説明已渲染);
2. 渲染延遲多久?(客户端時間-服務器時間,就是渲染等待時長);
3. 渲染是否完整?(正常渲染耗時5秒左右,過短説明JS執行中斷,可以使用dev工具測試一下頁面正常速度是多少)。
5大主流平台:參考代碼
WordPress、Shopify,還是Next.js、Nuxt.js,可以參考下面的eg.注意僅供思路參考,實際使用需要根據實際項目結構而定,不要在非技術指導下輕易嘗試生產環境!!
原生PHP+JS(通用獨立站)
WordPress(無插件依賴)
直接編輯當前主題的「header.php」,插入以下代碼
Shopify(Liquid模板)
登錄Shopify後台,編輯「Layout/theme.liquid」,在 中插入:
{% assign server_date = "now" | date: "%Y-%m-%d %H:%M:%S" %} Next.js(React框架,適配SSR/SSG)
在「pages/_document.js」(App Router為app/layout.js)中配置
import Document, { Html, Head, Main, NextScript } from 'next/document'; class MyDocument extends Document { static async getInitialProps(ctx) { const initialProps = await Document.getInitialProps(ctx); // 服务器时间 const serverDate = new Date().toLocaleString('zh-CN', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit' }); return { ...initialProps, serverDate }; } render() { const { serverDate } = this.props; return ( {/* JS逻辑同上,通过dangerouslySetInnerHTML内联执行 */} 