很多站点會出現一種反差:栏目頁在浏览器里点击顺畅,用戶能從首頁一路点到詳情頁,但搜尋蜘蛛的抓取记錄里,這些深层地址几乎没出現過。排查时容易先怀疑權重、抓取预算或服務器,其實更常见的原因是:連結在 HTML 源碼里根本不存在。搜尋蜘蛛發現 URL 的主要依據是解析頁面中 a 标簽的 href 属性,由脚本拼出来、藏在事件里的跳轉,對解析器来说等于没有入口。
為什么“看得见”的連結抓不到
浏览器渲染後展示的 DOM,和服務器返回的原始 HTML 是两回事。蜘蛛拿到 HTML 後先做連結提取,再决定是否执行脚本渲染。如果跳轉逻辑寫在 onclick、addEventListener 或第三方框架的執行时里,第一阶段提取不到連結,入口就會缺失。部分渲染能力更强的抓取程序可以补上,但渲染有成本,也不是所有路径都會走到那一步。
常见的不可發現連結形態
- javascript 伪协议占位:href 寫成 javascript:void(0),真實地址放在 data-href 或自定义属性里,由脚本讀取後跳轉。
- button 或 div 承载跳轉:用 button、div、span 加点击事件模拟連結,视觉上像連結,源碼里没有 href。
- 列表項整块点击:卡片外层绑定事件,内部只有标题、图片,没有任何可解析的地址。
- 表單提交:篩選、翻頁用 POST 表單提交,蜘蛛一般不會主動构造表單請求,列表下一頁就此断裂。
- iframe 與嵌套容器:導航或内容放在 iframe、Shadow DOM 中,提取范围容易漏掉。
- 動態插入的導航:菜單、相關推荐在首屏之後由接口返回再渲染,初始 HTML 中為空。
- nofollow 與 robots 誤用:連結本身正常,但被全站批量加上 nofollow,或所在路径被 robots.txt 屏蔽,入口實质被切断。
核對顺序
- 先從服務器日誌或抓取日誌里筛出目标目錄的訪問记錄,確認是“完全没来過”還是“来過但没繼續深入”。
- 用關閉脚本的方式或直接查看源碼,在返回的 HTML 里检索目标地址,確認連結是否存在。
- 與浏览器渲染後的連結清單做對比,找出只在渲染後才出現的入口。
- 检查 Sitemap 是否覆盖這些地址,以及分頁、篩選頁是否被遗漏。
- 確認路径没有被 robots.txt、meta robots 或响應头規則屏蔽。
- 核對是否因連結层級過深、入口稀疏,導致短期内没有被優先發現。
可行的改造方向
- 把跳轉還原為真實的 a 标簽:href 寫正常地址,脚本只做拦截與局部刷新(例如阻止預設行為後走前端路由),這样即使脚本不执行,連結依然可解析。
- 關键導航與列表的連結尽量服務端輸出或在构建期生成,减少對執行时接口的依赖。
- 用 Sitemap 作為兜底入口,把重要的分類、分頁、詳情頁按层級整理,避免完全依赖点击路径。
- 在正文中补充面包屑、上下篇、相關阅讀等常規内鏈,為孤立地址提供額外入口。
- 谨慎使用 nofollow,只在确實不需要传递信任的連結上使用,不要全站批量添加。
服務器稳定性對入口的影响
連結形態正确,也不代表入口一定有效。如果目标路径所在节点長期超时、返回 5xx,或不同节点返回的内容與狀態碼不一致,蜘蛛在有限次重试後可能降低该路径的訪問频率,表現為入口“事實不可達”。因此核對連結問题时,最好同时观察一段時間的响應狀態碼分布,把連結形態與响應质量分開確認,避免把两種問题混在一起排查。
提示:連結改造上线後,观察周期通常需要數周。日誌里入口出現频次上升,只能說明可發現性有所改善,並不代表一定被收錄或获得排名,不要據此下结论。
把“頁面上有連結”和“源碼里有連結”区分開,是排查這類問题的關键。先確認入口是否可被解析,再考虑抓取频率、预算與内容质量,排查顺序會清晰很多。