很多蜘蛛池入口页为了省事,链接不是写在 HTML 里,而是等页面加载完之后用 JavaScript 动态插进来。这种写法在浏览器里看完全正常,但搜索蜘蛛看到的,和你看到的不一定是同一份内容。
抓取和渲染是两个阶段
搜索蜘蛛第一次取页面时,拿到的是服务器直接返回的原始 HTML。这一步通常不执行脚本,也不会等接口返回。只有当链接已经出现在原始 HTML 里,它才会被顺手记下来,进入待抓队列。
渲染是后面的事。部分搜索引擎会用无头浏览器把页面再跑一遍,执行 JavaScript,等 DOM 稳定后再提取链接。这一步能不能发生、什么时候发生,取决于搜索引擎自己的调度和资源分配,站点侧基本控制不了。
不同搜索引擎的差别很大
- Google 的渲染能力相对完善,但渲染并不保证对每个 URL 都做,优先级不高的页面可能只抓原始 HTML。
- Bing 也会渲染,同样不等于必做。
- 百度对 JavaScript 的渲染覆盖有限,纯前端生成的外链经常等于没写。
所以同一种写法,可能在某个引擎上有效,在另一个引擎上完全没反应。把 URL 发现全部押在渲染上,本身就是一件不稳定的事。
入口页里哪些写法风险最大
- 只在点击或滚动事件里拼链接:不触发交互就不会有链接。
- 等接口返回后才写入 DOM:接口慢、被限流或跨域失败,原始 HTML 里就是空的。
- 脚本被 CSP 或安全策略拦掉:脚本不执行,链接自然不存在。
- 写成 href="javascript:void(0)" 之类:即使渲染了,也不是可跟进的 URL。
- 懒加载只处理可视区域:渲染器视口有限,屏幕外的链接可能一直没生成。
更稳的做法
- 把真正希望被发现的链接写进服务端输出的 a 标签里,href 是完整可访问的 URL。
- JavaScript 继续用来做筛选、排序、分页交互,但首屏原始 HTML 里保留一份完整链接。
- 链接数量多时用分页或分段入口,而不是一次性塞进一个需要渲染才成形的容器。
- 只对确实需要交互的部分用脚本,不要为了排版好看把链接藏进脚本字符串里。
怎么自己验证
最直接的方法是对比两份结果:禁用 JavaScript 抓一次,再正常渲染抓一次。用查看网页源代码的方式确认原始 HTML 里有没有目标 URL,比在浏览器里肉眼检查靠谱得多。也可以在渲染前后分别导出链接列表,看看差了多少条。
如果发现原始 HTML 里一条目标链接都没有,那这个入口页实际承担的发现作用基本为零,剩下的只是渲染有没有被触发这件运气成分较大的事。
结论:JavaScript 生成链接不是不能用,但别把它当成 URL 发现的主渠道。原始 HTML 里能看到链接,才是更可控的底线。