很多站点在浏览器里打開一切正常,正文、评论、價格都在,但用工具抓一下原始 HTML,看到的却只有一個空容器标簽,剩下的内容全靠 JavaScript 在浏览器里跑出来。這類頁面在收錄上经常表現得很別扭:有时被抓過,有时又不收錄,索引报告里也看不出明顯错誤。要弄清原因,得先把“抓取”和“渲染”分開看。
抓取拿到的是 HTML,渲染才拿到正文
搜尋引擎處理一個 URL 大致分两步。第一步是把地址抓回来,拿到服務器直接返回的 HTML 源碼;第二步是在需要的时候,用渲染服務把頁面跑一遍,等 JavaScript 执行完再讀取最终 DOM。收錄判断通常基于第二步的结果,但触發第二步是有條件的,也存在排队延迟。
問题就出在這里:如果正文完全依赖 JS 注入,第一步拿到的就是一份“空壳”。搜尋引擎需要額外投入资源来渲染,渲染不是每次都會立刻發生,也不是所有頁面都值得渲染。内容越依赖 JS、渲染成本越高,被發現和進入索引的時間就越不稳定。
先確認蜘蛛實际拿到的是什么
- 用命令行 curl 或抓取工具請求 URL,看返回源碼里有没有正文關鍵詞。源碼里没有,說明内容确實是 JS 注入的。
- 在浏览器里禁用 JavaScript 再打開頁面,看還剩多少可讀内容。如果几乎空白,風險就比較明确。
- 检查頁面有没有服務端渲染或预渲染的輸出,比如 HTML 里已经带了标题、正文摘要、结构化資料。
- 對照索引报告里同一批 JS 頁面的狀態,看是不是集中在“已抓取,目前未收錄”或“已發現,尚未抓取”。
三條常见的處理路径
- 服務端渲染(SSR):HTML 返回时就带上完整正文,JS 只负责交互。對内容型頁面来说這是最稳的一種,蜘蛛不需要額外渲染就能讀到内容。
- 预渲染:构建或請求时把頁面渲染成静態 HTML 再返回。适合内容頁數量不大、更新不频繁的站点,维護成本相對可控。
- 保留客戶端渲染,但补上關键信息:至少在 HTML 里放标题、H1、正文摘要、canonical 和结构化資料,让蜘蛛即使不渲染也能判断頁面讲什么、属于哪個主题。這條路不是最優解,但比完全空壳好得多。
几個容易忽略的细节
不要让正文藏在滚動或点击之後。需要交互才加载的内容,渲染时不一定會被触發,等于對蜘蛛不存在。
检查渲染依赖的接口是否對蜘蛛開放。有些站点用 robots.txt 或防火墙拦掉了接口路径,頁面能打開但資料請求被拒,渲染出来依舊是空的。
分頁、篩選、無限滚動要给出可抓取的 URL。纯 JS 拼接的列表如果没對應真實連結,後續内容就很难被單獨發現。
別把首屏關键内容放在异步請求的最後。渲染有時間限制,慢請求可能導致内容没等到就結束了。
一個務實的判断标准
把“關掉 JavaScript 後頁面還剩什么”当作底线測試。如果關掉 JS 後仍能讀到标题、主要正文、作者和發布時間,收錄的不确定性會小很多;如果關掉之後只剩一片空白,那么無论提交多少次 sitemap、發多少外鏈,都要先解决渲染這一层的問题。
抓取解决的是“有没有拿到這個 URL”,渲染解决的是“拿到了什么内容”。收錄看的是後者,两者混為一谈,往往會對着抓取日誌白忙一场。
最後提醒一点:渲染做好了也不等于一定收錄。它只是把内容摆到可以被判断的位置,剩下還要看内容本身是否有獨立價值、是否與其他頁面重复、URL 是否規范。渲染是入场券,不是结果。