站点运营

站点运营:搜索蜘蛛的URL发现,从栏目页异步加载的影响说起

不少栏目页为了体验采用异步加载,但搜索蜘蛛抓取的是原始HTML。本文结合蜘蛛池日志中的反馈,分析异步加载如何阻断URL发现,并给出兼顾体验与可达性的具体做法。

站点运营

站点运营:搜索蜘蛛的URL发现,从栏目页异步加载的影响说起

在日常站点运营中,栏目页是蜘蛛发现新内容的主要入口之一。很多团队为了追求列表切换的流畅感,把栏目页的全部或部分区域改成了异步加载:点击分类、滚动翻页、展开更多内容,都是通过JavaScript请求后端数据后再渲染。这种做法对真实用户通常友好,但对搜索蜘蛛的URL发现来说,却可能成为一道隐形障碍。

一次常见的现象:蜘蛛池日志中的“空栏目”

有次我们调整了一个资讯栏目的列表区,把原本的整页刷新改为“点击加载更多”。上线后,从蜘蛛池反馈的抓取记录里,我们发现一个奇怪现象:蜘蛛抓取的HTML页面中,栏目区域的链接数量明显变少,甚至只剩几个固定推荐位。进一步查看蜘蛛池保存的快照,那段本该包含文章标题与URL的区块,只留下一个空的ul容器和一些JavaScript变量。

这不是个别情况。凡是依赖脚本在客户端拼装链接的栏目页,在蜘蛛池的抓取视角里都会呈现类似的“空荡感”。理解这一点之前,先要明确蜘蛛工作机制:无论真实搜索蜘蛛还是我们内部使用的蜘蛛池模拟抓取,默认都不会主动执行页面里复杂的交互脚本,它们看到的是HTTP响应里那份未经渲染的HTML源码。

异步加载是如何中断URL发现的

链接藏在JavaScript变量或DOM操作中

当栏目列表的数据被塞进JSON、再由前端模板循环生成a标签,蜘蛛在原始HTML里找不到真实地址。它只能看到一个script标签或某个数据对象的赋值语句。对于需要从HTML中提取链接的蜘蛛来说,这样的内容并不具备可发现性。

翻页与分类切换被事件绑定接管

下一页、上一页按钮没有写死href,而是监听click事件后触发AJAX请求。这类区块即便保留了一个button元素,也不会给蜘蛛提供后续页面的URL。结果就是,蜘蛛只抓到了栏目第一页,更深层的内容长期无人知晓。

异步区块导致整体链接数量的断层

原本一个栏目页会输出50个或100个文本链接,异步化之后,初始HTML可能只有5到10个。这种链接密度的骤降,会让蜘蛛对该栏目的重要性评估产生错觉,进而降低来访频次。从蜘蛛池的抓取频次曲线也能观察到,改版后蜘蛛对某些栏目的兴趣明显下降。

用蜘蛛池验证栏目页的可发现性

我们把蜘蛛池当作一面“静态视图的镜子”。当怀疑栏目页存在异步阻碍时,可以在蜘蛛池里发起一次模拟抓取,并检查返回结果里是否包含预期链接。具体可以留意以下几点:

  • 栏目列表的HTML片段中,是否存在带href的a标签,还是只有空节点或onclick属性;
  • 向下滚动加载的“加载更多”按钮,是否有一个无脚本状态下可用的静态分页链接;
  • 分类切换后的URL是否反映在浏览器地址栏,同时该URL可独立访问并返回完整列表。
蜘蛛池并不执行页面的交互脚本,它更像一位只看静态代码的读者。所以它能直观地告诉你,搜索蜘蛛在那一刻读到的是链接还是占位符。

兼容方案与折中思路

首屏内容尽量使用服务端渲染

不需要让整个栏目页完全回归传统刷新。更可行的做法是,首屏的文章列表仍然在服务端直接输出为普通链接,后续用户的滚动加载再走异步接口。这样既能保证蜘蛛每次抓取都看到一批新链接,又不影响前端的交互体验。

在异步区块外保留一个静态回退入口

如果某些栏目的设计实在无法避免全异步,可以在页面底部加上“查看全部文章”或“历史归档”的静态链接,指向一个同样内容完整、但使用传统分页的栏目视图。这个视图不需要多精美,重要的是链接存在于HTML中。

分页器用普通链接,不要用交互按钮

尤其对于栏目页的第2页、第3页,尽量写成标签并给出真实URL。如果担心页面刷新破坏单页体验,可以在这些链接上绑定增强脚本,但前提是初始HTML中仍然能够提取到href。

写在最后:别让“体验优化”变成“发现黑洞”

异步加载本身没有对错,它只是把部分渲染责任从服务器转移到了客户端。但作为站点运营者,必须清楚搜索蜘蛛和蜘蛛池这类工具的边界:它们看的是源码,不是视觉效果。每次改动栏目页前,都可以先模拟抓取一次,看看栏目里的URL是否依然清晰可见。让链接以静态HTML形式存在,不是技术倒退,而是对可发现性的基本尊重。长此以往,蜘蛛再也不会对着一个空容器空手而归。