列表页是 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 来解决,预渲染或服务端渲染是唯一可控的路径。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
