搜尋抓取

首屏 HTML 里有什么,决定了蜘蛛能抓到什么

搜尋蜘蛛拿到的是服務器返回的 HTML,不是浏览器渲染完的画面。本文說明服務端渲染、客戶端渲染與混合渲染在抓取上的差別,並给出判断頁面類型的方法與几處可落地的調整,让正文和内鏈出現在初始响應里,减少 URL 發現环节的损耗。

搜尋抓取

首屏 HTML 里有什么,决定了蜘蛛能抓到什么

搜尋蜘蛛抓取一個頁面时,它先看到的是服務器返回的 HTML,而不是浏览器渲染完成之後的画面。這個差別决定了頁面上的内容和連結能不能進入抓取路径。很多站点内容本身没有問题,卡住的地方在于首屏 HTML 里几乎什么都没有。

蜘蛛拿到的是响應体,不是屏幕上的画面

用戶打開頁面时,浏览器會下载 HTML、样式和脚本,执行 JavaScript,再請求接口拿資料,最後拼出可见内容。蜘蛛訪問时只走前面的步骤,脚本渲染可能在後續的渲染队列里完成,但這需要額外的時間和资源,也不保證每次都执行得完整。

所以判断一個頁面能不能被抓到,最简單的問题是:關掉 JavaScript,這個頁面的主要内容還在不在。如果關掉之後只剩導航框架和一片空白,那蜘蛛第一次看到的也大概率是這样。

三種渲染方式在抓取上的差別

服務端渲染與静態生成:内容寫在 HTML 里

服務端渲染和静態生成产出的 HTML 中,正文、标题、内鏈、分頁連結都已经寫好了。蜘蛛拿到响應体就能直接解析出 URL,不需要等待脚本执行。對于詳情頁、栏目列表頁這類需要被發現的頁面,這是最省事的形態。

客戶端渲染:首屏依赖脚本执行

纯客戶端渲染的站点,HTML 往往只有一個空的容器节点和一堆脚本引用。用戶的浏览器會把内容补齐,但蜘蛛可能需要把頁面放進渲染队列,等资源加载完再执行。脚本报错、接口超时、第三方资源加载失敗,都可能让抓取结果停在空壳狀態。即便渲染成功,也多花了一轮時間和带宽。

混合與预渲染:要看具体實現

不少框架是混合模式,一部分内容由服務端輸出,一部分留给客戶端。预渲染則是提前生成一份含内容的 HTML。两種做法本身没有對错,關键是確認最终返回给蜘蛛的那份 HTML 里,是否包含你希望被發現的 URL 和正文。

判断頁面属于哪一種,可以用几個简單办法

  1. 查看網頁源代碼,搜一下正文里的關鍵詞。如果只能看到脚本引用和空的容器节点,說明内容靠 JavaScript 生成。
  2. 临时禁用 JavaScript 打開頁面,看看還剩多少内容和多少連結。
  3. 用抓取工具或命令行直接請求 URL,只看不带渲染的响應体。
  4. 在搜尋平台的抓取诊断里查看返回的 HTML 是否完整,對比抓取時間和渲染狀態。

想让蜘蛛少踩坑,優先調整這几處

  • 詳情頁和栏目頁尽量采用服務端渲染或静態生成,至少保證正文和主要内鏈在初始 HTML 中。
  • 分頁連結、列表項連結不要依赖滚動或点击才产生,寫成真實的 a 标簽。
  • 核心内容不要等接口返回後才出現,可以考虑把首屏資料直接内联進 HTML。
  • 如果必须用客戶端渲染,把關键 URL 放進 Sitemap,作為内鏈之外的补充發現入口。
  • 渲染层出错时返回明确的狀態碼,不要用 200 返回一個空頁面,那容易變成软 404。

連結也必须出現在 HTML 里

内容能被渲染出来還不够,連結同样要在初始 HTML 里可解析。如果導航和列表是脚本動態生成的,蜘蛛即使完成了渲染,也可能拿不到完整的 URL 集合。内鏈是抓取路径的主要来源,連結缺一块,後面很多頁面就迟迟進不了队列。

另外要注意,渲染出来的連結應该是稳定的地址。每次渲染都带上随机參數,容易制造同一個内容的多個地址,把有限的抓取次數花在重复頁面上。

蜘蛛看到的是 HTML,不是屏幕。想让内容進入抓取路径,先让它在源代碼里出現。