做站的时候常遇到一種情况:浏览器里打開頁面,标题、正文、图片都正常,用戶看着没問题;但如果換成搜尋引擎的视角去看,抓到的 HTML 里只有一個空壳,真正的文字要等脚本跑完才出現。這類頁面的收錄,往往不是“能不能”的問题,而是慢一拍,甚至干脆漏掉。
蜘蛛先拿到的,是服務端返回的那一版 HTML
一次抓取通常從請求開始,服務器返回什么,蜘蛛第一步就拿到什么。如果返回的 HTML 里只有導航、脚注和一堆占位容器,正文全靠浏览器执行 JavaScript 才填進去,那么蜘蛛第一眼看到的就是一個内容稀薄的頁面。
搜尋引擎确實可以渲染 JavaScript,但渲染是排在後面的环节,需要額外的队列和资源,而且並不是每個被抓到的 URL 都會走到那一步。對站点来说,這意味着同一篇文章,別人源碼里就有正文,你要多等一轮,甚至等不到。
渲染不保證發生,也不保證完整
把渲染理解成“蜘蛛的第二遍阅讀”更合适:第一遍看源碼,第二遍才执行脚本。第二遍的触發有條件,也受站点整体抓取预算影响。頁面越多、渲染成本越高,能走到第二遍的比例就越低。
另外,渲染過程中依赖的接口如果被 robots.txt 拦掉、需要登入、或者返回很慢,蜘蛛看到的仍然是不完整的頁面。有些站点把正文接口挡在爬虫之外,自己却以為内容已经能被讀到了。
先確認自己是不是渲染型頁面
- 右键查看網頁源代碼,直接搜尋正文里的一句话。搜不到,說明正文不在初始 HTML 里。
- 用抓取工具或站長平台的抓取測試,對比“原始 HTML”和“渲染後 HTML”的差別。
- 看頁面里的連結是不是标准的超連結,href 是否指向真實地址。如果内鏈靠脚本拼接或点击才生成,蜘蛛顺着爬的路径就断了。
- 關掉 JavaScript 再打開頁面,看還剩多少有效内容。
這几步做完,大致能判断收錄是卡在“拿不到正文”,還是“拿到了但质量不够”。
想让内容稳定被發現,優先做這几件事
- 關键内容放源碼:标题、正文主体、主要連結尽量在服務端就輸出,交互和次要模块再交给脚本。
- 考虑服務端渲染或预渲染:至少让内容頁有一個包含正文的 HTML 版本。
- 連結用真實地址:可点击、可複製的普通超連結,比绑定点击事件更稳妥。
- 不要只在交互後才插入内容:像“点击展開”“滚動加载”的正文,蜘蛛不一定等得到那一步。
- 接口別挡住爬虫:渲染时需要的接口,確認没有被 robots.txt 或權限拦住。
- 用站点地图补一层入口:它不能替代頁面本身的可讀性,但能帮蜘蛛更早發現 URL。
已经上线的頁面怎么收敛
不必推倒重来。可以先按模板分档:内容頁優先改造,列表頁和詳情頁分別處理;把最有價值的頁面先补上服務端輸出的正文,再逐步扩展到全站。改造後观察抓取和索引狀態的變化,通常需要一段時間,不要指望改完第二天就有结果。
一個简單的判断标准:把 JavaScript 關掉,頁面還剩多少能讀的内容。剩得越多,收錄這條路就越顺。