结论先放前面:搜尋蜘蛛把一條 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 标簽,把其他形式当成展示上的补充,而不是發現的主要依靠。