用蜘蛛池做 URL 发现时,很多人把精力放在入口页数量和链接层级上,却忽略了一个更基础的问题:蜘蛛拿到的 HTML 里到底有没有链接。如果入口页的链接是靠 JavaScript 在浏览器里动态生成的,抓取端可能只看到一个近乎空白的骨架,后面的目标页自然也无从被发现。
抓取端处理 JS 的两种路径
主流搜索引擎的抓取大致分两步:先按 HTML 源码抓一次,再择机用渲染服务执行页面里的脚本。渲染是有成本的,是否执行、什么时候执行、执行到什么程度,都不由你决定。所以对入口页来说,链接出现在初始 HTML 里,和链接要靠脚本生成,是两种完全不同的处境。
前者蜘蛛一次请求就能拿到链接,顺利进入下一跳;后者要排队等渲染,如果渲染没有发生或中途失败,链接就等于不存在。
空壳入口页的常见成因
- 前端框架整站渲染:React、Vue 这类方案把路由和内容都放在 JS bundle 里,服务端返回的 HTML 只有根节点和几个 script 标签。
- 链接异步加载:列表、分页、推荐位先请求接口,拿到数据后再插入 DOM。
- 脚本报错或被拦截:入口页依赖的第三方资源加载失败,或被防火墙、CDN 规则拦掉,渲染直接中断。
- 内容被隐藏:链接写在折叠面板、tab 或懒加载容器里,需要交互才会出现。
先确认蜘蛛看到的是不是空壳
不要用浏览器打开来判断,浏览器会执行脚本,你看到的是渲染后的结果。可以用下面几个办法交叉核对:
- 查看网页源码,而不是审查元素,搜索目标链接的 URL 或锚文本,看是否出现在初始 HTML 中。
- 用 curl 或脚本抓取一次,把返回体与浏览器里的 DOM 做对比。
- 检查访问日志里入口页的响应体大小,如果长期只有几百字节,基本可以判定是空壳。
- 用带渲染开关的抓取工具各跑一遍,对比两次拿到的链接数量。
如果源码里没有链接、渲染后又出现,那这个入口页对抓取的贡献就高度依赖渲染,稳定性会差很多。
让链接回到 HTML 里
更省事的做法是从结构上改,而不是和渲染机制较劲。
- 服务端渲染或预渲染入口页,至少保证通往目标页的链接出现在初始 HTML 中。
- 把关键链接放在首屏静态区域,避免依赖点击、滚动或接口回调。
- 分页、筛选这类链接尽量用普通 a 标签加真实 href,不要用 onclick 跳转或纯 hash 路由。
- 如果确实无法做服务端渲染,可在入口页底部放一组静态导航链接作为兜底。
- 数量上控制规模,一个入口页放出几十个有效链接通常够用,堆几百个反而稀释权重。
几个容易踩的误区
页面在浏览器里能正常打开、链接能点,不等于蜘蛛能拿到链接。视觉正常和抓取正常是两回事。
- 给用户一套渲染、给蜘蛛一套空壳,这种差异化容易被判为作弊,长期也不稳定。
- 认为只要用了成熟框架,搜索引擎就一定能渲染。渲染是尽力而为,不是承诺。
- 把 JS 生成的链接和 sitemap 当成互斥选项。两者可以同时存在,sitemap 是补充,不是替代。
- 忽略渲染超时。脚本多、接口慢时,渲染队列可能等不到内容就结束。
使用建议
对蜘蛛池的入口页,建议把“初始 HTML 里可被解析的链接数”当成一个常规检查项,而不是上线一次就不管。改动模板、更换框架、上线新广告位之后,重新抓一次源码确认链接还在。真正稳定的 URL 发现,靠的是简单、静态、可预测的 HTML,而不是让蜘蛛去执行你的前端工程。
如果发现某类入口页长期只有渲染后才出链接,与其反复调优,不如换一批结构更简单的模板,把抓取预算留给那些一次请求就能走通的页面。