搜尋抓取

頁面体积與 DOM 深度:蜘蛛抓取时容易被忽略的两項成本

抓取不只是能不能訪問的問题。頁面体积、DOM 深度、懒加载方式都會影响蜘蛛的抓取效率和連結發現顺序。本文梳理哪些常见寫法會让頁面變重,以及如何通過压缩、精简结构和保留可爬取連結,让有限的抓取机會用在真正的内容上。

搜尋抓取

頁面体积與 DOM 深度:蜘蛛抓取时容易被忽略的两項成本

聊抓取时,大家习惯先看蜘蛛来没来、有没有被 robots 拦住,但另一項成本常被忽略:蜘蛛打開一個頁面之後,要為它付出多少解析代價。同样返回 200 狀態碼,一個几十 KB、结构清爽的頁面,和一個体积巨大、DOM 塞了上萬节点的頁面,抓取效率可能差出好几倍。這會直接影响蜘蛛在一個時間段内能带走多少 URL。

頁面体积:蜘蛛的時間同样有限

蜘蛛下载頁面要占用带宽和時間。頁面越大,單次抓取耗时越長,遇到網絡波動时中途中断的概率也越高;抓取队列被慢頁面拖住,新 URL 的發現自然會被推後。

常见的頁面“虚胖”来源有几類:

  • 把整個列表頁的全量資料以内联 JSON 寫進 HTML,而蜘蛛只需要連結和标题;
  • 图片、字体、图标用 base64 直接嵌在 HTML 或 CSS 里,文档体积成倍增長;
  • 把全站共用的 CSS、JS 全部内联到每個頁面;
  • 頁面上堆了不少與主体内容無關的模块。

這些内容對用戶未必没用,但蜘蛛真正需要的是可跟随的連結和正文文本。把資料接口化、资源獨立化,頁面主体就能瘦下来。

DOM 深度與节点數量:影响連結的發現顺序

HTML 解析成 DOM 之後,蜘蛛要從中提取連結和文本。节点越多、嵌套越深,解析越慢;更關键的是,處在深层嵌套里的連結,往往排在提取队列的靠後位置。

如果全站導航、相關推荐這些入口連結都被包在多层容器里,或者依赖组件在客戶端渲染後才出現,那么這些連結要么晚被發現,要么根本進不了视野。

  • 把重要連結放在源碼靠前的位置,而不是靠 CSS 让它“视觉上在上方”;
  • 减少無意义的包裹层,導航和列表尽量使用语义化标簽;
  • 關键入口不要只存在于需要交互才展開的组件里。

懒加载、無限滚動與“加载更多”

這三者都會把連結發現推迟到用戶行為之後。

  • 图片懒加载影响相對小,因為图片不是 URL 發現的主要来源,但要保證内容图片仍用真正的 img 标簽,而不是全靠背景图或脚本插入;
  • 無限滚動和“加载更多”,如果後續内容只通過接口返回、不進入 HTML,蜘蛛通常跟不到;
  • 列表頁尽量保留带頁碼的可点击連結,作為蜘蛛繼續往下走的补充路径。

服務器侧也在同一筆帳里

頁面大意味着传輸時間長,首字节之後還要慢慢下载;並發抓取多的时候,服務器 CPU 和带宽压力也會同步上升,响應變慢又反過来影响抓取节奏。压缩(gzip/brotli)、静態资源缓存、CDN 對用戶和蜘蛛都有效,属于性價比很高的調整。

怎么自查

  1. 随机抽 5 到 10 個代表性頁面,查看 HTML 文档本身的大小,把图片和视频排除在外;
  2. 統計 DOM 节点數量,找出異常膨胀的頁面類型;
  3. 關閉 JS 後查看源碼,數一數導航和列表里還剩多少連結;
  4. 對照服務器日誌,看這些頁面的抓取频率和平均响應時間,是否明顯低于站点其他部分。
抓取效率往往不是靠堆入口堆出来的,而是每個頁面都轻一点、结构浅一点、連結露得早一点,慢慢累积出来的结果。