结论先放前面:搜索蜘蛛把一条 URL 当成「可发现的链接」,前提是它出现在标准的链接位置上,最典型的就是 a 标签的 href 属性。目标 URL 如果只是以纯文本、按钮文字、onclick 事件或自定义属性的形式出现在入口页上,绝大多数情况下不会被当成一条链接去处理。
另外要区分清楚:发现只是第一步。链接写得再标准,也只代表这条 URL 有机会进入抓取队列,和最终是否被抓取、是否被收录是几件事,入口页本身不会改变这个前提。
搜索蜘蛛认的是链接结构,不是看起来像链接的文字
入口页上几种常见写法,实际差别很大:
- a 标签 + href:标准链接,会被正常解析,这是唯一可以放心依赖的形式。
- 纯文本 URL:比如正文里直接写一行 https://example.com/page.html,通常只被当作页面内容的一部分。个别引擎会尝试识别,但不稳定,也不该作为入口页的主要暴露方式。
- onclick 或 location.href 跳转:属于脚本行为,能否被发现取决于抓取端是否渲染 JS、渲染到什么程度。入口页这类页面本身权重有限,把发现完全押在渲染上风险很大。
- data-url、JSON 配置、隐藏表单字段:这些是给程序读的数据,不在链接识别范围内。
- 表单提交或 POST 跳转:抓取端一般不会主动提交表单,这条路径基本等同于不可发现。
几种写法的实际表现
纯文本粘贴的 URL
把目标地址直接打在段落里、列表里或代码块里,页面对人来说是可读的,对抓取端来说只是文本。它不会产生链接关系,也不会传递任何「这里有一条 URL 值得抓」的信号。哪怕整页贴了几百条,入口页在链接层面依然是空的。
onclick 或 JS 跳转
用按钮加 onclick、用脚本监听点击、用 window.location 在加载时跳转,这些做法在浏览器里能正常跑,但抓取端看到的是脚本代码而不是链接。支持渲染的抓取端可能会执行一部分脚本后再提取链接,执行失败、超时或被拦截时就是空白。所以这类写法是「可能被发现」,不是「会被发现」。
把 URL 塞进自定义属性或 JSON
把地址写在 data-* 属性、页面内的 JSON 变量、隐藏 input 的 value 里,再靠脚本读取渲染,抓取端不会把里面的字符串当作链接。这种做法在前端项目里很常见,但用在入口页上,等于把链接藏了起来。
已经写成非链接形式,怎么补救
- 在原有展示旁边补一条真实的 a 标签,href 写完整的绝对地址,不要用相对路径,也不要依赖脚本拼接。
- 保留原本的展示样式,不要为了改链接把页面结构弄乱,改动越小越容易核对效果。
- 如果入口页的列表是前端渲染出来的,至少保证首屏返回的 HTML 里就含有可解析的链接,不要全部交给 JS 生成。
- 同一处不要既放纯文本又放链接指向同一个地址,选一种即可,重复堆叠没有额外收益。
怎么核对入口页到底暴露了哪些链接
最直接的检查方式是按下面的顺序走一遍:
- 在浏览器里关掉 JS,打开入口页,看页面上还剩多少可点的链接。
- 查看页面源代码,用查找功能搜 href,数一数真实链接的条数,和你想暴露的目标 URL 数量对不上就说明有问题。
- 对照日志,看这些链接对应的目标 URL 有没有各自出现过抓取记录,只有入口页被抓、目标 URL 一条都没动,通常就是链接没暴露出来。
把 URL 写成纯文本或挂在脚本里,短期看起来页面更干净,实际是把发现通道关掉了。入口页的价值就在于能被解析的链接,这一点上不要偷懒。
回到最开始的问题:纯文本、onclick、data 属性这些写法,基本不能指望搜索蜘蛛通过它们发现目标 URL。想稳一点,就把链接老老实实写成 a 标签,把其他形式当成展示上的补充,而不是发现的主要依靠。