搜索抓取

链接藏在 JS 里:蜘蛛第一轮抓取会漏掉什么

页面上链接由 JavaScript 生成时,蜘蛛第一轮抓取拿到的初始 HTML 里可能什么都没有。本文说明渲染环节对链接发现的影响、哪些写法会让链接隐身,以及怎样用标准 href、可见分页和 Sitemap 兜底,让关键路径在无渲染状态下也能走通,并用日志和抓取时间差验证实际效果。

搜索抓取

链接藏在 JS 里:蜘蛛第一轮抓取会漏掉什么

不少站点把导航、列表、分页的链接写在 JavaScript 里,用浏览器打开一切正常,蜘蛛第一轮抓取却看不到。这不一定是蜘蛛“不处理 JS”,而是它需要走一遍渲染流程,要排队、要消耗资源。理解这个差别,能帮我们把关键路径留在初始 HTML 里。

蜘蛛处理一个页面的两轮

第一次请求拿到的是服务器直接返回的 HTML,也就是初始响应。链接、锚文本、canonical、hreflang 这一层信息,通常在初始 HTML 里就能读到。如果链接是脚本插入的,第一轮就没有线索,只能等渲染队列。

渲染队列是有限资源。页面结构越复杂、依赖的脚本越多,等待越久,而且并不是每个被发现的页面都会进入渲染。对新 URL 的发现来说,把希望全部押在渲染上,等于把发现时间交给运气。

哪些写法会让链接“隐身”

  • 链接在点击后才生成,初始 HTML 里只有 button 或 div,没有真实 href。
  • 列表内容靠接口异步填充,HTML 源码里一个 a 标签都没有。
  • 前端路由用事件绑定跳转,地址写在 data 属性里而不是 href 上。
  • 分页被“加载更多”替代,翻页地址在初始 HTML 中不可见。
  • 脚本报错或接口超时,整段链接一起消失,且不易在日常检查中发现。

给关键路径留一条不渲染也能走的路

  1. 首页、栏目页、详情页之间的主路径,用标准 a href 输出,锚文本写清楚。
  2. 分页保留一版可访问的 URL,即使前端另有一套“加载更多”的交互。
  3. 无限滚动配一个静态的分页入口,让后续内容有可进入的地址。
  4. 脚本生成链接后,服务端也输出一份同样的链接列表,两者保持一致。
  5. 用 Sitemap 兜底,但不要拿它替代内链。

Sitemap 与内链的分工

Sitemap 更像一份名单,内链才决定抓取的走向和频次。名单能让蜘蛛知道某个 URL 存在,但如果站内没有任何路径指向它,被反复回访的概率通常有限。两者配合使用:Sitemap 保证覆盖,内链保证可达,缺一环都会让路径变弱。

蜘蛛池推送和渲染的关系

用蜘蛛池推一批 URL,解决的只是“让蜘蛛知道有这些地址”。如果这些地址所在页面的内部链接全部依赖 JS 生成,蜘蛛进来之后还是难以顺着走到下一层。推送入口和站内路径是两件事,前者负责开局,后者决定能走多远。

怎么验证蜘蛛到底看到了什么

  • 关闭 JS 抓取页面,查看初始 HTML 里是否包含目标链接,直接看源码比看渲染结果更接近第一轮。
  • 对比服务器日志中的请求路径和页面渲染后的链接列表,找出只在渲染后存在的 URL。
  • 记录新页面从上线到首次被抓取的时间差,时间明显偏长的栏目值得排查路径。
日志里出现的是蜘蛛实际请求过的 URL。如果某一批 URL 长期不出现,先确认它在初始 HTML 中是否可见,再看服务器是否稳定返回。

不必把所有内容都服务端渲染

低频的、非核心的交互功能可以留给 JS。判断标准其实很简单:这个 URL 是否需要被搜索发现?需要,就让它在不渲染的情况下也能被走到;不需要,就不必为抓取做额外改动。

最后提醒一句,脚本报错、接口超时、资源阻塞这类问题,会让链接在某一刻集体消失。上线前顺手看一眼控制台错误和接口成功率,也是保证抓取路径通畅的一部分。