不少运营者会把“蜘蛛抓取”和“浏览器打开页面”当成同一件事,认为只要用户能看到链接,蜘蛛也能立刻看到。实际流程通常分成两步:先下载 HTML 文档,再决定是否执行 JavaScript 渲染。链接能不能进入发现队列,往往取决于第一步里有没有可解析的 href。
抓取阶段:蜘蛛先拿到的是 HTML
搜索蜘蛛请求一个 URL 时,首先拿到的是服务器返回的 HTML 源码。它会解析源码里的 a 标签 href、link 标签、图片地址等,把新 URL 放进待抓取队列。这个阶段不依赖浏览器环境,也不会等待页面上的异步请求全部完成。
如果链接只存在于 JS 变量、点击事件或前端路由里,抓取阶段就看不到它。蜘蛛可能仍然抓到了当前页面,但不会顺着这些隐藏链接继续走。
渲染阶段:不是每个页面都会执行 JS
为了处理 JS 生成的内容,搜索引擎会有渲染队列。但渲染资源有限,通常只对部分页面、部分优先级较高的 URL 执行。渲染可能延迟数小时甚至更久,也可能因为页面太复杂、接口超时、robots 限制而失败。
- 新站或低权重站点的页面,进入渲染队列的等待时间可能更长。
- 依赖第三方接口返回数据的页面,渲染时接口不稳定,链接就可能漏掉。
- 无限滚动、点击“加载更多”才出现的链接,通常不会在首次渲染中全部暴露。
把 URL 发现完全押在 JS 渲染上,等于把抓取路径交给一个不确定的后续步骤。
哪些写法容易让链接迟到
常见情况包括:用 onclick 跳转而不是 a 标签;用 div 模拟按钮;前端路由只改 history 不生成可访问地址;列表内容由接口返回后拼接到页面;分页只显示“下一页”按钮,没有静态链接。蜘蛛即使执行了 JS,也可能只看到首屏或前几条内容。
让 URL 更早进入发现队列
更稳妥的做法是让关键链接在 HTML 源码里就存在。下面这些措施可以组合使用:
- 使用标准 a 标签承载主要导航、列表和分页链接,href 指向真实可访问的 URL。
- 服务端渲染或预渲染首屏内容,让蜘蛛拿到 HTML 时就能看到链接和正文。
- Sitemap 补充那些确实需要 JS 才能到达、但你又希望被发现的 URL,并保持 URL 可访问、状态码正常。
- 分页静态化,至少让上一页、下一页和页码链接出现在 HTML 中。
- 前端路由提供可访问地址,避免只靠点击事件切换视图。
怎么验证链接是不是被看到了
可以看服务器日志里蜘蛛对目标 URL 的请求记录,也可以借助搜索控制台里的抓取统计和 URL 检查工具,对比“已抓取 HTML”和“已渲染”的结果。如果某个页面在 HTML 源码里没有链接,而渲染又不稳定,它在日志里长期不出现就不奇怪。
抓取和渲染的分工决定了:能被 HTML 解析的链接,发现路径最短;只能靠 JS 暴露的链接,发现路径更长也更不确定。先把主路径做扎实,再考虑动态加载带来的体验优化,通常更符合蜘蛛的抓取习惯。