搜索抓取

需要 JavaScript 渲染的页面,蜘蛛第一遍抓取能看到什么

蜘蛛抓取依赖 JavaScript 渲染的页面时,第一遍拿到的往往只是一个空壳 HTML。本文说明抓取与渲染之间的时间差,以及怎样把标题、正文和内链放回原始响应,减少页面因渲染失败而失去被发现的机会。

搜索抓取

需要 JavaScript 渲染的页面,蜘蛛第一遍抓取能看到什么

用户打开的页面是浏览器执行完脚本之后的样子,蜘蛛拿到的却是服务器先返回的那份 HTML。抓取和渲染通常是两个环节:先把原始响应抓回去,再排队进入渲染。两个环节之间可能隔几秒、几分钟,站点越大、待渲染的页面越多,这个间隔越容易被放大。

如果页面的正文和链接主要由 JavaScript 生成,第一遍抓取看到的就只是一个空壳。空壳本身不一定是错误,但它让这次抓取拿不到可用的内容,也找不到页面里指向其他 URL 的路径。

不执行脚本时,蜘蛛还能读到什么

在只拿到原始响应的情况下,下面这些内容通常是可以被读到的:

  • HTML 源码里的标题、正文段落、图片 alt 文本
  • 写在 a 标签 href 属性里的链接,而不是 onclick 或 JS 跳转
  • meta 信息、canonical、robots 指令
  • 响应头里的状态码、Content-Type 与字符集

而下面这些,在抓取阶段往往读不到:前端框架渲染出来的正文、骨架屏占位块、点击按钮触发的路由跳转、用 CSS 或伪元素插入的文字。

空壳 HTML 会带来哪些连锁反应

第一遍抓不到内容,影响的并不只是这一页:

  1. 页面里的内链没被抓到,那些 URL 就少了一条被发现的通路;
  2. 蜘蛛无法从正文判断页面主题,链接周边的语境也跟着变弱;
  3. 如果渲染环节因为超时、脚本报错或接口被拦而失败,页面可能长期停留在“已发现、未抓取”的状态。

这并不等于 JS 渲染的页面一定抓不到,而是说它多了一层不确定性,而这层不确定性通常不在站长手里。

把关键内容放回原始响应

比较稳妥的思路是让第一遍抓取就有东西可读:

  • 标题、主体内容、面包屑和主要内链用服务端渲染或预渲染输出,交互部分再交给前端;
  • 页面之间的跳转使用标准 a 标签和 href,不要用 onclick 或脚本跳转代替;
  • 列表页、详情页的链接保持静态可点,不要把 URL 只写进 JS 变量;
  • 避免 hash 路由,蜘蛛通常不会把井号后面的路径当作独立 URL;
  • Sitemap 里保留这些 URL,作为内链之外的补充发现通道。

怎么确认第一遍抓到了什么

最直接的办法是关掉 JavaScript,或者用命令行工具拉一次原始响应,看看返回的 HTML 里有没有正文和链接。也可以对照服务器访问日志,确认蜘蛛的请求确实落在页面 URL 上,而不是只请求了一堆接口。搜索引擎提供的网址检查工具可以看到渲染前后的差异,适合用来做对照。

如果正文和链接必须靠脚本才能出现,至少保证首页、分类页和主要入口页是静态可读的,让蜘蛛有路可走。

小结

JS 渲染不是不能做,而是要清楚蜘蛛的第一眼和用户看到的可能完全不同。把标题、正文和内链尽量往前放,减少对渲染环境的依赖,URL 被发现和被理解的机会才更稳。