搜尋抓取

HTML 体积與抓取截断:蜘蛛在頁面的哪個位置停下

蜘蛛抓取頁面並不是無限讀取,抓取器通常存在單頁讀取上限。当正文和内鏈排在截断点之後,頁面虽然返回 200,連結却可能等于不存在。本文說明哪些寫法最容易把 HTML 撑大、被截断後會出現什么現象、如何判断頁面是否偏大,以及瘦身與结构調整的执行顺序。

搜尋抓取

HTML 体积與抓取截断:蜘蛛在頁面的哪個位置停下

蜘蛛抓一個頁面,並不是把整份 HTML 從头讀到尾的無限過程。抓取器通常會在讀取到一定字节量後停下,把已经拿到的部分交给後續流程。這意味着:如果關键内容和内鏈排在截断点之後,它們對蜘蛛来说可能並不存在。

抓取器為什么會有讀取上限

抓取本身是资源消耗行為:带宽、解析、存储、後續判断都要花钱。為了防止一個超大頁面拖慢整條流水线,抓取器會設定單頁讀取上限。這個上限各家引擎不同,公開文档里也很少给出精确數值,所以更實用的做法不是去卡某個具体字节數,而是確認自己的頁面有没有明顯偏大、有没有把结构性内容堆到很後面。

哪些寫法最容易把 HTML 撑大

  • 图片直接以 base64 内联在 HTML 或 CSS 里,一張图就能带来几百 KB 的文本。
  • 把整份接口資料塞進 script 标簽,尤其是列表頁的完整資料對象。
  • 整站组件库内联輸出,每頁都重复一份样式和脚本片段。
  • 下拉菜單、彈窗、折叠面板里的隐藏内容全量輸出,用戶看不到,字节數却實實在在存在。
  • 大量模板注释、調试信息和未清理的空标簽。

這些内容未必影响用戶浏览,但會让蜘蛛在讀到正文和内鏈之前,先把讀取額度消耗掉一部分。

頁面被截断之後會怎样

最常见的情况是:狀態碼仍是 200,頁面没有报错,蜘蛛也没有任何提示。但排在後面的連結没被發現,後半段内容没參與判断。表現上就是——頁面看起来能抓,内鏈却像没有一样,新發布的深层内容迟迟不见来訪,而首頁和频道頁的抓取记錄一直很正常。

怎么判断頁面是否偏大

  • 看未压缩的 HTML 源碼体积,而不是浏览器渲染後的视觉效果。
  • 對比压缩前後的大小,差距過大說明重复文本或内联资源偏多。
  • 查服務器日誌里的响應字节數,看看蜘蛛拿到的和你本地看到的是不是一致。
  • 把 HTML 存成文件,搜尋第一條正文内鏈出現在源碼的哪個位置附近。

瘦身與结构調整的做法

  1. 图片、字体、图标改為外鏈资源,让 HTML 只保留引用地址。
  2. 列表頁控制單頁條數,把翻頁交给分頁 URL,而不是一次輸出全部條目。
  3. 非首屏模块按需加载,但正文和主要内鏈必须直接輸出,不要依赖脚本再插入。
  4. 把資料從脚本中剥离,或只保留渲染所必需的最小字段。
  5. 清理模板注释、調试残留和無意义的嵌套容器。
  6. 把次要内容拆到獨立 URL,让每個頁面承担相對單一的职责。

注意這里的顺序:先保證正文和導航内鏈出現在前半部分,再考虑压缩体积。只做压缩而不動结构,内鏈位置偏後的問题依然存在。

体积和抓取预算的關系

抓取预算不是抽象概念,它由請求數和字节數共同构成。一個頁面平均几百 KB 的站,和一個平均几十 KB 的站,在同样的抓取容量下能覆盖的 URL 數量差距明顯。列表頁、频道頁這類被抓最频繁的模板,体积收益往往最直接。

一個可执行的观察顺序

  1. 先看入口頁(首頁、频道頁)的 HTML 体积和内鏈位置。
  2. 再看被频繁抓取的列表模板,確認單頁輸出條數是否過多。
  3. 最後抽查詳情頁,確認正文和主導航是否落在前半部分。
  4. 改動後隔一段時間對比蜘蛛来訪的 URL 分布,而不只是看總請求數有没有涨。
頁面變小不一定让蜘蛛抓得更多,但頁面過大几乎總會让蜘蛛抓得更少。