搜索抓取

搜索蜘蛛URL发现:JS跳转与空锚点造成的内链入口丢失与修复

站内链接点击正常却不被蜘蛛发现,多半是 href 为空或由 JavaScript 接管了跳转。本文梳理空锚点、button 跳转、事件委托、前端路由等常见形态,给出禁用 JS 测试、抓取日志核对、真实 href 改造与 Sitemap 兜底的具体做法,并说明服务器稳定性对抓取恢复的影响。

搜索抓取

搜索蜘蛛URL发现:JS跳转与空锚点造成的内链入口丢失与修复

点击正常,不等于入口存在

站内很多链接在浏览器里点得动,但对搜索蜘蛛来说并不算入口。典型情况是 <a> 标签没有 href,或 href 写成了 #、javascript:void(0),真正的跳转由 onclick 或事件委托完成。蜘蛛解析 HTML 时取不到目标 URL,自然不会把该地址排进抓取队列。

容易踩到的几种形态

  • 空 href 与占位符:href="#"、href="javascript:;",点击后由脚本改地址。
  • 按钮或 div 充当链接:用 button、span、div 绑点击事件,元素本身不携带 URL。
  • 事件委托统一拦截:列表容器绑定一次点击,靠 data-url 属性取地址。
  • 表单跳转:筛选、排序、翻页通过表单提交实现,蜘蛛通常不会主动提交。
  • 前端路由:history.pushState 或 hash 变化,服务端没有对应的可抓取 HTML。

排查顺序

  1. 禁用 JavaScript 打开页面,看目标地址是否还存在于 HTML 源码中。
  2. 对比原始 HTML 与渲染后的 DOM,确认 href 是否运行时才写入。
  3. 在抓取日志里搜索目标路径,如果长期没有请求记录,基本可以判断入口缺失。
  4. 检查 Sitemap 是否覆盖这些 URL,确认兜底入口是否正常。

修复的方向

核心是让需要被发现的内容,都有一段服务端输出的真实 href。JavaScript 用来增强体验,而不是作为唯一跳转方式。

  • 把 data-url 还原成真实链接,脚本只负责拦截和视觉反馈。
  • 筛选、排序参数尽量用链接承载,或保留一个可抓取的基础列表页。
  • 分页不要只留“加载更多”按钮,保留 page=2 这类可直接访问的地址。
  • 前端路由页面,考虑提供对应的服务端渲染或静态入口。

Sitemap 是补充,不是替代

Sitemap 能补入口,但替代不了内链。内链同时承担层级表达和权重传递,Sitemap 更像是一份发现清单。两者指向同一批 URL 时,抓取路径会更稳定。

抓取路径上的连带影响

如果导航和列表页大量依赖脚本跳转,蜘蛛能顺着的真实链接会变得很少,抓取容易集中在首页和一级栏目。把关键入口改成真实 href,再配合扁平的内链结构,深层页面被发现的概率才会提高。

服务器稳定性同样影响恢复

入口修好后如果长期没有访问,要检查服务器响应。超时、5xx、连接重置都会让抓取中断,蜘蛛会降低后续访问频率。先把响应时间和错误率控制在正常区间,再观察入口是否逐步被发现。

链接形态修复后,抓取恢复通常需要一段时间,不要因为一两天没有变化就反复调整站点结构。

验证与长期维护

改动上线后,用抓取日志按路径统计请求量,对比修改前后。也可以定期在无 JS 环境下抽查关键入口。把“每个可点击项是否对应真实 URL”写进前端评审清单,比事后排查更省力。

最后提醒一句:不要用 nofollow 或 robots 去遮盖失效入口,那只是隐藏症状。真正要解决的是服务端输出里没有可解析的链接地址。