Chrome UX Report (CrUX)
Google 维护的公开真实用户度量数据集,收集全球 Chrome 浏览器用户的实际性能数据,是 Core Web Vitals 和 Google 搜索排名的权威数据来源。
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
- GitHub:https://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/URL | REST 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 通过三个环节确保数据质量:
- 过滤(Filtering):如果某个 origin 超过 20% 的流量缺少有效维度组合,则整个 origin 被排除
- 模糊化(Fuzzing):注入轻微随机变化,防止逆向推断访问计数等敏感信息
- 精度调整(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 |
技术对比
| 特性 | CrUX | RUM 工具 | PageSpeed Insights | WebPageTest |
|---|---|---|---|---|
| 数据性质 | 真实用户(聚合) | 真实用户(会话级) | 实验室 + 真实 | 实验室 |
| 数据粒度 | Origin/URL 级 | 会话/用户级 | Origin/URL 级 | 单次测试 |
| 延迟 | 28 天滚动窗口 | 实时 | 28 天平均 | 即时 |
| 浏览器覆盖 | 仅 Chrome | 所有浏览器 | 仅 Chrome(Lighthouse) | 多浏览器 |
| 维度 | 设备 + 国家 | 任意自定义 | 设备(移动/桌面) | 位置 + 设备 |
| 费用 | 免费 | 通常付费 | 免费 | 免费 + 付费 |
| API 支持 | ✅ REST + BigQuery | 各异 | ✅ REST | ✅ REST |
| 可识别用户 | ❌ 匿名聚合 | ✅ 可追踪 | ❌ | ❌ |
| 搜索排名关联 | ✅ 直接关联 | ❌ | ✅ 直接 | ❌ |
CrUX vs RUM
| 维度 | CrUX | RUM |
|---|---|---|
| 用户群体 | 仅 Chrome(且需 opt-in) | 所有浏览器用户 |
| 数据粒度 | 聚合匿名 | 会话级可追踪 |
| 实时性 | 28 天延迟 | 近实时 |
| 自定义指标 | ❌ 固定指标 | ✅ 可自定义 |
| 维度 | 设备 + 国家 | 任意维度 |
| 用途 | 搜索排名基准 | 内部性能优化 |
| 数据所有权 | Google 所有 | 网站所有者 |
最佳实践
生产环境建议
- 优先使用 Materialized 表:
materialized.metrics_summary等预聚合表查询更快、成本更低 - 理解 p75 百分位:CrUX 使用 p75 百分位代表"典型用户体验",优化目标是让 p75 达标
- 同时关注移动端和桌面端:Google 搜索排名以移动端数据为主
- 定期监控趋势:每周查询 History API,追踪 Core Web Vitals 月度变化
- 结合实验室数据:用 Lighthouse 定位问题,用 CrUX 验证优化效果
- 注意数据延迟:优化上线后,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 完全替代
学习资源
官方文档
- CrUX 概览 - Chrome for Developers 官方文档
- CrUX API - REST API 参考
- CrUX History API - 历史数据查询
- CrUX BigQuery - BigQuery 数据集指南
- CrUX BigQuery 使用指南 - SQL 查询教程
- CrUX 方法论 - 数据采集和处理流程
- CrUX Release Notes - 更新日志
教程
- CrUX vs RUM 差异 - web.dev 官方文章
- DebugBear CrUX 详解 - 社区深度指南
- Core Web Vitals - 指标详解
社区资源
- Chrome UX Report Google Groups - 官方讨论组
- GoogleChrome/CrUX (GitHub) - 官方仓库
- treosh/crux-api (GitHub) - Node.js API 封装
- HTTP Archive CrUX 报告 - 趋势分析
2026 年现状
最新版本
- CrUX API:v1 稳定版,每日更新
- BigQuery 数据集:持续月度发布,最新为 2026 年 3 月(
202603) - CrUX Vis:2025 年从实验毕业,替代 CrUX Dashboard 成为官方可视化工具
发展趋势
- CrUX Vis 成为主流:替代已弃用的 CrUX Dashboard,提供更好的历史趋势可视化
- Chrome DevTools 集成:2025 年 3 月起 Performance 面板直接显示 CrUX 字段数据
- 数据覆盖持续扩大:截至 2026 年 3 月覆盖 1825 万+ origin
- LCP 分解指标:2025 年 1 月新增 LCP 图像子分解和资源类型数据
- RTT 替代 ECT:更细粒度的往返时间指标已完全替代旧的网络类型分类
- Soft Navigations API:将 Core Web Vitals 扩展到 SPA 客户端导航
数据生态
| 数据源 | 更新频率 | 数据范围 |
|---|---|---|
| BigQuery 月度表 | 每月第二个周二 | 当月全球原始数据 |
| CrUX API | 每日 | 28 天聚合数据 |
| CrUX History API | 每周一 | 最多 40 周历史 |
| CrUX Vis | 每周 | 历史趋势可视化 |