不少站点遇到過這样的情况:在浏览器里打開頁面,标题、正文、價格、评论都正常顯示,用抓取工具請求同一個地址,返回的 HTML 里却只有導航骨架和一段脚本引用。搜尋引擎蜘蛛拿到的第一版内容如果就是這個空壳,後續能否看到完整内容,就變成了一件不确定的事。
這並不意味着必须把整站改成服務端渲染。先做一次自查,把問题范围缩小,再决定改哪里,成本會低很多。
一、先確認蜘蛛拿到的是什么
查看初始 HTML
用浏览器的“查看網頁源代碼”,而不是“检查元素”。前者是服務器返回的原始内容,後者是脚本执行後的 DOM,两者经常差別很大。如果源代碼里找不到正文段落、主要标题或商品描述,說明這些内容依赖前端生成。
用請求工具對照
用 curl 或站点自带的抓取模拟工具請求几個代表性 URL,把返回内容與浏览器渲染结果對照。重点看三處:主标题、正文主体、列表頁的條目連結。列表頁尤其容易被忽略,條目往往由接口返回後再拼進頁面。
對照日誌與抓取记錄
如果服務器日誌里能看到蜘蛛請求,可以按 URL 抽样,看它抓取後是否回头再抓、抓取频次是否明顯低于同類頁面。抓取行為只是參考,不直接等于收錄结果,但異常冷清通常值得看一眼。
二、常见让内容迟到的寫法
- 正文由接口拉取,脚本在頁面底部执行,首屏 HTML 里只有占位容器。
- 栏目導航、分頁按钮由点击事件驱動,没有真實的連結地址。
- 图片、图集、评论、價格等模块异步填充,且没有服務端兜底。
- 整站依赖客戶端路由,直接請求某個路径时返回统一的空模板。
- 内容放在内嵌框架里,或需要二次交互才展開的折叠面板中。
三、可以優先做的小調整
關键内容尽量前置
标题、正文首段、主要栏目連結、面包屑,這些對判断頁面主题最有用的部分,尽量由服務器直接輸出。次要模块,比如推荐位、相關阅讀、评论区,繼續用异步加载問题不大。
連結使用真實可点地址
導航和列表條目建议使用带地址属性的連結标簽,而不是给普通容器元素绑定点击事件。這样既方便蜘蛛顺着走,也方便用戶複製、分享和在新标簽頁打開。
给异步模块留兜底
折叠内容、懒加载区块可以提供無脚本时的提示或静態摘要。至少让頁面在没有执行脚本时,仍能表達這一頁讲的是什么。
不要把重要的頁头信息交给脚本注入
規范地址、robots 指令、多語言标注這類信息,尽量寫在服務器輸出的 HTML 里。脚本注入的版本有时會晚于蜘蛛讀取的时点,容易和已有配置互相打架。
四、上线前後留意节奏
- 改動前记錄一批代表性 URL 的初始 HTML 快照。
- 發布後重新抓取同一批地址,比對正文是否出現在源碼中。
- 观察一两周内服務器日誌里這些地址的抓取次數變化,不必期待立刻上扬,先確認没有繼續走低。
- 把检查動作並入日常的站点结构巡检,避免新模板上线後重新引入問题。
提示:渲染方式的選擇要和站点規模、团队维護能力匹配。前端渲染本身不是错誤做法,問题在于關键内容是否只在脚本执行之後才存在。
把“蜘蛛看到的第一版内容”当成一個固定检查項,很多看似玄学的抓取問题,會先在這里露出线索。