搜尋抓取

蜘蛛也會抓 CSS、JS 和图片:资源請求占掉的抓取額度與带宽

很多站点只盯着 HTML 有没有被抓,却忽略了頁面引用的 CSS、JS、图片同样會产生抓取請求。本文說明蜘蛛為什么要抓资源文件、资源抓取常见的几個坑(參數化地址、被 robots 誤挡、第三方域名、超大文件),以及怎样從服務器日誌里判断,並给出减轻源站压力的實用做法。

搜尋抓取

蜘蛛也會抓 CSS、JS 和图片:资源請求占掉的抓取額度與带宽

多數人只盯着 HTML 頁面有没有被抓,很少留意同一批抓取里,蜘蛛還會去拿頁面引用的 CSS、JavaScript、图片和字体文件。這些资源不參與“收錄”,但會實實在在占用抓取額度、带宽和服務器连接數。

蜘蛛為什么要抓這些资源

搜尋引擎要判断頁面長什么样、内容是否完整,就需要把頁面渲染出来。渲染依赖样式表和脚本,所以抓取 HTML 之後,往往還會按頁面里的引用地址再去請求 CSS 和 JS。图片通常不是渲染必需,但在判断图片與頁面主题相關性、生成缩略图等场景下也可能被請求。

換句话说,一次“頁面抓取”在後端常常對應好几個 HTTP 請求。如果頁面引用了十几個资源,實际产生的請求量可能是頁面數的几倍。

资源抓取上常见的几個坑

  • 资源地址带參數或時間戳:每次發布都生成新地址,蜘蛛會当成新资源反复抓取,舊地址還留在记錄里。
  • CSS、JS 被 robots.txt 挡住:抓不到样式和脚本,渲染出来的頁面可能缺内容,判断容易出错。
  • 资源放在第三方域名:跨域請求由別人的服務器承担,但對方响應慢或做了限速,渲染就會被拖住。
  • 资源地址由脚本動態拼接:第一轮抓取时地址可能還不存在,回报 404,之後要靠重新發現。
  • 体积過大的打包文件:單個文件從几百 KB 到几 MB,抓取和渲染都要花更長時間。

從服務器日誌里看资源被抓的情况

在日誌里筛 css、js、png、jpg、woff 這類後缀,能看到资源被抓的次數和返回碼。几個判断点:

  1. 资源請求數遠大于 HTML 請求數,說明頁面里外鏈资源偏多,可以考虑合並或精简。
  2. 同一资源出現大量不同參數地址,多半是版本号或時間戳的寫法有問题。
  3. 资源返回 403、404 的比例偏高,說明有地址寫错,或者目錄被規則誤挡。
  4. 资源响應時間明顯高于 HTML,說明静態文件没有走缓存或 CDN。

服務器稳定性:叠加起来的那部分压力

资源請求通常比 HTML 更容易命中缓存,但如果站点没做静態资源缓存,每個請求都會打到源站。抓取高峰时,HTML 與资源請求叠在一起,连接數和带宽會同时上涨。表現往往是首字节變慢、静態文件偶尔超时,進而影响整站的抓取节奏。

比較稳的做法是把静態资源交给 CDN 或反向代理,設定合理的缓存头,让重复請求不落到源站。源站只處理真正需要動態計算的部分,抓取压力會平缓很多。

抓取額度是整站共享的。资源請求多了,留给新頁面和更新頁面的份額就少了,這是不少站点感觉“蜘蛛来得少了”却找不到原因的地方。

几條實用建议

  1. 给静態资源加版本号时用文件内容哈希,寫在文件名里,而不是每次都換查询參數。
  2. 確認 CSS、JS 不被 robots.txt 拦截,也別在资源目錄上誤加限制規則。
  3. 合並压缩脚本和样式,减少請求數量;图片按實际顯示尺寸輸出,別把大图缩着用。
  4. 静態资源统一走 CDN,源站日誌里就能干净地看出 HTML 的抓取情况。
  5. 定期看资源被抓的返回碼分布,把長期 404 的地址清理掉。

资源抓取本身不是問题,問题在于它是否被無意义地放大。把资源地址稳定下来、請求數量压下去、缓存扛住重复請求,蜘蛛花在整站上的時間才更划算。