入口页用 JavaScript 拼出链接,是前端框架站点里很常见的做法。很多人关心的是:这些链接如果不执行 JS 就看不到,搜索蜘蛛还会顺着它们发现目标 URL 吗?答案不是简单的“会”或“不会”,而是取决于渲染阶段能不能顺利完成。
先给结论
主流搜索引擎的爬虫大多具备一定的 JS 渲染能力:先取回原始 HTML,再排入渲染队列,用类似无头浏览器的方式执行脚本后拿到最终 DOM,然后从渲染结果里提取链接。所以理论上,纯 JS 渲染的链接也有可能被发现。
但“有渲染能力”和“一定会渲染你的页面”是两件事。渲染会消耗额外的抓取资源,爬虫会根据页面重要性、渲染队列积压情况来决定优先级和是否重试。因此 JS 渲染出来的链接属于“可能被发现”,而不是“稳定被发现”。
哪些情况容易发现不到
- 链接要等用户点击、滚动或悬停之后才插入 DOM,初始状态里根本不存在。
- 脚本里写了较长的定时器,或者依赖某个接口先返回数据,渲染窗口已经关闭。
- 入口页本身很重,JS 文件被阻塞、报错或加载超时,渲染完成后链接仍未出现。
- 关键 JS、CSS 被 robots.txt 屏蔽,渲染器拿不到脚本,自然也渲染不出链接。
- 链接依赖登录态、Cookie 或地域判断,爬虫访问时走了另一条分支。
- 入口页在渲染队列里优先级靠后,长期没被渲染,于是目标 URL 一直停在“已发现未抓取”。
怎么判断自己属于哪种情况
- 看原始 HTML。用 curl 或关闭 JS 的环境请求入口页,确认源码里是否已经包含可直接点击的 a 标签链接。如果源码里没有,就完全依赖渲染阶段。
- 对比渲染后的 DOM。用浏览器开发者工具查看渲染完成后的 HTML,确认链接是否真的出现、href 是否是真实地址而不是 javascript:void(0) 这类占位写法。
- 查服务器日志。观察入口页的抓取频率、返回状态码,以及有没有目标 URL 的请求记录,区分是“没发现”还是“发现了没抓”。
- 用站点地图兜底。把重要的目标 URL 放进 sitemap,并保证入口页有稳定的站内链接指向,减少对单一发现路径的依赖。
更稳妥的做法
- 关键链接尽量由服务端输出,或者在页面首屏的静态 HTML 里就存在。
- 无法完全服务端渲染时,至少把导航、列表、分页这类“发现型”链接做静态化处理。
- 避免用点击事件或滚动加载生成唯一入口,把必要链接放在初始 DOM 中。
- noscript 标签里的链接只能算补充,不要把它当成主要发现通道。
- 页面保持可访问:状态码正常、响应不要过慢、不要拦截爬虫 UA。
需要提醒的是,以上做法只是提高被发现的概率,蜘蛛池或任何技术手段都不能保证收录或排名,抓取和渲染的最终决定权仍在搜索引擎。
如果你的入口页依赖 JS 渲染,建议先用上面的步骤确认现状,再决定要不要把链接改为服务端输出。发现路径越简单直接,后续的抓取和收录过程就越容易观察和维护。