搜索抓取

前端渲染出来的链接,蜘蛛能顺着走吗:判断方法与兜底做法

页面里的导航、列表和分页如果靠 JavaScript 生成,蜘蛛第一次拿到的 HTML 里可能只有空容器。本文说明抓取与渲染的关系,列出几种链接写法的可抓性差异,并给出关闭脚本查看源码、对照访问日志等可自行验证的方法,以及把关键路径放回服务端 HTML、用站点地图兜底的处理思路。

搜索抓取

前端渲染出来的链接,蜘蛛能顺着走吗:判断方法与兜底做法

现在的页面越来越多内容由 JavaScript 拼出来:导航、列表、分页、相关推荐,在浏览器里看着都是能点的链接,但蜘蛛第一次请求拿到的 HTML 里,可能只有一段脚本和一个空容器。链接在不在 HTML 里,直接决定蜘蛛能不能顺着走。

蜘蛛看到的 HTML,和你看到的可能不一样

抓取通常分两步:先取回 HTML 源码,再决定要不要执行脚本做渲染。第二步不是必然发生,也不是即时发生。

  • 渲染有队列:页面要先排队,才轮得到执行脚本,链接的发现时间会被推后。
  • 预算有限:站内重要、抓取频繁的页面更容易被渲染,边缘页面可能只取源码不渲染。
  • 引擎之间有差异:不同搜索引擎执行脚本的能力不一样,只依赖渲染,等于把发现的主动权交给了对方。

所以判断标准可以很简单:这条链接有没有出现在服务端输出的 HTML 里。

几种常见的写法,蜘蛛能走到哪一步

  • a 标签加真实 href:最稳,源码里就有地址,不依赖渲染。
  • div 加点击事件再跳转:源码里没有地址,多数情况下蜘蛛不会跟。
  • onclick 里写跳转:同上,属于交互行为,不是链接。
  • hash 路由:地址里的井号部分一般不会被当成独立 URL,容易只发现一个入口页。
  • 前端渲染的列表:源码里是空容器,要靠渲染才能看到条目,能不能被发现取决于渲染是否执行。
  • 滚动加载或按需加载:不触发加载条件就不产生请求,后面的内容等于不存在。
  • 分页按钮没有 href:蜘蛛只能停在第一页。

不用猜:三个能自己验证的办法

  1. 关掉脚本直接看页面源码。列表里有多少条、有没有指向详情页的地址,一眼就能看清。这一步看到的内容,就是蜘蛛第一眼看到的内容。
  2. 对照访问日志。看列表页被请求之后,详情页是否紧接着出现请求。如果列表页被抓了、详情页长期没有动静,问题多半出在链接没有被输出。
  3. 小范围改动后再观察。把某一类列表的链接改成服务端输出,再看这一批 URL 的发现速度和抓取数量有没有变化。

把关键路径放回 HTML

不需要把所有东西都改成服务端渲染,优先保证这几处:主导航、分类列表的第一屏、分页的前后页、面包屑、正文里的站内引用。

渲染是补救手段,不是链接的替代品。链接的发现,最好在第一次请求时就完成。

渲染出来的链接也要注意细节

  • 链接尽量用真实可访问的地址,别用脚本函数代替跳转。
  • 分页保留固定的参数地址,让蜘蛛能一页页往后走。
  • 异步加载出来的新内容要有稳定的 URL,别只存在于当前会话里。
  • 站点地图和站内链接各管一段:地图负责把 URL 交出去,内链负责把路径铺出来,两者不能互相顶替。

可以先挑一个栏目做小实验:把列表链接改成服务端输出,同时把对应地址放进站点地图,然后连续观察两三周的抓取记录。改动带来的差别,往往比任何猜测都清楚。