站点运营

站点运营:搜尋蜘蛛的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形式存在,不是技術倒退,而是對可發現性的基本尊重。長此以往,蜘蛛再也不會對着一個空容器空手而归。