很多站点在浏览器里看结构完整,导航、列表、相关推荐都能点,链接一大堆;但把页面源码打开,可能只有寥寥几个链接。中间的差距,就是 JavaScript 渲染。对搜索蜘蛛来说,这两份内容并不是同一件事:源码里的链接可以顺着走,渲染后才出现的链接需要额外一步,能不能走到、什么时候走到,取决于站点怎么实现,也取决于蜘蛛愿不愿意为这个页面再花一次资源。
源码里的链接和渲染后的链接,是两批入口
蜘蛛第一次拿到页面时,看到的是服务器直接吐出的 HTML。这一步通常很快,也基本不执行脚本。HTML 里有什么 a 标签,就有什么入口。渲染一般发生在后面的某个阶段:先抓原始 HTML,把需要渲染的 URL 排进队列,等有空闲资源时再执行一次 JS,拿到渲染后的 DOM,再从中提取链接。
这中间存在时间差。源码里就有链接的页面,可能很快被继续往下走;只能靠渲染才出现的链接,就要等下一次调度。对于层级深、数量大的站点,这个差值会被放大,新页面被发现的时间也更难预估。
常见的几种“链接晚到”写法
- 用 onclick 或 JS 跳转代替 a href:代码里没有真实的 href,抓取阶段看不到目标地址。渲染后如果补上了 a 标签,还有机会;如果只是绑定事件,通常就断在这里。
- 列表内容由接口返回后再拼装:首屏 HTML 里只有骨架,文章或商品链接全靠请求接口后插入 DOM,能不能被发现取决于渲染是否被触发。
- 懒加载与“加载更多”:需要滚动或点击才出现的链接,一次渲染未必能拿全。
- 折叠菜单、Tab 切换里的入口:默认收起的内容,有时并不在初始 DOM 中。
- 依赖用户状态:链接只在登录、选择地区后出现,蜘蛛以匿名状态访问时看到的是另一套内容。
把关键入口放回 HTML 更稳妥
不必把所有东西都改成服务端渲染,但导航、面包屑、分类列表、详情页的核心出口这类结构性入口,最好在原始 HTML 里就有真实可点的 a href。
- 优先保证一级、二级导航和列表分页是静态链接。
- 用渐进增强的思路:先输出链接,再用 JS 增强交互,而不是反过来。
- 必须靠接口拼装的模块,考虑服务端先渲染一次,或者提供一个静态的“全部”页作为兜底入口。
- Sitemap 可以作为补充的发现路径,但它替代不了内链结构,层级关系和权重传递仍然靠链接维持。
怎么确认蜘蛛确实走到了
最直接的办法是对照服务器日志:看渲染型页面被抓之后,紧接着有没有出现它内部链接目标的请求。按 UA 过滤日志,观察某个新入口第一次被请求的时间,也能看出发现路径是否通畅。如果长期只有页面本身被抓,下游链接一条都没被请求,基本可以判断这些入口没被走通。
另一个常见误区是把渲染当成必然步骤。渲染有成本,站点页面越多、越重,能进入渲染队列的比例可能越低。把入口写在源码里,等于主动把这份不确定性降下来。
一句话总结:能被蜘蛛顺着走的链接,通常是 HTML 里那种写死的 a href;渲染出来的链接只是“可能被发现”,而不是“一定被发现”。结构性的入口,尽量别只留给 JS。