常见問题

入口頁把目标 URL 寫成纯文本或 onclick,搜尋蜘蛛還能發現吗

很多蜘蛛池入口頁习惯把目标 URL 直接贴在正文里,或者用 onclick、data 属性来触發跳轉。這篇文章說明搜尋蜘蛛真正识別的是什么,纯文本、脚本跳轉、JSON 配置各自的實际表現,以及已经寫成非連結形式後该怎么补救、怎么核對入口頁到底暴露了哪些連結。

常见問题

入口頁把目标 URL 寫成纯文本或 onclick,搜尋蜘蛛還能發現吗

结论先放前面:搜尋蜘蛛把一條 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 里,再靠脚本讀取渲染,抓取端不會把里面的字符串当作連結。這種做法在前端項目里很常见,但用在入口頁上,等于把連結藏了起来。

已经寫成非連結形式,怎么补救

  1. 在原有展示旁邊补一條真實的 a 标簽,href 寫完整的绝對地址,不要用相對路径,也不要依赖脚本拼接。
  2. 保留原本的展示样式,不要為了改連結把頁面结构弄乱,改動越小越容易核對效果。
  3. 如果入口頁的列表是前端渲染出来的,至少保證首屏返回的 HTML 里就含有可解析的連結,不要全部交给 JS 生成。
  4. 同一處不要既放纯文本又放連結指向同一個地址,選一種即可,重复堆叠没有額外收益。

怎么核對入口頁到底暴露了哪些連結

最直接的检查方式是按下面的顺序走一遍:

  • 在浏览器里關掉 JS,打開入口頁,看頁面上還剩多少可点的連結。
  • 查看頁面源代碼,用查找功能搜 href,數一數真實連結的條數,和你想暴露的目标 URL 數量對不上就說明有問题。
  • 對照日誌,看這些連結對應的目标 URL 有没有各自出現過抓取记錄,只有入口頁被抓、目标 URL 一條都没動,通常就是連結没暴露出来。
把 URL 寫成纯文本或挂在脚本里,短期看起来頁面更干净,實际是把發現通道關掉了。入口頁的價值就在于能被解析的連結,這一点上不要偷懒。

回到最開始的問题:纯文本、onclick、data 属性這些寫法,基本不能指望搜尋蜘蛛通過它們發現目标 URL。想稳一点,就把連結老老實實寫成 a 标簽,把其他形式当成展示上的补充,而不是發現的主要依靠。