現在不少站点用前端框架搭建,頁面在浏览器里打開是完整的,但抓取工具第一次拿到的 HTML 里可能只有一個空的容器和几段脚本。正文、列表、分頁連結都要等頁面执行完脚本之後才出現。這层差异经常被誤判成“内容不够好”或者“權重不够”,實际上問题出在抓取阶段能看到的東西上。
抓取和渲染是两個阶段
搜尋蜘蛛訪問一個 URL 时,通常先取回一份服務器直接返回的 HTML,這一步叫抓取。之後是否再执行頁面里的脚本、把渲染後的结果用于索引,是另一件事,取决于资源是否可用、渲染队列的排队情况以及頁面本身的复杂度。也就是说,先有一份能讀的 HTML,才有後面的事。如果原始 HTML 里既没有正文,也没有可跟随的連結,這個 URL 在發現和判断上都會吃亏。
先確認抓取到的 HTML 里到底有什么
排查不要從改代碼開始,先從“看”開始。挑几個有代表性的頁面,做同一個動作:把 JavaScript 關掉,或者直接看服務器返回的源碼,观察下面几項。
- 正文文字是否出現在源碼里,還是只剩一個空的容器节点。
- 内鏈是否寫成带 href 的 a 标簽,還是绑定在点击事件上的按钮或 div。
- 列表頁、分頁、詳情入口是否要等接口返回之後才生成。
- 關键的 JS、CSS 资源有没有被 robots.txt 挡掉,被挡掉时渲染往往會失敗。
對照之後很容易分出两類:一類是原始 HTML 里已经有正文和連結,只是样式由脚本补;另一類是原始 HTML 几乎是空壳,内容全靠异步請求。後者才是需要重点處理的。
几種常见的“空壳”寫法
- 路由用片段标识:地址里靠 # 切換视图,後面的部分不會單獨当作 URL 被抓取。
- 点击加载:列表項由“加载更多”按钮触發,按钮不是連結,抓取工具跟不過去。
- 正文由接口拼装:HTML 里只有骨架,标题、參數、說明都寫在接口返回里。
- 整站挂在同一個入口:大量内容實际上只有一两個可抓取的 URL,其余都藏在脚本逻辑中。
調整的先後顺序
- 把連結寫成真連結:凡是希望被抓取和發現的跳轉,都用带 href 的 a 标簽;脚本可以額外做拦截,但不要只留事件。
- 让首屏關键内容進入原始 HTML:服務端渲染或预渲染都可以,至少标题、正文主干、主要内鏈要能直接讀到。
- 检查资源是否可訪問:如果 JS、CSS 被屏蔽,渲染阶段基本拿不到内容,需要放開。
- 再补 sitemap 和提交入口:這些解决的是“發現”,解决不了“拿到的是空壳”,顺序不要颠倒。
- 小批量驗證:先改一個模板,观察一段時間,再决定是否全站铺開。
观察與驗證怎么做
不用天天盯全站,挑一组样本就够:首頁、一個列表頁、两個詳情頁。改動前记錄一次,改動後隔一段時間再记錄一次,比較同一批 URL 在抓取结果里的正文長度和連結數量有没有變化。如果只是渲染後的效果變好,而抓取到的 HTML 還是空壳,說明改動没落在關键的地方。
判断一個頁面是否渲染依赖過重,有個简單办法:把脚本關掉,如果頁面既讀不到正文,也点不到下一個頁面,那它在抓取這一层基本是孤立的。
最後提醒一点:渲染型頁面並不等于收錄一定差,很多站点混合使用也能正常執行。真正需要盯住的是原始 HTML 里有没有内容、有没有可跟随的連結,這两点稳定了,再去看頁面质量和更新节奏才有意义。