搜索抓取

链接写法与 URL 发现:a 标签、JS 跳转与 onclick 的取舍

页面在浏览器里点着正常,抓取工具却可能一条 URL 都拿不到。本文比较 a 标签、JS 路由、onclick 与伪链接在 URL 发现上的差异,给出用源码和日志自查链接可发现性的步骤,并说明它与 Sitemap、内链结构如何互相配合。

搜索抓取

链接写法与 URL 发现:a 标签、JS 跳转与 onclick 的取舍

页面在浏览器里点着一切正常,抓取工具却可能一条 URL 都拿不到。这类问题多半不出在服务器或 robots.txt,而是链接本身没写成可解析的形式:地址只存在于 JavaScript 执行后的 DOM 里,或者绑在一个点击事件上。

链接写法为什么会决定 URL 的发现结果

搜索蜘蛛发现新 URL 的主要途径,仍然是顺着页面里已有的链接往下走。它能处理的是 HTML 响应体中可以直接解析出目标地址的链接;如果地址要等脚本跑完才出现,这条 URL 就多了一道门槛——需要等待渲染,而渲染有成本和次数限制,也并不保证每次都会发生。能被 HTML 直接给出的链接,是最稳的那一类入口。

这也是为什么同一个站,不同模板的详情页发现速度差很多:模板 A 的列表页是静态 a 标签,模板 B 靠前端路由拼接,二者在抓取工具眼里的可发现性并不对等。

几种常见链接写法的差异

标准 a 标签加 href

把地址写在 href 属性里,是最直接的形式。它与用户是否点击无关,抓取工具读一次 HTML 就能拿到。相对路径和绝对路径一般都能解析,但同站内部建议统一风格,避免拼接出错。锚文本不必多讲究,关键是 href 指向的地址真实可访问。

  • 链接文字或图片被 a 包裹都可以,判定依据是 href
  • 列表页、面包屑、相关推荐都是自然的入口位置
  • 同一页重复指向同一地址时,收敛成一个入口即可

JS 路由与 onclick

前端路由、onclick 跳转、javascript:void(0) 配合 data 属性,都会让目标地址藏在脚本里。地址在源码中可能以字符串形式存在,但缺少明确的链接语义,抓取工具未必会把它当成一条待抓 URL。

判断办法很直接:禁用 JS 后打开页面源码,看目标地址是否出现在 href 中。如果不在,就不能默认它会被发现。对于确实想被发现的页面,比较稳的做法是补一条普通的静态链接,或者把它放进 Sitemap,作为另一条独立通道。

图片、按钮与伪链接

用 div、span 加样式做成的“链接”,或者整块图片热区,在没有 a 标签包裹时同样不构成链接。按钮配合表单提交跳转、下拉菜单内的选项,也属于这一类。它们对用户体验没影响,但对 URL 发现是空白的。

自查链接可发现性的几个步骤

  1. 挑一个典型模板页,关闭 JavaScript 后查看源码,搜索目标 URL 的关键片段。
  2. 用抓取工具拉一次原始 HTML,确认响应体里是否存在带 href 的链接。
  3. 把服务端日志里已被访问的详情页地址,与页面 HTML 中实际出现的链接做对比,找出“日志里有、源码里没有”的那批。
  4. 对只在渲染后出现的链接,评估是否值得补一条静态入口,或单独整理进 Sitemap。
  5. 按模板分组重复以上动作,避免只看了首页就下结论。

与 Sitemap、内链结构的配合

Sitemap 是链接之外的补充通道,适合放那些内链不好安排、或者层级较深的页面。但它不应该成为唯一入口:如果全站详情页都只靠 Sitemap 提供地址,一旦 Sitemap 更新延迟或抓取失败,这批 URL 的发现就会同步停摆。更稳妥的结构是——列表页与内链负责日常发现,Sitemap 负责兜底与批量声明,两条路各走各的,互不依赖。

内链方面,不必追求每个页面都有几十个入口,重点是别让重要页面成为孤岛。一个页面如果既没有站内链接指向它,也没出现在 Sitemap 里,被抓取工具碰巧发现的概率就很低。

几个容易忽略的细节

  • # 的锚点链接,井号后面的部分不构成新的 URL,只是同一页面内的位置标记。
  • 嵌在 iframe 里的链接,是否能被抓到取决于页面可访问性,不要把它当作主要入口。
  • rel="nofollow" 影响的是链接关系的传递,并不等于阻止发现,别把它当成屏蔽工具使用。
  • 链接地址本身要能正常返回,若落点长期是 5xx 或经过多次跳转,即使被发现也很难稳定抓取。
  • 移动端与桌面端模板不一致时,要分别确认各自的链接写法。
链接写法的核对成本很低,收益却稳定:先确认地址在不在 HTML 里,再谈抓取频率和抓取预算。发现不了,后面所有优化都没有入口。