在网址检查里点开“已抓取的页面”,标题、导航、页脚都在,唯独正文位置是一个空的容器,或者只有一行“加载中”。这种现象在索引里通常表现为:页面能被收录,但正文参与不了匹配,流量自然起不来。问题基本不在收录环节,而在于抓取发生的那一刻,正文有没有出现在 HTML 里。
第一步:确认蜘蛛拿到的 HTML 里有没有正文
很多人判断“页面正常”的依据是浏览器能打开,但浏览器里看到的是脚本执行之后的结果,两者不是一回事。核对时要看原始响应。
- 看已抓取的 HTML:在网址检查里查看抓取到的源码,或在服务器日志里找到对应的抓取记录,再用抓取工具以相同 UA 请求一次。
- 关闭 JS 打开页面:浏览器禁用脚本后重新加载,如果正文消失,说明内容依赖脚本生成。
- 对比两种结果的差异:如果静态 HTML 里有标题和 meta、正文为空,基本可以定性为渲染问题,而不是 robots、canonical 或状态码的问题。
第二步:分清站点用的是哪种渲染方式
纯客户端渲染
HTML 基本是个壳,所有内容靠接口返回后拼装。这种结构对抓取最不友好:即便蜘蛛执行脚本,也要面对排队、超时和资源加载失败的风险,能否拿到正文并不稳定。
服务端渲染与预渲染
服务端渲染下,正文随 HTML 一起返回,抓到的就是最终内容;预渲染则是在构建或请求时生成一份静态版本给蜘蛛。两者都能让正文进入 HTML,区别在维护成本和更新时效。
混合模式
首屏服务端渲染、后续交互交给前端,是目前较常见的做法。此时要确认的是:核心正文是否落在首屏 HTML 里,而不是等用户点击或滚动之后才去请求。
第三步:逐项检查渲染链路上的拦路因素
- 脚本和接口是否被 robots.txt 屏蔽:JS 文件或数据接口被 Disallow,渲染自然拿不到内容。
- 接口是否需要登录态或特定请求头:蜘蛛没有 Cookie,请求会被拒绝。
- 内容是否在懒加载里:只有滚动到视口才触发请求,抓取时不会被触发。
- 资源是否超时或体积过大:渲染有时间与资源预算,等待太久会被放弃。
- 是否有前端报错:一个未捕获的异常就可能让整块内容不再渲染。
修复的方向
- 把核心正文改成服务端渲染或预渲染输出,交互部分留在前端。
- 短期内无法改造时,至少保证正文在首屏 HTML 中以可读文本形式存在。
- 接口不要屏蔽抓取,或为抓取提供不含鉴权的只读路径。
- 取消正文区域的懒加载,图片可以懒加载,文字不要。
- 改完后用网址检查重新抓取一次,确认原始 HTML 里能看到正文,再观察索引变化。
判断标准很简单:如果关掉 JS 后页面就没了内容,那索引里大概率也不会有内容。
最后提醒一点,把正文放进 HTML 只解决了“能被读到”这一半,标题唯一、内链入口通畅、页面本身有独立价值,仍然是收录和展示的前提。渲染问题解决之后,索引状态的更新还需要一段时间,不必因为第二天没变化就反复改动结构。