網站收錄

頁面靠 JavaScript 渲染时,蜘蛛看到的可能不是你看到的那一版

很多用 JavaScript 拼装的頁面,初始 HTML 里几乎什么都没有。抓取與渲染是两個阶段,渲染要排队,也不保證一定成功。本文說明哪些常见寫法會让正文和内鏈抓不到,怎样驗證蜘蛛看到的内容,以及把關键内容放進 HTML 的几種做法。

網站收錄

頁面靠 JavaScript 渲染时,蜘蛛看到的可能不是你看到的那一版

越来越多的站点用 JavaScript 拼装頁面:商品列表、评论区、文章正文都可能在浏览器里才被填進 DOM。對用戶来说這没問题,但對蜘蛛来说,它第一眼看到的東西可能和你打開頁面时看到的完全不是一回事。這也是不少頁面「内容明明很完整,却迟迟没有收錄」的原因之一。

抓取和渲染是分開的两步

蜘蛛處理一個 URL,大致會经歷两個阶段:

  1. 抓取原始响應:服務器返回的 HTML 源碼,此时脚本通常還没执行,頁面可能是空壳。
  2. 排队渲染:把頁面放進渲染队列,执行 JavaScript,拿到渲染後的 DOM,再從中提取文字和連結。

渲染是有成本的环节,需要排队,也未必每個 URL 都會被渲染。這意味着只有在脚本跑完之後才出現的内容,被看到的概率和时机,都不如直接寫在 HTML 里稳定。

這几種寫法最容易让内容「看不见」

  • 正文、價格、库存等關键信息全靠接口返回後再插入,初始 HTML 里只有一句「加载中」。
  • 内鏈靠点击事件或脚本生成,a 标簽没有真實的 href,蜘蛛拿不到下一跳地址。
  • 内容藏在标簽頁、折叠面板、「查看更多」之後,需要交互才出現。
  • 懒加载把首屏之外的内容全部留到滚動时再取,而渲染阶段可能已经結束。
  • 無限滚動不产生新的 URL,翻十屏的内容在索引里只是同一頁。
  • 用 canvas、图片上的文字、CSS 伪元素承载正文,文字根本不在 DOM 里。

怎么確認蜘蛛到底看到了什么

  1. 用命令行工具取一次原始响應,或直接查看網頁源代碼,確認初始 HTML 里有没有你要收錄的文字和連結。注意是「查看源代碼」,不是浏览器里的「检查元素」。
  2. 在搜尋引擎提供的 URL 检查工具里對比抓取结果與渲染截图,看两邊内容是否一致。
  3. 临时關掉浏览器 JavaScript 打開頁面,很多問题一眼就能看出来。
  4. 看服務器日誌里该 URL 的响應体大小,如果長期只有几百字节,返回的多半是空壳。

让關键内容更容易被抓到

  • 服務端渲染或静態生成:把一個頁面的核心内容直接輸出進 HTML。
  • 预渲染:构建时把常用 URL 生成静態 HTML,适合更新不频繁的頁面。
  • 關键内容優先:标题、正文、主要内鏈放在初始 HTML,次要模块再交给脚本。
  • 使用真實連結:a 标簽带 href,指向可以被抓取的 URL,不要只寫点击事件。
  • 分頁保留獨立 URL:即使前端用無限滚動,也给一個可訪問的翻頁地址。

渲染是补充,不是替代

搜尋引擎的渲染能力确實在提升,但渲染有排队、有超时、有失敗率,也不是所有頁面都會走到這一步。把所有内容都押在客戶端渲染上,等于把「能不能被看见」交给了一個不完全可控的环节。更稳的做法,是让 HTML 本身就能說明這個頁面是什么。

判断标准很简單:如果關掉 JavaScript,這個頁面還剩多少能讀懂的内容?剩下的那一部分,才是蜘蛛最稳的那一份。

收錄問题,很多时候不是頁面质量不够,而是内容根本没進入「可被评估」的狀態。先確認蜘蛛看到的内容和你看到的一致,再谈其他優化,顺序會顺很多。