常见问题

蜘蛛池入口页的链接由 JavaScript 动态生成,搜索蜘蛛还会跟进目标URL吗

入口页把目标 URL 用 JavaScript 动态写入 DOM,是很常见的做法。搜索蜘蛛一般有渲染能力,但渲染是异步的、有延迟也有配额限制。本文说明哪些 JS 链接容易被发现、哪些情况会被漏掉,并给出把关键链接放回初始 HTML 的实操建议与验证方法。

常见问题

蜘蛛池入口页的链接由 JavaScript 动态生成,搜索蜘蛛还会跟进目标URL吗

不少蜘蛛池入口页为了省事,会在页面加载完成后再用 JavaScript 把目标 URL 拼进 DOM,或者通过前端路由、组件模板输出链接。这种做法搜索蜘蛛会不会跟进,取决于搜索引擎有没有对页面做渲染,以及渲染排期和抓取配额。结论先放在前面:有可能被跟进,但不适合当成唯一入口

搜索蜘蛛处理一个页面,通常分两步

第一步是抓取服务器返回的原始 HTML,从这份源码里提取 a href 之类的链接;第二步是把页面放进渲染队列,用无头浏览器执行 JavaScript,再从渲染后的 DOM 里找新出现的链接。主流搜索引擎都具备渲染能力,但渲染是异步的,有延迟,也有配额。

所以同一个入口页,静态写死的链接可能在第一次抓取时就被发现,而 JS 生成的链接往往要等到渲染那一步,中间可能隔了几天。

什么样的 JS 链接比较容易被发现

  • 链接最终以真实的 a href 写进 DOM,而不是只绑定 click 事件
  • 入口页本身可抓取,没有被 robots.txt 拦截,也没有返回错误状态码
  • 渲染过程不依赖登录、验证码或大量用户交互
  • 页面加载速度正常,控制台报错少,第三方脚本不抢资源
  • 入口页本身有一定抓取频次,能排上渲染队列

容易被漏掉的几种情况

  • 纯 onclick 跳转,元素上没有 href,渲染后也提取不到链接
  • 链接藏在需要滚动很远、点击展开或懒加载之后才出现的位置
  • 链接数据来自前端二次请求的接口,而该接口对蜘蛛 UA 返回空内容
  • 页面 JS 依赖大量外部脚本,渲染超时或中途失败
  • 入口页响应慢、频繁返回 5xx,渲染优先级被压低
渲染不是随抓随渲。优先级通常给的是内容扎实、抓取价值高的页面。入口页本身内容单薄、权重低时,等渲染可能要花掉比预期长得多的时间。

更稳妥的做法:关键链接放回初始 HTML

  1. 入口页首屏就把指向目标 URL 的 a href 写进服务端输出的 HTML,这是最确定的路径
  2. 确实需要动态生成的,做服务端渲染或预渲染,让原始响应里就带链接
  3. 不要指望 noscript 标签兜底,它只覆盖禁用 JS 的少数场景,不能替代真实链接
  4. 可以一部分链接静态输出、一部分交给 JS,做对照观察两边的抓取差异

如果一定要用 JS,注意这几点

  • 控制渲染时机,避免把链接拖到用户滚动到底部才插入
  • 不要做无限滚动式的内容加载,入口页的链接列表尽量有明确终点
  • 前端调用的接口对搜索蜘蛛返回与普通用户一致的内容,不要按 UA 区别对待
  • 单个入口页输出的链接总量适度,避免一次性灌入大量低质链接
  • 页面加一点可读的静态说明文字,让入口页看起来不是空壳

怎么验证搜索蜘蛛有没有跟进

  1. 看入口页的访问日志里,是否出现对目标 URL 的抓取记录
  2. 看目标 URL 所在服务器的日志,注意 UA 与来源页
  3. 用搜索平台提供的 URL 检查或渲染截图功能,看渲染后 DOM 里到底有没有那条链接
  4. 对比静态链接入口页和 JS 链接入口页的抓取频次,连续观察一段时间再下判断

需要提醒的是,日志只能证明蜘蛛来过,不能证明目标 URL 会被收录。发现链接、抓取、收录是三件事,别用抓取数据去推断收录结果。

总结一下:JS 生成的链接并非完全没用,但它的发现链路更长、更依赖渲染队列。如果希望目标 URL 稳定地被发现,把关键链接写进初始 HTML 是最省事的确定性方案,JS 生成更适合作为补充手段。