很多站点在做完前端改版后,会发现抓取日志里新增的 URL 明显变少,但内容确实在更新。这类情况常常不是服务器问题,而是入口链接只存在于浏览器渲染后的 DOM 里,抓取工具拿到的初始 HTML 中什么都没有。链接既然没出现,后续的抓取自然无从谈起。
先确认:源码里到底有没有链接
判断方法不复杂,关键是分别看初始 HTML 和渲染后 DOM 两个版本。
- 用命令行或抓取工具直接取初始 HTML,统计其中的链接数量,只算指向站内、可点击的真实地址。
- 在浏览器里打开同一页面,用开发者工具查看渲染后的 DOM,再统计一次。
- 如果两个数字差距很大,比如初始 HTML 只有导航和页脚,渲染后却多出几十条列表链接,说明列表内容几乎完全依赖脚本注入。
- 再看抓取日志:如果抓取集中在首页和少数栏目页,详情页几乎没有入口记录,基本可以印证上面的判断。
常见的链接隐形写法
- 用 div 或 span 加 onclick 做跳转,没有 a 标签和 href。
- href 写成 javascript:void(0),真实地址由脚本拼接。
- 用前端路由切换页面,地址栏变了,但 HTML 中没有对应的链接。
- 列表在滚动到底部或点击更多之后才注入,初始视口内没有可抓的链接。
- 分页做成了按钮,缺少形如 /list/2、/list/3 的静态地址。
这些写法对体验未必差,但对 URL 发现并不友好。抓取工具通常不会执行复杂的交互,滚动加载和点击展开的内容往往拿不到。
补充入口的几种做法
- 保留一份静态链接:首屏列表用服务端渲染或预渲染输出真实的 a 标签,脚本只负责增强交互。
- 分页给出可访问地址:页码路径用 a 标签承载,即使视觉上是按钮,也要有可点击的真实链接。
- 面包屑与相关阅读内链:这两类位置结构稳定、数量可控,适合长期作为详情页的补充入口。
- 站点地图兜底:把重要详情页写入 Sitemap,作为脚本渲染之外的发现渠道,但不要指望它替代内链。
- 栏目与专题页:为更新频繁的内容维护一个静态聚合入口,减少对客户端渲染的依赖。
分页与筛选要分清主次
筛选和排序参数容易把入口摊薄。建议只把有稳定内容、会长期存在的列表地址纳入入口体系,临时组合参数通过 robots.txt 或页面上的 nofollow 收敛,避免把抓取预算耗在随时会变的路径上。
入口数量不等于抓取价值。一条能稳定到达详情页的链接,通常比几十条参数不同的临时链接更有用。
改动上线后看什么
- 抓取日志中入口链接的命中次数是否回升,尤其是之前为零的详情页。
- 新增 URL 的发现速度,观察从列表页出现到详情页被抓取的间隔。
- 抓取工具是否仍在反复请求同一批参数页,若是则继续收敛。
- 服务器返回状态是否稳定,避免渲染服务压力带来间歇性 5xx。
改造不必一次到位,可以先从更新最频繁的栏目页开始,把静态链接补上,再逐步覆盖其他模板。上线后按周对比日志,比一次性大改更容易看清哪一步起了作用。