列表页的卡片用 div 加 onclick 调 router.push 实现跳转,页面源码里没有一个 a 标签,蜘蛛只能抓到列表页本身。
一开始怀疑是「列表靠无限滚动追加内容,后面的条目根本没进 DOM」,查了一圈,方向不对。
真正麻烦的地方在于,几个原因的现象几乎一样。没有 href 就没有可抓取的链接,onclick 对蜘蛛不存在。还有一种是路由跳转依赖 JS 运行时,抓取阶段不执行。
还有一种情况,sitemap 里也没有列出这些详情页。
上来先统计源码里的 a 标签数
curl -s https://www.example.com/list/ | grep -o '<a ' | wc -l
随后改成带 href 的链接
sed -i 's#<div onclick="router.push[^"]*">#<a href="/post/1/">#' src/Card.jsx
保留单页体验改用 Link 组件
sed -i 's#import { useRouter } from "next/router"#import Link from "next/link"#' src/Card.jsx
补一套静态分页地址
curl -sI https://www.example.com/list/page/2/
这类改动我都写进变更记录,过两周再出问题时能对上号。
改完先别撤,确认这几项。列表页源码里每条卡片都有 href,蜘蛛日志中详情页的抓取量在两周内明显上升。
换成 a 标签不影响单页体验,前端路由会拦截点击,唯一变化是蜘蛛终于能看见了。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
