很多人盯蜘蛛抓 HTML,却忽略了一件事:一次抓取任務里,蜘蛛發出的請求有相当一部分並不是頁面地址,而是支撑頁面渲染的 JS、CSS、字体和图片。這些资源請求同样計入抓取開销,如果它們被反复拉取,留给新 URL 的額度就被吃掉了。
蜘蛛為什么一定要拉静態资源
早期的蜘蛛只看 HTML 源碼,現在主流搜尋引擎要把頁面渲染完再判断内容。渲染就要执行 JS、加载样式,所以蜘蛛會去請求頁面引用的 CSS 和 JS 文件。這不是蜘蛛多事,而是不拉這些文件,頁面在它眼里就是残缺的。
問题在于:這些請求是否必要、是否重复。
同一批资源被反复請求的常见原因
- 缓存头缺失或過短:服務器没给 Cache-Control,或者 max-age 只有几分钟,蜘蛛每次渲染都当新资源拉一遍。
- 资源地址带随机參數:构建工具给 JS 加上 ?v=1699xxxx 這類時間戳,每次發布地址都變,舊地址變成冷资源,新地址又要重新拉。
- 文件名不變而内容變:style.css 直接覆盖更新但不改文件名,缓存對不上,蜘蛛只能重新拉,同时也拿不到稳定版本。
- 灰度或 A/B 逻辑:同一頁面根據 Cookie、UA 返回不同版本的 JS,蜘蛛每次訪問拿到的都不一样。
- 资源出错後反复重试:某個 JS 返回 500 或超时,而頁面渲染依赖它,蜘蛛會在後續訪問中反复尝试。
资源抓取失控會带来什么
最直接的影响是渲染變慢、抓取队列被占。一個本身很轻的頁面,如果依赖十几個未被缓存的外部脚本,蜘蛛渲染一次的成本可能比抓十個 HTML 還高。長期看,服務器並發压力也會被這些重复請求推高,尤其是图片、字体這類体积大的文件。
另一個隐蔽的後果是:如果關键 CSS、JS 被 robots.txt 拦住,蜘蛛渲染不出内容,頁面在它眼里可能一直是空壳,抓到了也等于没抓。
可以落地的几個動作
- 给静態资源設定合理的缓存策略,内容不變的文件用較長的 max-age,並配合 ETag 或 Last-Modified,让蜘蛛能用條件請求拿到 304。
- 资源文件名加内容指纹(hash),發布新版本时換文件名,而不是靠查询參數顶替。舊文件可以繼續缓存,新文件只拉一次。
- 确保 CSS、JS 等渲染依赖的资源對蜘蛛可訪問,別在 robots.txt 里把它們一起屏蔽。
- 清理已经废弃的资源引用,避免頁面里還挂着早就 404 的脚本,让蜘蛛白跑。
- 把首屏必需的關键样式内联一小部分,减少渲染鏈路上的阻塞請求。
怎么用日誌判断资源抓取是否健康
在抓取日誌里按文件類型分组,看 JS、CSS、图片的請求量占比。如果资源請求數量遠高于 HTML,並且同一個资源地址被高频重复訪問,多半是缓存或版本控制出了問题。再看這些請求的狀態碼分布,404、500、302 的比例偏高时,先修资源本身,再谈抓取效率。
资源抓取不是越少越好,渲染需要的東西必须让蜘蛛拿到;要减少的是重复、無效和拿不到结果的那部分請求。
換個角度看,静態资源也是站点交给蜘蛛的“渲染材料”。把材料的缓存、版本和可達性理顺,頁面被抓到时才能被完整看懂,抓取预算也才更可能花在真正需要被發現的新 URL 上。