常见问题

入口页靠 JavaScript 才出现目标链接:搜索蜘蛛会执行脚本再发现 URL 吗

入口页的链接如果只靠 JavaScript 生成,搜索蜘蛛拿到的原始 HTML 里可能一条都没有。本文说明抓取与渲染两个阶段的差别、各引擎的处理差异、常见的高风险写法,以及用什么方法验证自己的入口页到底有没有被解析出链接。

常见问题

入口页靠 JavaScript 才出现目标链接:搜索蜘蛛会执行脚本再发现 URL 吗

很多蜘蛛池入口页为了省事,链接不是写在 HTML 里,而是等页面加载完之后用 JavaScript 动态插进来。这种写法在浏览器里看完全正常,但搜索蜘蛛看到的,和你看到的不一定是同一份内容。

抓取和渲染是两个阶段

搜索蜘蛛第一次取页面时,拿到的是服务器直接返回的原始 HTML。这一步通常不执行脚本,也不会等接口返回。只有当链接已经出现在原始 HTML 里,它才会被顺手记下来,进入待抓队列。

渲染是后面的事。部分搜索引擎会用无头浏览器把页面再跑一遍,执行 JavaScript,等 DOM 稳定后再提取链接。这一步能不能发生、什么时候发生,取决于搜索引擎自己的调度和资源分配,站点侧基本控制不了。

不同搜索引擎的差别很大

  • Google 的渲染能力相对完善,但渲染并不保证对每个 URL 都做,优先级不高的页面可能只抓原始 HTML。
  • Bing 也会渲染,同样不等于必做。
  • 百度对 JavaScript 的渲染覆盖有限,纯前端生成的外链经常等于没写。

所以同一种写法,可能在某个引擎上有效,在另一个引擎上完全没反应。把 URL 发现全部押在渲染上,本身就是一件不稳定的事。

入口页里哪些写法风险最大

  • 只在点击或滚动事件里拼链接:不触发交互就不会有链接。
  • 等接口返回后才写入 DOM:接口慢、被限流或跨域失败,原始 HTML 里就是空的。
  • 脚本被 CSP 或安全策略拦掉:脚本不执行,链接自然不存在。
  • 写成 href="javascript:void(0)" 之类:即使渲染了,也不是可跟进的 URL。
  • 懒加载只处理可视区域:渲染器视口有限,屏幕外的链接可能一直没生成。

更稳的做法

  1. 把真正希望被发现的链接写进服务端输出的 a 标签里,href 是完整可访问的 URL。
  2. JavaScript 继续用来做筛选、排序、分页交互,但首屏原始 HTML 里保留一份完整链接。
  3. 链接数量多时用分页或分段入口,而不是一次性塞进一个需要渲染才成形的容器。
  4. 只对确实需要交互的部分用脚本,不要为了排版好看把链接藏进脚本字符串里。

怎么自己验证

最直接的方法是对比两份结果:禁用 JavaScript 抓一次,再正常渲染抓一次。用查看网页源代码的方式确认原始 HTML 里有没有目标 URL,比在浏览器里肉眼检查靠谱得多。也可以在渲染前后分别导出链接列表,看看差了多少条。

如果发现原始 HTML 里一条目标链接都没有,那这个入口页实际承担的发现作用基本为零,剩下的只是渲染有没有被触发这件运气成分较大的事。

结论:JavaScript 生成链接不是不能用,但别把它当成 URL 发现的主渠道。原始 HTML 里能看到链接,才是更可控的底线。