搜尋抓取

视口外的連結算不算内鏈:懒加载、折叠面板與 Tab 内容的抓取核對

頁面源碼里寫了連結,蜘蛛却不一定走得到。本文梳理懒加载、折叠面板、Tab 内容、悬停菜單和按钮跳轉這几類半可见連結的差异,给出一套從渲染後 HTML 到服務器日誌的核對流程,並說明哪些入口值得改成静態可抓、哪些可以保持原样。

搜尋抓取

视口外的連結算不算内鏈:懒加载、折叠面板與 Tab 内容的抓取核對

内鏈的價值不在于寫在代碼里,而在于被蜘蛛讀到並進入待抓队列。很多站長核對内鏈时看的是源碼,但蜘蛛看到的頁面往往已经被脚本改寫:連結可能還没插入,或者被藏在需要点击才能展開的容器里。

源碼里有連結,不等于蜘蛛能走

判断一個連結是否可發現,标准只有一個:蜘蛛在解析该頁面时,是否能在 DOM 中拿到带 href 的 a 标簽。

  • 静態渲染的 a 标簽:最稳,解析即可發現。
  • JS 注入的 a 标簽:要等渲染队列,可能延迟或被跳過。
  • 事件绑定的跳轉:点击才触發,通常不會被当作連結處理。

几類容易被忽略的半可见連結

折叠面板與 Tab 頁

用 display:none 隐藏的内容,多數情况下仍在 DOM 中,連結通常能被提取;但如果内容是点击时才通過接口拉取並插入,没点击就没有連結。判断方法很简單:直接看渲染後的 HTML 里有没有那段連結。

懒加载與無限滚動

列表頁的懒加载分两種。一種是占位元素在 DOM 中,滚動时替換图片或文本,連結本身早就在;另一種是完全不渲染,靠滚動触發接口。後者對蜘蛛意味着:只能拿到首屏的那一批 URL。

  • 能接受的:分頁連結、下一頁按钮是标准 a 标簽。
  • 需要补救的:無限滚動没有任何可点的頁碼入口。

补法不复杂:保留分頁入口,让列表第一頁之外的 URL 有静態出口,或者把後續頁的連結以 noscript 或底部列表的形式给出。

悬停才出現的菜單

鼠标移入才展開的下拉菜單,如果 DOM 中一開始就有 a 标簽,只是被 CSS 控制顯隐,抓取一般不受影响。真正的問题在于那些靠 JS 動態生成的二級菜單:蜘蛛没有触發 hover,子連結自然不存在。

按钮式跳轉

用 button、div 加 onclick 實現的跳轉,對用戶是連結,對蜘蛛不是。改成一個 a 标簽包住,成本极低,收益却很直接。

核對流程:從源碼到日誌

  1. 用禁用 JS 的方式抓取頁面,數一數還剩多少連結。
  2. 再用渲染後的 HTML 抓一次,對比两者的差值,差值就是依赖脚本的連結。
  3. 把该頁面在服務器日誌里對應的抓取记錄拉出来,看蜘蛛是否真的請求過這些 URL。
  4. 對關键入口(分類、专题、重要詳情)做抽查,非關键連結不必强求。
判断标准可以简化成一句:如果這個 URL 對站点结构重要,它就應该在禁用 JS 的情况下也能被找到。

哪些该改,哪些可以不動

不是所有連結都值得改成静態,先筛一层:

  • 值得改:一級分類、专题聚合、核心詳情、Sitemap 之外的补充入口。
  • 可以不動:篩選條件、评论分頁、纯交互型内容。

改動的收益在于發現路径變短,而不是連結數量變多。把一百個低價值連結塞進首屏,反而稀释了真正想被發現的入口。

和入口分發的一点關系

不管入口是内鏈、Sitemap,還是外部的連結分發,最终都落在同一件事上:目标 URL 必须能被解析出来。如果頁面本身把連結藏在脚本里,入口铺得再多,也只是绕了一圈回到原点。

所以核對顺序建议固定下来:先確認目标 URL 是否可被直接發現,再去看抓取频率和收錄狀態。顺序反了,容易把精力花在調抓取节奏上,而問题其實出在連結本身。