有些页面在浏览器里看是完整的,但打开源代码,只有几个空的容器标签和一段脚本。搜索蜘蛛第一次拿到的就是这个版本,后面能不能被收录,取决于它愿不愿意执行脚本、执行到什么程度、以及渲染窗口给多长时间。
抓取和渲染是两个阶段
多数搜索引擎取一个页面是分两步走的:先取回原始 HTML 做解析和入队,之后再排期执行页面里的脚本,拿到渲染后的内容。如果原始 HTML 里没有标题、没有正文、没有可点的链接,第一次抓取能提取到的信息就非常有限。这不是「不收录」,而是 URL 先进了待处理队列,什么时候渲染、会渲染几次,站点这边基本控制不了。
自查:先确认蜘蛛拿到的是哪个版本
看未执行脚本时的响应
用命令行抓取工具或者临时关掉浏览器 JS,看返回的 HTML 里到底有没有标题、首段正文和主要内链。需要注意的是,不少抓取工具默认会执行脚本,给出的结果偏乐观,容易让人误判。
用平台的抓取测试工具对比
搜索资源平台里的抓取诊断、网址检查这类功能,通常会同时展示原始响应和渲染后的截图。把两份结果并排看,最容易发现问题是出在渲染环节还是出在内容本身。如果原始响应里连 H1 都没有,而渲染后一切正常,那基本可以确定是渲染依赖过重。
检查内链是不是也在脚本里
导航、面包屑、列表分页如果全部靠 JS 注入,蜘蛛在渲染之前看不到任何入口。这些 URL 就只剩下外部链接和站点地图两条发现路径,发现节奏会明显变慢。内链入口本来就少的新页面,影响会更直接。
几种渲染方式的取舍
- 服务端渲染或构建时生成:产出的是完整 HTML,最稳,代价是要改架构或增加构建流程。
- 动态渲染:对蜘蛛返回预渲染版本,对用户返回客户端渲染版本。要注意两边内容保持一致,差异过大有被判定为作弊的风险。
- 纯客户端渲染:改动最小,但对 URL 发现和内容提取最不利,比较适合登录后才需要的那部分内容。
选择哪种,本质上是问:这个页面需不需要被搜索到。需要被搜到的正文内容,尽量不要放在脚本执行之后才出现。
短期内只能客户端渲染时能做什么
- 把标题、H1、首段正文、主要内链放进原始 HTML,哪怕样式上先隐藏。
- 保留一份 noscript 兜底说明,但只当作提示,不要把它当成主方案。
- 用稳定的静态 URL,避免依赖 hash 路由,也避免同一内容对应多个脚本参数地址。
- 内容从接口获取时,尽量让数据在首次响应里就带出来,减少二次请求。
- 把这些 URL 放进站点地图,给发现阶段补一条路。
- 首页和栏目页多给几条直接链接,别让新页面只能靠站内搜索找到。
容易忽略的一点:渲染结果要稳定
如果每次渲染出来的内容都不一样,比如推荐位随机排序、评论实时加载、价格按地区变化,蜘蛛可能反复渲染却拿不到一个稳定版本,索引里保留的往往是第一次渲染的快照。这时候正文主体和结构性内容最好固定下来,动态部分放在不影响主内容的区域。
渲染方式不是收录的开关,它只决定蜘蛛能多快、多完整地看到内容。把正文放在原始 HTML 里,比让蜘蛛多跑几次脚本更可控。
如果你发现一批页面长期停在「已发现,尚未编入索引」,可以先做一次原始 HTML 与渲染结果的对比,再决定是调整渲染方式,还是先补齐内链入口。