用前端框架搭站点的人越来越多,用戶端体驗确實顺滑,但蜘蛛来訪时看到的頁面,可能和你屏幕上那一版完全不是同一個東西。這個差异不會报错,也不會有任何提示,只會悄悄体現在抓取和索引的结果里。
同一頁面,為什么會有两個版本
浏览器打開頁面後,會执行 JavaScript,再把接口返回的資料拼進 DOM,于是你看到了完整的正文、列表和推荐位。而抓取程序第一步拿到的是服務器返回的原始 HTML。是否繼續执行 JS、执行到什么程度、给多少超时時間,各家搜尋引擎的策略不同,也受自身资源限制。
结果就是同一個 URL 存在两份内容:源碼版本和渲染版本。如果正文、内鏈只存在于渲染版本里,蜘蛛能不能發現它們,就變成了一個概率問题,而不是一個确定的事。
三個自查動作,十分钟能做完
一、直接看網頁源代碼
在頁面上右键選擇「查看網頁源代碼」,注意不是「检查」或「审查元素」。在源碼里搜尋正文中的几個關鍵詞,比如某個小标题、某段獨有的话。如果搜不到,說明這段内容不在初始 HTML 里。
二、關掉 JavaScript 再看一次
浏览器設定里禁用 JavaScript,或者換一個纯文本浏览器請求同一個地址。屏幕上剩下的東西,大致就是最保守情况下蜘蛛能拿到的那部分。如果此时頁面只剩導航和頁脚,正文区一片空白,問题就已经很明确了。
三、用官方工具看渲染结果
搜尋资源平台一般都會提供網址检查類的功能,能看到抓取到的 HTML 以及渲染後的對比。命令行里用 curl 請求一次也可以,注意带上常见的 UA,观察返回的 HTML 体积和内容。這些结果比猜测可靠得多。
常见的「内容藏起来」寫法
- 正文靠接口异步加载,HTML 里只有一個空的挂载节点
- 列表頁用無限滚動,新内容由滚動事件触發,没有可点击的分頁連結
- Tab 切換類栏目的内容寫在前端數组里,初始 HTML 中一條都没有
- 主導航、面包屑、相關推荐由 JS 動態生成,源碼里看不到連結
- 图片用 data-src 存放真實地址,src 留空或是占位小图
- 正文預設折叠,需要点击「展開全文」才發起請求
這些寫法各有各的合理性,問题不在技術本身,而在于没有区分「给用戶看」和「给蜘蛛看」這两條路径。
按優先級處理,別一次全改
- 先保正文。正文是頁面的核心,用服務端渲染、静態生成或预渲染把主体内容放進初始 HTML,收益最直接。
- 再保連結。導航、分頁、内鏈至少有一部分要寫成真實的 a 标簽,让蜘蛛顺着連結能走到下一层。
- 然後是元信息。标题、描述、canonical 這類标簽尽量在服務端輸出,別依赖前端插入。
- 最後是图片和媒体。原生 loading 属性可以在保留 src 的前提下延迟加载,比清空 src 更稳妥。
如果整站改造周期長,可以先從栏目頁和内容頁這两類關键頁面動手,其余頁面保持观察。
服務端渲染和预渲染都不是一次性的工程。改版、換接口、調整打包配置之後,源碼版本都可能回退,建议在發布前的检查清單里保留「查看源代碼」這一條。
把這件事變成习惯
内容發布流程里加一步:打開新頁面的源代碼,確認正文、标题、主要内鏈都在里面。同时留意服務器日誌中蜘蛛的訪問情况,看它抓到的地址和抓取频次有没有異常變化。發現問题时,改動往往只是几行渲染配置,但對抓取效率的影响是長期的。