很多站点在浏览器里看着内容很完整,但搜索引擎抓取时拿到的第一版 HTML 里,正文位置是空的。原因通常是页面主体靠 JavaScript 在客户端渲染出来。这不必然导致不收录,但会让收录多一道不确定性。
抓取时拿到的,是服务器返回的原始 HTML
搜索引擎处理一个 URL,大致分两步:先抓取,拿到服务器返回的 HTML 源码;再决定是否执行页面里的 JavaScript,把渲染后的结果作为补充。第一步几乎每个页面都会有,第二步要看资源、看优先级、看页面本身的重要程度。
如果标题、正文、主要链接都靠 JS 生成,那么抓取这一步拿到的就是一个空壳。渲染队列和抓取队列不是同一件事,渲染更慢,也更挑页面。结果往往是:页面被抓过很多次,索引里的内容却始终不完整,甚至进不了索引。
渲染是有成本的,别当成默认会发生的事
搜索引擎确实会渲染 JavaScript,但渲染资源有限,它更愿意把机会给重要、有独特内容、有外部链接指向的页面。一个栏目下的第两百个商品页,或者几乎没人访问的详情页,被渲染的概率就低很多。
所以不要把"反正搜索引擎会渲染"当成方案。能放在初始 HTML 里的内容,就放在初始 HTML 里。
这几类写法最容易出问题
- 单页应用:整站路由由前端接管,直接访问某个内页时,服务器返回的是同一个空模板。
- 无限滚动:列表靠滚动加载,初始 HTML 里只有第一屏的前几条。
- 选项卡与折叠面板:默认只加载当前选中项,其余内容在点击后才请求。
- 评论、问答、分页列表:靠加载更多按钮触发,第一页之外的链接不出现在 HTML 里。
- 用 onclick 或 JS 跳转代替 a 标签:蜘蛛看不到链接,URL 发现路径就断了。
- canonical、robots meta、hreflang 由 JS 插入:这类指令需要在初始响应里就能读到。
自查:确认抓取到的版本里有没有内容
- 打开页面,查看网页源代码(不是审查元素),搜索正文里一句独特的话。
- 如果源码里搜不到,说明这段内容在初始 HTML 中并不存在。
- 禁用 JavaScript 再打开一次,看还剩多少内容。
- 在搜索后台的 URL 检查工具里看抓取到的 HTML,与源代码对照。
- 检查主要导航和内链,是否都是可点击的 a href。
如果源码里既没有正文,也没有内链,基本可以判断这个页面在抓取阶段的信息量很低。
修的时候,按优先级来
第一优先,让核心正文出现在初始 HTML 里,哪怕只是纯文本。搜索引擎要先读到内容,才谈得上判断质量。
第二优先,把主要内链写成真正的 a 标签。URL 发现靠链接,如果链接只存在于 JS 事件里,蜘蛛找不到下一层页面。
第三优先,canonical、robots、hreflang 等指令放到服务端输出的 HTML head 里,不要靠 JS 动态写。
第四优先,图片懒加载给一个 src 或 noscript 兜底,避免图片资源完全抓不到。
服务端渲染、预渲染、静态生成怎么选
- 内容更新不频繁的页面,如文档、商品详情、文章,用静态生成或服务端渲染,成本最低,效果最直接。
- 已有前端框架的项目,可以只对内容页做服务端渲染,交互部分保留客户端渲染。
- 预渲染适合页面数量不大、更新不频繁的站点,在构建时生成静态 HTML。
- 无限滚动和加载更多,最好同时提供可抓取的分页链接,让后续内容有独立 URL。
渲染能力在提升,但它是补充,不是可以长期依赖的兜底。把内容放在初始 HTML 里,是成本最低、也最稳的做法。
判断一个页面能不能顺利进入索引,先看蜘蛛拿到的那份 HTML 里有什么。用户看到的是渲染后的结果,搜索引擎看到的第一眼往往是原始源码。两者差距越大,收录的不确定性就越高。先把内容搬回源码里,再谈其他优化。