很多站点会遇到这样的情况:日志里蜘蛛来得很勤,状态码是 200,抓取频率也不低,但页面迟迟没有进入索引。排查一圈发现链接有入口、robots 没拦、canonical 也正常,最后问题往往落在一件很基础的事上——蜘蛛拿到的 HTML 里,没有你看到的那些正文。
蜘蛛的第一版页面,决定了它后续能做什么
搜索引擎处理一个 URL,通常从服务器返回的初始 HTML 开始。这份 HTML 是判断页面主题、抽取正文、识别链接的主要依据。如果正文是浏览器执行脚本之后才出现的,蜘蛛最初拿到的就只是一个包含容器和占位符的外壳。它当然可能再渲染一次,但渲染需要排期,并不是每个 URL 都能走到那一步。
换句话说,不是蜘蛛没来,而是它来的时候没看到内容。抓取次数和内容质量是两件事:前者解决“有没有来过”,后者影响“看过之后愿不愿意继续处理”。
几种常见的“空壳”来源
1. 正文完全依赖前端渲染
服务端只返回一个空的根节点,标题、正文、价格、时间全由脚本请求接口后填充。这种做法对用户体验通常没问题,但如果接口数据没有预渲染或服务端渲染,蜘蛛就需要额外执行脚本才能拿到内容。
2. 内容藏在交互之后
折叠面板、标签页、点击“查看更多”才加载的段落,如果初始 HTML 中不存在,蜘蛛默认看不到。特别是把核心说明、参数、常见问题都放在这类组件里,页面在蜘蛛眼里就只剩标题和几行导航。
3. 正文以图片或附件形式存在
把大段文字做成图片、把说明放进 PDF、把关键字段放在需要下载的文件里,都会让文本抽取变困难。图片能被识别,但对内容理解和页面质量判断的帮助,远不如可直接读取的文本。
4. 数据在接口里,页面没有对应文本
有些站点的商品参数、课程大纲、活动细则只存在于接口返回的 JSON 中,页面靠脚本渲染成表格。如果接口公开可访问,内容最终可能出现在渲染后的页面上,但这一步能不能走到,取决于渲染资源是否被分配。更稳妥的做法是让关键信息同时出现在初始 HTML 里。
怎么确认自己给蜘蛛的是不是空壳
- 用抓取工具直接请求 URL,不看浏览器,只看返回的 HTML 源码,搜索正文中的一句话是否出现。
- 在浏览器里禁用 JavaScript 后打开页面,观察还剩下多少可用内容。
- 查看抓取工具里的 HTML 快照,确认抽取到的正文与页面实际内容是否一致。
- 对比同一模板下多个页面的初始 HTML,看看正文区域是不是都是空容器。
处理顺序上的几点建议
- 先改模板,再改内容。空壳问题通常是模板层面的,单个页面手工补内容解决不了整站问题。
- 优先保证关键字段在服务端输出。标题、主体正文、发布时间、主要分类,先落地到 HTML。
- 对依赖渲染的页面,提供可访问的数据来源。如果无法服务端渲染,至少保证接口稳定、可抓取、不依赖登录态。
- 把折叠内容改为默认展开,或同时输出一份。用户不介意多点一下,但蜘蛛没有“点一下”这个动作。
- 改完后观察抓取日志里的响应体大小。如果初始 HTML 从几百字节涨到几 KB,通常说明内容已经进来了。
抓取正常不代表页面有内容可评估。一个 200 状态的空壳页面,在索引评估阶段往往比一个内容完整但更新较慢的页面更难推进。
最后提醒一点:把内容放进初始 HTML,不等于要做过度堆砌。真正要解决的是“蜘蛛能不能读到”,而不是“读到的字够不够多”。内容本身能不能回答用户的问题,仍然是比收录更靠前的一道门槛。