为什么很多入口页的链接在源码里看不到
用 Vue、React 这类框架做入口页时,链接往往是组件渲染出来的。查看页面源代码,只能看到空的容器和一段脚本,真正的 a 标签要等浏览器执行完 JS 才会出现。抓取端如果只读原始 HTML,就什么链接都拿不到。
这就带来一个常见困惑:明明页面上点得到目标 URL,抓取日志里却始终没有它的身影。问题通常不在目标 URL,而在入口页的链接根本没进入可读的 DOM。
搜索蜘蛛对 JS 的处理方式
主流搜索引擎的抓取大致分两步:先抓原始 HTML、从中提取链接,再把页面放进渲染队列执行 JS。渲染不是必做动作,而是有预算、要排队的。这带来三个实际影响:
- 发现延迟:链接可能不在第一次抓取时被发现,而要等渲染完成后进入下一轮队列,中间可能隔几天甚至更久。
- 渲染失败就断链:JS 报错、接口超时、脚本资源被 robots.txt 屏蔽,渲染出来的 DOM 里自然没有链接。
- 依赖交互的不算数:点击按钮、滚动到底、切换标签页才出现的链接,渲染通常不会主动触发,被发现的可能性极低。
渲染能力是补充手段,不是保底方案。把关键链接交给 JS,等于把 URL 发现的时间表交到别人手里。
哪些写法容易被发现,哪些容易漏
相对容易被处理
- 首屏直接渲染、不依赖接口返回的静态链接;
- 链接在初始 HTML 里就存在,JS 只负责样式或排序;
- 使用了服务端渲染(SSR)或预渲染,返回的 HTML 本身已经带 a 标签。
容易漏掉
- 链接数据来自异步接口,且接口需要登录、校验 Referer 或签名;
- 懒加载组件,只有进入视口才发起请求、才写入链接;
- 链接拼在事件回调里,只有用户点击后才出现在 DOM 中;
- 整页由 canvas 或第三方组件绘制,DOM 里根本没有 href。
怎么验证自己的入口页有没有被读到
- 在浏览器里禁用 JavaScript,打开入口页,看源码或 DOM 里还有没有目标链接。
- 用抓取端的视角验证:只发一次 GET、不做渲染,检查返回的 HTML 是否包含目标 URL。
- 结合服务端日志观察,注意区分“入口页被抓”和“目标 URL 被抓”,这是两件事。
- 看日志里有没有渲染器(User-Agent 中常带 render 字样)的访问,以及渲染请求是否真的加载了你的接口。
更稳妥的做法
如果入口页的主要目的就是让目标 URL 被发现,建议:
- 关键链接放进初始 HTML,哪怕只是一个简单的静态列表;
- 必须用前端框架时,上 SSR 或预渲染,让首屏 HTML 自带链接;
- 用 sitemap 做兜底,但要清楚它提供的是候选地址,不保证被抓取;
- 不要用隐藏文本或伪装内容去堆链接,一旦被识别,代价远大于收益。
小结
JS 动态插入的链接,搜索蜘蛛有可能通过渲染发现,但这个概率受渲染预算、页面复杂度、接口可用性影响,不可控。做 URL 发现时,能写死在 HTML 里的链接,就别留给 JS;确实需要动态渲染,就把渲染链路(接口、报错、资源加载)一起排查,而不是只盯着入口页本身。