聊抓取时,大家习惯先看蜘蛛来没来、有没有被 robots 拦住,但另一項成本常被忽略:蜘蛛打開一個頁面之後,要為它付出多少解析代價。同样返回 200 狀態碼,一個几十 KB、结构清爽的頁面,和一個体积巨大、DOM 塞了上萬节点的頁面,抓取效率可能差出好几倍。這會直接影响蜘蛛在一個時間段内能带走多少 URL。
頁面体积:蜘蛛的時間同样有限
蜘蛛下载頁面要占用带宽和時間。頁面越大,單次抓取耗时越長,遇到網絡波動时中途中断的概率也越高;抓取队列被慢頁面拖住,新 URL 的發現自然會被推後。
常见的頁面“虚胖”来源有几類:
- 把整個列表頁的全量資料以内联 JSON 寫進 HTML,而蜘蛛只需要連結和标题;
- 图片、字体、图标用 base64 直接嵌在 HTML 或 CSS 里,文档体积成倍增長;
- 把全站共用的 CSS、JS 全部内联到每個頁面;
- 頁面上堆了不少與主体内容無關的模块。
這些内容對用戶未必没用,但蜘蛛真正需要的是可跟随的連結和正文文本。把資料接口化、资源獨立化,頁面主体就能瘦下来。
DOM 深度與节点數量:影响連結的發現顺序
HTML 解析成 DOM 之後,蜘蛛要從中提取連結和文本。节点越多、嵌套越深,解析越慢;更關键的是,處在深层嵌套里的連結,往往排在提取队列的靠後位置。
如果全站導航、相關推荐這些入口連結都被包在多层容器里,或者依赖组件在客戶端渲染後才出現,那么這些連結要么晚被發現,要么根本進不了视野。
- 把重要連結放在源碼靠前的位置,而不是靠 CSS 让它“视觉上在上方”;
- 减少無意义的包裹层,導航和列表尽量使用语义化标簽;
- 關键入口不要只存在于需要交互才展開的组件里。
懒加载、無限滚動與“加载更多”
這三者都會把連結發現推迟到用戶行為之後。
- 图片懒加载影响相對小,因為图片不是 URL 發現的主要来源,但要保證内容图片仍用真正的 img 标簽,而不是全靠背景图或脚本插入;
- 無限滚動和“加载更多”,如果後續内容只通過接口返回、不進入 HTML,蜘蛛通常跟不到;
- 列表頁尽量保留带頁碼的可点击連結,作為蜘蛛繼續往下走的补充路径。
服務器侧也在同一筆帳里
頁面大意味着传輸時間長,首字节之後還要慢慢下载;並發抓取多的时候,服務器 CPU 和带宽压力也會同步上升,响應變慢又反過来影响抓取节奏。压缩(gzip/brotli)、静態资源缓存、CDN 對用戶和蜘蛛都有效,属于性價比很高的調整。
怎么自查
- 随机抽 5 到 10 個代表性頁面,查看 HTML 文档本身的大小,把图片和视频排除在外;
- 統計 DOM 节点數量,找出異常膨胀的頁面類型;
- 關閉 JS 後查看源碼,數一數導航和列表里還剩多少連結;
- 對照服務器日誌,看這些頁面的抓取频率和平均响應時間,是否明顯低于站点其他部分。
抓取效率往往不是靠堆入口堆出来的,而是每個頁面都轻一点、结构浅一点、連結露得早一点,慢慢累积出来的结果。