Chrome UX Report (CrUX) logo

Chrome UX Report (CrUX)

Google 维护的公开真实用户度量数据集,收集全球 Chrome 浏览器用户的实际性能数据,是 Core Web Vitals 和 Google 搜索排名的权威数据来源。

性能审计Web Vitals真实用户数据Core Web Vitals

Chrome UX Report(CrUX)是 Google 维护的公开数据集,收集来自全球数百万 Chrome 用户的真实性能数据。提供 REST API、BigQuery 和可下载数据集三种访问方式,覆盖超过 1825 万个 origin,是 Core Web Vitals 的权威数据来源。

Chrome UX Report (CrUX)

Google 维护的公开真实用户度量数据集,收集全球 Chrome 浏览器用户的实际性能数据,是 Core Web Vitals 和 Google 搜索排名的权威数据来源。

技术简介说明

Chrome UX Report(CrUX)是 Google 维护的一个公开数据集,收集来自全球数百万 Chrome 浏览器用户的真实性能数据。与 Lighthouse 和 WebPageTest 等合成测试工具不同,CrUX 的数据直接来自真实用户的浏览器——当用户启用了 Chrome 使用统计并同步浏览历史时,页面加载和交互的性能数据会被匿名化采集并汇总到 CrUX 数据集中。

CrUX 是 Core Web Vitals 的权威数据来源,直接影响 Google 搜索排名。Google Search Console 中展示的 Core Web Vitals 数据、PageSpeed Insights 中的"真实用户数据"部分,以及 BigQuery 上的公开数据集,都源自 CrUX。截至 2026 年 3 月,CrUX 覆盖超过 1825 万个 origin,每月更新。

CrUX 提供三种访问方式:REST API(查询单个 origin/URL 的聚合数据)、BigQuery(支持复杂 SQL 查询的海量数据集)、以及可下载的数据集。对于需要理解真实用户体验、优化搜索排名、进行竞品性能对比的团队,CrUX 是不可或缺的数据来源。

基本信息

  • 官网https://developer.chrome.com/docs/crux
  • GitHubhttps://github.com/GoogleChrome/CrUX
  • License:数据集为公开数据(CC BY 4.0),工具为 Apache-2.0
  • API 版本:v1(当前稳定版)
  • 主要维护者/公司:Google Chrome 团队
  • 数据更新频率:BigQuery 月度更新(每月第二个周二),API 每周更新
  • 数据覆盖:1825 万+ origin(截至 2026 年 3 月)
  • 数据窗口:滚动 28 天

快速上手

安装

CrUX 不需要本地安装。有三种数据访问方式:

方式一:CrUX API(REST API)

# 获取 API Key
# 访问 https://console.cloud.google.com/ → 启用 CrUX API → 创建 API Key
 
# 无需安装,直接使用 curl 或 HTTP 客户端

方式二:BigQuery

# 需要 Google Cloud 项目(免费额度 1TB/月)
# 访问 https://console.cloud.google.com/bigquery
 
# 或使用 Google Cloud CLI
npm install @google-cloud/bigquery  # Node.js 客户端
pip install google-cloud-bigquery    # Python 客户端

方式三:可下载数据集

# GitHub 上的热门站点列表
git clone https://github.com/zakird/crux-top-lists.git
 
# Kaggle 镜像
# https://www.kaggle.com/datasets/bigquery/chrome-user-experience-report

基础配置

API 请求格式

POST https://chromeuxreport.googleapis.com/v1/records:queryRecord?key=YOUR_API_KEY
Content-Type: application/json

{
  "origin": "https://example.com",
  "formFactor": "PHONE"
}

最小示例

API 查询(cURL)

# 查询 origin 级别数据
curl -X POST \
  "https://chromeuxreport.googleapis.com/v1/records:queryRecord?key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "origin": "https://example.com"
  }'
 
# 查询 URL 级别数据(需要足够流量)
curl -X POST \
  "https://chromeuxreport.googleapis.com/v1/records:queryRecord?key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/page",
    "formFactor": "PHONE"
  }'
 
# 查询历史时间序列
curl -X POST \
  "https://chromeuxreport.googleapis.com/v1/records:queryRecord?key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "origin": "https://example.com",
    "collectionPeriodCount": 12
  }'

API 响应解析(Node.js)

import fetch from 'node-fetch';
 
const CRUX_API = 'https://chromeuxreport.googleapis.com/v1/records:queryRecord';
const API_KEY = process.env.CRUX_API_KEY;
 
async function getCruxData(origin, formFactor = 'PHONE') {
  const response = await fetch(`${CRUX_API}?key=${API_KEY}`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ origin, formFactor }),
  });
 
  const data = await response.json();
  const record = data.record;
 
  if (!record) {
    console.log(`No CrUX data for ${origin}`);
    return null;
  }
 
  // 提取 Core Web Vitals(p75 百分位)
  const metrics = {
    origin: record.key.origin,
    formFactor: formFactor,
    collectionPeriod: record.metrics.LARGEST_CONTENTFUL_PAINT?.collectionPeriod,
    lcp: {
      p75: record.metrics.LARGEST_CONTENTFUL_PAINT?.percentiles?.p75,
      good: record.metrics.LARGEST_CONTENTFUL_PAINT?.histogram?.[0]?.density,
      needsImprovement: record.metrics.LARGEST_CONTENTFUL_PAINT?.histogram?.[1]?.density,
      poor: record.metrics.LARGEST_CONTENTFUL_PAINT?.histogram?.[2]?.density,
    },
    inp: {
      p75: record.metrics.INTERACTION_TO_NEXT_PAINT?.percentiles?.p75,
    },
    cls: {
      p75: record.metrics.CUMULATIVE_LAYOUT_SHIFT?.percentiles?.p75,
    },
    fcp: {
      p75: record.metrics.FIRST_CONTENTFUL_PAINT?.percentiles?.p75,
    },
  };
 
  // 判断 CWV 是否通过
  const passesCWV =
    metrics.lcp.p75 <= 2500 &&
    metrics.inp.p75 <= 200 &&
    metrics.cls.p75 <= 0.1;
 
  return { ...metrics, passesCWV };
}
 
getCruxData('https://example.com').then(console.log);

BigQuery 查询示例

-- 查询特定 origin 的 Core Web Vitals(使用 Materialized 表,推荐)
SELECT
  origin,
  form_factor,
  yyyymm,
  p75_largest_contentful_paint AS lcp_p75,
  p75_interaction_to_next_paint AS inp_p75,
  p75_cumulative_layout_shift AS cls_p75,
  p75_first_contentful_paint AS fcp_p75
FROM `chrome-ux-report.materialized.metrics_summary`
WHERE origin = 'https://example.com'
ORDER BY yyyymm DESC
LIMIT 12;
 
-- 查询唯一网站数量
SELECT COUNT(DISTINCT origin) AS total_origins
FROM `chrome-ux-report.all.202603`;
 
-- 计算 Good LCP 比例
SELECT
  origin,
  SUM(IF(bin.start <= 2500, bin.density, 0)) AS good_lcp_ratio
FROM `chrome-ux-report.all.202603`,
  UNNEST(largest_contentful_paint.histogram.bin) AS bin
WHERE origin = 'https://example.com'
  AND form_factor.name = 'phone'
GROUP BY origin;
 
-- 跨月份趋势分析
SELECT
  _TABLE_SUFFIX AS month,
  SUM(IF(bin.start <= 2500, bin.density, 0)) AS good_lcp_ratio,
  SUM(IF(bin.start <= 4000 AND bin.start > 2500, bin.density, 0)) AS ni_lcp_ratio
FROM `chrome-ux-report.all.*`,
  UNNEST(largest_contentful_paint.histogram.bin) AS bin
WHERE origin = 'https://example.com'
  AND form_factor.name = 'phone'
  AND _TABLE_SUFFIX BETWEEN '202501' AND '202603'
GROUP BY month
ORDER BY month;
 
-- 按国家对比
SELECT
  country_code,
  p75_largest_contentful_paint AS lcp_p75,
  p75_cumulative_layout_shift AS cls_p75
FROM `chrome-ux-report.materialized.country_summary`
WHERE origin = 'https://example.com'
  AND yyyymm = '202603'
ORDER BY lcp_p75 ASC;

核心概念与架构

数据采集流程

Chrome 用户浏览网页
    ↓
用户启用使用统计 + 同步浏览历史
    ↓
Chrome 采集页面性能数据(LCP、INP、CLS、FCP 等)
    ↓
数据上传到 Google(匿名化)
    ↓
数据处理管线
    ├── 过滤(过滤无效维度组合 > 20% 的 origin)
    ├── 模糊化(注入随机噪声,防止逆向推断)
    └── 精度调整(细分直方图 bins)
    ↓
存储到 BigQuery / API
    ↓
按月发布(BigQuery)/ 每周更新(API)

数据源

数据源更新频率数据范围访问方式
BigQuery 月度表每月第二个周二当月全球数据SQL 查询
BigQuery 国家级表每月第二个周二按国家分组SQL 查询
BigQuery Materialized 表每月第二个周二预聚合汇总SQL 查询(推荐)
CrUX API(当前记录)每日更新单个 origin/URLREST API
CrUX History API每周一最多 40 周历史REST API
可下载数据集不定期热门站点 CSV文件下载

BigQuery 表结构

表名说明推荐度
chrome-ux-report.all.YYYYMM月度全球原始数据⭐⭐ 复杂查询
chrome-ux-report.country_CC.YYYYMM按国家分组⭐⭐ 区域分析
chrome-ux-report.materialized.metrics_summary关键指标汇总⭐⭐⭐ 推荐首选
chrome-ux-report.materialized.device_summary按设备分组⭐⭐⭐ 设备对比
chrome-ux-report.materialized.country_summary国家级汇总⭐⭐⭐ 国家对比
chrome-ux-report.experimental.global合并所有月份⭐⭐ 趋势分析

数据质量保障

CrUX 通过三个环节确保数据质量:

  1. 过滤(Filtering):如果某个 origin 超过 20% 的流量缺少有效维度组合,则整个 origin 被排除
  2. 模糊化(Fuzzing):注入轻微随机变化,防止逆向推断访问计数等敏感信息
  3. 精度调整(Precision):将直方图大区间细分为均匀、更窄的分段

核心特性

  • 📊 真实用户数据:来自全球数百万 Chrome 用户的实际浏览体验数据
  • 🔍 Origin 和 URL 级别查询:支持查询整个 origin 或特定 URL 的数据
  • 📱 多维度分析:按设备类型(phone/tablet/desktop)、国家/地区分组
  • 📈 历史时间序列:History API 提供最多 40 周的历史趋势数据
  • 🗄️ BigQuery 公开数据集:每月 1TB 免费查询额度,支持复杂 SQL 分析
  • 🎯 Core Web Vitals 直接支持:LCP、INP、CLS 的 p75 百分位直接可用
  • 🔗 Materialized 表:预聚合汇总表,查询更高效、成本更低
  • 🌍 国家级数据:按国家/地区分组的独立数据集
  • 📅 采集周期透明:显示具体的数据采集日期范围
  • 🆓 免费使用:API 和 BigQuery 均有免费额度

生态图

Chrome UX Report 生态系统
│
├── 数据访问层
│   ├── CrUX API(REST)
│   ├── CrUX History API
│   ├── BigQuery 公开数据集
│   └── 可下载 CSV 数据集
│
├── 可视化与工具
│   ├── CrUX Vis(原 CrUX Dashboard 替代,2025 年毕业)
│   ├── PageSpeed Insights(展示 CrUX 字段数据)
│   ├── Search Console(CWV 报告)
│   ├── Chrome DevTools Performance 面板(2025 年集成 CrUX 数据)
│   └── treosh/crux-api(Node.js 封装)
│
├── 社区工具
│   ├── DebugBear CrUX 分析
│   ├── HTTP Archive CrUX 报告
│   └── 各种 RUM 集成方案
│
└── 底层引擎
    ├── Chrome 使用统计采集
    ├── 数据处理管线(过滤/模糊化/精度调整)
    └── BigQuery 存储与发布

适用场景

  • 📊 搜索排名优化:了解 Core Web Vitals 真实表现,确保满足 Google 搜索排名要求
  • 🔍 竞品性能对比:查询竞品的 CrUX 数据,进行跨站点性能对标分析
  • 📈 趋势监控:通过 History API 追踪 Core Web Vitals 的月度变化趋势
  • 🌍 区域性能分析:按国家/地区维度分析不同区域的用户体验差异
  • 📱 设备对比:对比移动端、平板、桌面端的性能差异
  • 🏗️ 优化效果验证:优化上线后,通过 CrUX 数据验证真实用户体验是否改善
  • 📋 性能报告:使用 Materialized 表生成定期性能报告

开发与工程化

自动化监控服务

// CrUX 定期监控
import fetch from 'node-fetch';
 
const CRUX_API = 'https://chromeuxreport.googleapis.com/v1/records:queryRecord';
const API_KEY = process.env.CRUX_API_KEY;
 
const monitoredOrigins = [
  'https://example.com',
  'https://example.com/blog',
  'https://example.com/shop',
];
 
async function monitorCrux() {
  const results = [];
 
  for (const origin of monitoredOrigins) {
    for (const formFactor of ['PHONE', 'DESKTOP']) {
      const data = await queryCrux(origin, formFactor);
      if (data) {
        results.push(data);
      }
    }
  }
 
  // 检查 CWV 通过情况
  const report = results.map(r => ({
    origin: r.origin,
    formFactor: r.formFactor,
    passesLCP: r.lcp?.p75 <= 2500,
    passesINP: r.inp?.p75 <= 200,
    passesCLS: r.cls?.p75 <= 0.1,
    passesCWV: r.passesCWV,
  }));
 
  return report;
}
 
async function queryCrux(origin, formFactor) {
  try {
    const response = await fetch(`${CRUX_API}?key=${API_KEY}`, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ origin, formFactor }),
    });
 
    const data = await response.json();
    if (!data.record) return null;
 
    const m = data.record.metrics;
    return {
      origin: data.record.key.origin,
      formFactor,
      lcp: { p75: m.LARGEST_CONTENTFUL_PAINT?.percentiles?.p75 },
      inp: { p75: m.INTERACTION_TO_NEXT_PAINT?.percentiles?.p75 },
      cls: { p75: m.CUMULATIVE_LAYOUT_SHIFT?.percentiles?.p75 },
      fcp: { p75: m.FIRST_CONTENTFUL_PAINT?.percentiles?.p75 },
      passesCWV:
        m.LARGEST_CONTENTFUL_PAINT?.percentiles?.p75 <= 2500 &&
        m.INTERACTION_TO_NEXT_PAINT?.percentiles?.p75 <= 200 &&
        m.CUMULATIVE_LAYOUT_SHIFT?.percentiles?.p75 <= 0.1,
    };
  } catch (error) {
    console.error(`Failed to query CrUX for ${origin}:`, error.message);
    return null;
  }
}

BigQuery 自动报表

-- 月度 CWV 趋势报表(Materialized 表)
WITH monthly_cwv AS (
  SELECT
    origin,
    yyyymm,
    p75_largest_contentful_paint AS lcp,
    p75_interaction_to_next_paint AS inp,
    p75_cumulative_layout_shift AS cls,
    CASE
      WHEN p75_largest_contentful_paint <= 2500
        AND p75_interaction_to_next_paint <= 200
        AND p75_cumulative_layout_shift <= 0.1
      THEN TRUE ELSE FALSE
    END AS passes_cwv
  FROM `chrome-ux-report.materialized.metrics_summary`
  WHERE origin IN ('https://example.com', 'https://competitor.com')
    AND yyyymm >= '202501'
)
SELECT
  origin,
  yyyymm,
  lcp,
  inp,
  cls,
  passes_cwv,
  CASE
    WHEN lcp <= 2500 THEN 'Good'
    WHEN lcp <= 4000 THEN 'NI'
    ELSE 'Poor'
  END AS lcp_rating
FROM monthly_cwv
ORDER BY origin, yyyymm;

CI/CD 集成

# 每周监控 CrUX 数据
name: CrUX Weekly Check
on:
  schedule:
    - cron: '0 9 * * 1'  # 每周一 9:00
 
jobs:
  crux-check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
 
      - name: Query CrUX Data
        env:
          CRUX_API_KEY: ${{ secrets.CRUX_API_KEY }}
        run: |
          curl -X POST \
            "https://chromeuxreport.googleapis.com/v1/records:queryRecord?key=$CRUX_API_KEY" \
            -H "Content-Type: application/json" \
            -d '{"origin": "https://example.com", "formFactor": "PHONE"}' \
            -o crux-result.json
 
          LCP=$(jq '.record.metrics.LARGEST_CONTENTFUL_PAINT.percentiles.p75' crux-result.json)
          echo "LCP p75: ${LCP}ms"
 
          if [ "$LCP" -gt 2500 ]; then
            echo "::warning::LCP exceeds 2500ms threshold"
          fi

性能与安全

性能特点

  • API 响应时间:通常 < 500ms
  • BigQuery 查询:Materialized 表查询通常 < 10 秒;原始表复杂查询可能 30-60 秒
  • BigQuery 免费额度:每月 1TB(Materialized 表可显著降低查询成本)

安全注意事项

  • API Key 应存储在环境变量中,使用 IAM 角色优于静态 Key
  • BigQuery 需要 Google Cloud 项目(需信用卡验证)
  • CrUX 数据已经过匿名化处理,不含可识别用户信息
  • 模糊化数据意味着精确数值有轻微偏差

速率限制

限制类型
API 请求频率150 次/分钟/项目
BigQuery 免费额度1TB/月
BigQuery 并发查询默认 100

技术对比

特性CrUXRUM 工具PageSpeed InsightsWebPageTest
数据性质真实用户(聚合)真实用户(会话级)实验室 + 真实实验室
数据粒度Origin/URL 级会话/用户级Origin/URL 级单次测试
延迟28 天滚动窗口实时28 天平均即时
浏览器覆盖仅 Chrome所有浏览器仅 Chrome(Lighthouse)多浏览器
维度设备 + 国家任意自定义设备(移动/桌面)位置 + 设备
费用免费通常付费免费免费 + 付费
API 支持✅ REST + BigQuery各异✅ REST✅ REST
可识别用户❌ 匿名聚合✅ 可追踪
搜索排名关联✅ 直接关联✅ 直接

CrUX vs RUM

维度CrUXRUM
用户群体仅 Chrome(且需 opt-in)所有浏览器用户
数据粒度聚合匿名会话级可追踪
实时性28 天延迟近实时
自定义指标❌ 固定指标✅ 可自定义
维度设备 + 国家任意维度
用途搜索排名基准内部性能优化
数据所有权Google 所有网站所有者

最佳实践

生产环境建议

  1. 优先使用 Materialized 表materialized.metrics_summary 等预聚合表查询更快、成本更低
  2. 理解 p75 百分位:CrUX 使用 p75 百分位代表"典型用户体验",优化目标是让 p75 达标
  3. 同时关注移动端和桌面端:Google 搜索排名以移动端数据为主
  4. 定期监控趋势:每周查询 History API,追踪 Core Web Vitals 月度变化
  5. 结合实验室数据:用 Lighthouse 定位问题,用 CrUX 验证优化效果
  6. 注意数据延迟:优化上线后,CrUX 数据需要数天到数周才能反映变化

常见陷阱

  • 混淆 CrUX 与 RUM:CrUX 仅覆盖 Chrome opt-in 用户,不等于全站真实用户
  • 忽略模糊化影响:CrUX 数据经过模糊化处理,精确数值有轻微偏差
  • 期望新页面立即有数据:新页面需要足够流量才会被纳入 CrUX
  • 只看整体数据:应分别关注移动端和桌面端,移动端通常更差
  • 使用原始表而非 Materialized 表:原始表查询成本高,Materialized 表更经济

推荐模式

  • 快速检查:CrUX API 查询单个 origin/URL 的 CWV 状态
  • 深度分析:BigQuery SQL 查询多维度数据分布和趋势
  • 可视化:CrUX Vis 查看历史趋势图
  • 自动化监控:定期脚本调用 API,检测 CWV 退化
  • 竞品分析:BigQuery 批量查询竞品 origin 进行对比

技术局限与边界

已知限制

局限详细说明
仅 Chrome 数据不包含 iOS Chrome、Safari、Firefox、Edge 等浏览器
需要 opt-in仅收集启用了使用统计并同步历史的用户数据
低流量无数据流量不足的 origin 可能完全没有数据
聚合匿名无法追踪到具体用户或会话
固定指标不能添加自定义度量指标
数据延迟28 天滚动窗口 + 月度发布,无法反映即时变化
URL 归一化查询参数和片段被剥离,可能合并不同页面
iframe 不独立分析iframe 内容影响主页面指标但不单独报告
无法手动提交网站所有者无法强制将页面纳入数据集
地域偏差Chrome 用户分布可能与真实用户分布不匹配

不适用场景

  • 需要实时性能数据(应使用 RUM 工具)
  • 需要跨浏览器性能对比(CrUX 仅覆盖 Chrome)
  • 需要会话级别诊断(应使用 RUM 或应用性能管理工具)
  • 需要自定义指标追踪(应使用 RUM)
  • 新上线或极低流量页面(可能没有数据)

2025 年重要变更

  • CrUX Dashboard 已弃用(2025 年 11 月后停用),替代为 CrUX Vis
  • ECT 维度已移除:Effective Connection Type 从 BigQuery 和 API 中移除,被更细粒度的 RTT p75 替代
  • FID 已移除:First Input Delay 于 2024 年 9 月从 CrUX 中移除,被 INP 完全替代

学习资源

官方文档

教程

社区资源

2026 年现状

最新版本

  • CrUX API:v1 稳定版,每日更新
  • BigQuery 数据集:持续月度发布,最新为 2026 年 3 月(202603
  • CrUX Vis:2025 年从实验毕业,替代 CrUX Dashboard 成为官方可视化工具

发展趋势

  1. CrUX Vis 成为主流:替代已弃用的 CrUX Dashboard,提供更好的历史趋势可视化
  2. Chrome DevTools 集成:2025 年 3 月起 Performance 面板直接显示 CrUX 字段数据
  3. 数据覆盖持续扩大:截至 2026 年 3 月覆盖 1825 万+ origin
  4. LCP 分解指标:2025 年 1 月新增 LCP 图像子分解和资源类型数据
  5. RTT 替代 ECT:更细粒度的往返时间指标已完全替代旧的网络类型分类
  6. Soft Navigations API:将 Core Web Vitals 扩展到 SPA 客户端导航

数据生态

数据源更新频率数据范围
BigQuery 月度表每月第二个周二当月全球原始数据
CrUX API每日28 天聚合数据
CrUX History API每周一最多 40 周历史
CrUX Vis每周历史趋势可视化