蜘蛛拿到的首先是原始 HTML
很多运营在浏览器里打开页面,导航、列表、分页都好好的,于是默认蜘蛛看到的也是同一个画面。但抓取阶段的第一步通常是取回 HTML 源码,源码里有什么链接,很大程度上决定了这一轮它能顺着走出去多远。JavaScript 带来的额外内容需要二次执行才能拿到,是否执行、什么时候执行,站方只能引导,很难直接指挥。
所以问题不在于"要不要用 JS",而在于关键层级的入口是不是只存在于 JS 渲染之后。
哪些链接容易漏在 HTML 之外
- 用 onclick 或事件监听做跳转的卡片、按钮,源码里没有可跟随的 href。
- 列表数据靠接口拉取,首屏 HTML 只有骨架,翻页靠点击后动态插入。
- hash 路由形态(井号后面带参数),这部分通常不会被当成独立 URL 处理。
- 下拉菜单、折叠面板里的二级导航,只有交互后才写进 DOM。
- 按需加载的"相关推荐""猜你喜欢"模块,位置在页面底部,JS 没跑到就什么也没有。
这些入口在浏览器里体验没问题,但在只看源码的一轮抓取里,它们等于不存在。
渲染抓取存在,但排在后面
搜索引擎确实具备渲染能力,会把部分页面交给渲染环节处理,但这通常要消耗更多资源,也会排在抓取队列之后。抓取预算有限的时候,源码里能直接读到链接的页面,往往更容易被优先照顾。把核心入口全部押在渲染上,等于把 URL 发现的节奏交给了别人的排队顺序。
怎么判断自己是不是这种情况
最简单的办法是禁用 JavaScript 打开页面,或者直接查看网页源代码并用关键词搜链接。如果导航、分页、详情地址在无 JS 状态下全部消失,那蜘蛛第一轮看到的就是这个样子。再对比服务端日志里这些 URL 的出现频率,差异会更直观。
把入口搬回 HTML 的几种做法
- 主导航、面包屑、分页和列表首屏,用 a 标签配合服务端渲染输出,href 写成可访问的真实地址。
- 需要交互效果的按钮,可以改成 a 标签再用 JS 拦截点击,保留地址本身。
- 无限滚动最好保留一个"查看更多"或分页链接,指向对应的分页 URL,而不是只有滚动事件。
- 筛选、排序这类参数,如果希望被当成独立入口,至少要在 HTML 里给出可抓取的链接形态,同时控制组合数量,避免生成大量近似重复地址。
- Sitemap 可以补上重要但 HTML 中出现较少的 URL,作为发现层面的补充,但它替代不了内链。
内链和第二入口的配合
即使某个模块必须用 JS 渲染,也可以在页面其他位置给出同样目标的静态链接:正文里的引用、上一篇下一篇、专题聚合页、站点地图页。蜘蛛顺着这些路径走,一样能到达目标。真正需要注意的是层级——如果某个栏目的所有入口都集中在渲染之后,而外部又没有别的链接指向它,这个栏目就可能长期停留在"已发现但抓取很少"的状态。
判断标准其实很简单:关掉 JS,页面里还有没有一条从入口走到目标的链接路径。有,URL 发现就多一层保障;没有,就只能等渲染队列。
不必把所有交互都改成静态,重点是别让关键层级只存在于渲染之后。先保证主路径在源码里可读,再把体验交给前端,这样抓取路径和用户体验并不冲突。