做蜘蛛池入口頁时,很多人為了让 HTML 看起来干净,或者方便前端逻辑控制,會把目标 URL 寫在 data-href、JS 變量、注释里,而不是放在 <a href> 里。這種寫法對普通用戶可能没影响,但對搜尋蜘蛛来说,结果往往和预期不一样。
搜尋蜘蛛把什么算作一條連結
主流搜尋蜘蛛解析 HTML 时,识別連結的基本條件大致是:一個 a 元素,带 href 属性,href 值是可以解析的绝對或相對 URL。满足這几点,URL 才會進入發現队列,之後才轮到判断要不要抓、什么时候抓。
其他位置出現的 URL 字符串,比如自定义属性值、脚本里的字符串、HTML 注释、正文纯文本,通常只被当作頁面内容的一部分,不會被登记成待抓 URL。換句话说,URL 能被看到,不等于能被当成連結。
几種常见寫法的實际结果
data-href 之類的自定义属性
浏览器和前端脚本認识 data-href,搜尋蜘蛛的連結解析器不認识。如果頁面里的 JS 會讀取這個属性並動態生成連結,那要走渲染路径才有可能被發現;如果不渲染,這批 URL 基本不會被登记。
JS 變量或數组里的 URL
寫在脚本里的 URL 只是字符串。支持渲染的抓取方式會先执行 JS,再解析执行後生成的 DOM,這样才能看到連結。但渲染抓取通常需要額外排队,速度慢于源碼解析,覆盖也不保證。入口頁如果只靠這種形式,URL 發現的稳定性會差很多。
HTML 注释里的 URL
注释是给人和開發者看的,不是連結。不要指望把 URL 塞進注释就能被当成外鏈。歷史上個別引擎對文本 URL 有過尝试性處理,但這不是可以依赖的机制。
纯文本形式的 URL
頁面上直接寫一段完整網址,搜尋蜘蛛可能把它当普通文字,也可能在某些场景下尝试识別,但這種识別的触發條件和覆盖面都不透明。把它当作主要入口,等于把 URL 發現交给运气。
JSON-LD 里的 url 字段
结构化資料里的 url 是用来描述實体的,目的是帮助理解頁面内容,不是给蜘蛛提供新的待抓連結。它和 a href 是两套東西,不能互相替代。
為什么有时候感觉也被抓到了
- 入口頁同时提交了 sitemap,目标 URL 是從 sitemap 進入队列的;
- 目标 URL 本身有外鏈,或者在別的頁面里有正常的 a 連結;
- 搜尋引擎走了能执行 JS 的渲染抓取,把脚本生成的連結补上了,但這依赖渲染队列,慢且不保證全量。
搞清楚這三條,就能解释大部分看起来矛盾的現象:URL 被抓了,不代表是入口頁里那行 data-href 起的作用。
怎么自查
- 禁用 JS,或者直接查看網頁源代碼,搜尋目标 URL 出現的上下文,確認是不是在 a href 里;
- 把源碼里所有 a href 提取出来,和你的目标 URL 列表比對,看覆盖了多少;
- 结合服務器日誌,看被抓的 URL 是否只出現在 sitemap 里,從而判断真實来源。
更稳妥的做法
- 只要目的是让搜尋蜘蛛發現目标 URL,就把它放進 a href,這是成本最低、覆盖面最稳的方式;
- JS 變量和渲染补鏈可以保留,但不要让它們成為唯一入口;
- 不要依赖注释、纯文本 URL 或结构化資料字段来传递連結;
- 如果入口頁确實要用動態生成,至少保留一份無渲染狀態下可讀的静態 a 連結兜底,且两者指向同一批目标。
URL 出現在頁面上只是可见,寫進 a href 才叫可發現。這两件事在搜尋抓取里不是一回事。
最後提醒一点:URL 發現只是第一步,URL 被登记之後還要面對抓取配額、目标站响應、重复内容判断等环节。把連結形式改對,是减少變數、让後續排查更容易的一步,但它本身不保證收錄或排名。