搜索抓取

视口外的链接算不算内链:懒加载、折叠面板与 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 是否可被直接发现,再去看抓取频率和收录状态。顺序反了,容易把精力花在调抓取节奏上,而问题其实出在链接本身。