做搜索抓取排查时,有一个容易被忽略的前提:你在浏览器里看到的页面,和搜索引擎蜘蛛拿到的那份 HTML,往往不是同一份。差异可能来自 Cookie、会话状态、个性化推荐模块,也可能是登录墙、地域判断或前端渲染导致的。如果只按自己看到的样子判断抓取效果,结论很容易偏。
蜘蛛请求通常不携带任何 Cookie
搜索引擎的抓取请求大多是“裸请求”:没有你的登录态,也没有你此前浏览留下的 Cookie。这意味着任何依赖 Cookie 才会出现的内容,对蜘蛛来说约等于不存在。
- 依赖 Cookie 才显示的正文、价格、库存、评论区,蜘蛛读到的可能只是一个空容器;
- 依赖登录才展开的详情,蜘蛛只能看到登录提示;
- 用 Cookie 记录的分页位置、排序偏好、语言选择,蜘蛛不会继承。
判断方法很直接:用无痕窗口、禁用 Cookie 后访问页面,看核心内容是否还在。如果核心内容消失了,说明这套展示逻辑对抓取不友好。
把会话 ID 写进 URL 会带来什么
有些站点会在 URL 上附加会话标识,例如各类 sessionid 参数。对用户来说只是地址栏长了一点,对抓取来说却是另一回事。
- 同一篇内容产生大量 URL 变体,蜘蛛需要逐个抓取再归并;
- 日志里的抓取次数被放大,看起来抓得很勤,实际是重复劳动;
- 内链指向被分散到不同变体上,链接关系变得模糊。
处理方式一般是把会话状态放到 Cookie 或后端,不在 URL 里暴露。已经产生的带会话参数地址,可以用规范化标签或 301 收敛到一个稳定 URL,减少蜘蛛在重复路径上的消耗。
个性化模块:同一个 URL,不同访问者看到不同内容
推荐位、最近浏览、猜你喜欢这类模块,通常由前端根据 Cookie 或本地存储动态插入。蜘蛛抓取时这些模块往往是空的。如果正文本身也依赖同一套接口渲染,抓到的内容就会残缺。
比较稳妥的做法是把主体内容放在首屏 HTML 里,个性化模块作为补充。这样即使模块没有被渲染,蜘蛛依然能读到页面的核心信息,页面主题也不会因为缺少内容而变模糊。
登录墙、地域限制与 A/B 测试
- 登录墙:能给蜘蛛看的公开摘要尽量放在登录之前,不要把全部正文藏在登录之后,否则抓取到的只是一页提示。
- 地域限制:按 IP 判断地域并返回不同内容时,要确认蜘蛛来源的 IP 不会被误判成受限地区而拿到空白页。
- A/B 测试:同一个 URL 随机返回两个版本,蜘蛛多次抓取可能拿到不同内容。测试结束后应及时收敛,或对蜘蛛固定返回一个版本,避免长期的不一致。
怎么确认蜘蛛实际看到了什么
- 从服务器日志中筛出搜索引擎的 User-Agent,观察返回状态码和响应字节数,字节数明显偏小的页面值得复查;
- 用无 Cookie、无登录状态的无痕会话访问同一 URL,和抓取结果做对照;
- 使用官方提供的抓取测试工具,查看渲染后的 HTML 与资源请求情况;
- 关闭 JavaScript 再访问一次,确认正文是否仍然存在于 HTML 中。
几条可以落地的处理原则
- 核心内容不依赖 Cookie、不依赖登录、不依赖必须执行的前端接口;
- URL 保持稳定,不携带会话参数和临时标识;
- 个性化与实验性内容设置兜底版本,保证抓取时能拿到默认内容;
- 内容差异较大时,优先用服务端渲染输出可读的 HTML。
蜘蛛看到的那一份页面,才是真正参与抓取和评估的版本。先保证这一份是完整的,再去谈其他方面的调整。
如果你不确定蜘蛛看到的是什么,最省事的做法就是模拟一次无状态访问:清空 Cookie、退出登录、关闭脚本,再打开同一个 URL。你看到的内容,基本就接近蜘蛛看到的内容。