列表页是 Vue 3 的 history 模式,分页用 /list/2 这样的路由参数,内容在组件挂载后才请求。curl 拿到的 HTML 里只有一个空容器,百度抓到的第二页起全是空页。Google 那边因为会执行 JS,收录正常。

一开始怀疑是「分页链接由 router-link 生成,href 可抓但落点是空壳」,查了一圈,方向不对。

这类报错背后常见的原因有几处,逐个排除就行。列表内容完全依赖客户端请求,首屏 HTML 里没有任何条目。也可能是没有做服务端渲染,也没有预渲染分页地址。

还有一种情况,取数接口需要带 cookie,蜘蛛请求拿不到数据。

直接抓第二页的 HTML,看里面有没有条目

curl -s https://www.example.com/list/2 | grep -c 'class="item"'

再往下确认分页链接是不是真实可访问的地址

curl -sI https://www.example.com/list/2 | head -2

接着开预渲染,把常用分页在构建时输出成静态 HTML

npx prerender-spa-plugin --routes /list/1 /list/2

等前面都确认过,再接口对匿名请求放开只读数据,避免依赖 cookie

grep -rn 'credentials' src/api/list.js

恢复的判定其实很直接。抓第二页的 HTML 里能看到二十条条目和下一页链接,一个月后分页收录从 0 涨到六成。

补一句。SPA 的收录问题不能指望搜索引擎执行 JS 来解决,预渲染或服务端渲染是唯一可控的路径。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189