PageSpeed Insights
Google 提供的免费在线页面速度分析工具,结合 Lighthouse 实验室数据和 Chrome 真实用户数据(CrUX),提供全面的网页性能评估。
PageSpeed Insights(PSI)是 Google 面向 Web 开发者和站长的免费性能分析服务,同时展示实验室数据(Lighthouse)和真实用户数据(CrUX),直接影响 Google 搜索排名,是 Web 性能优化的"标准答案"工具。
PageSpeed Insights
Google 提供的免费在线页面速度分析工具,结合 Lighthouse 实验室数据和 Chrome 真实用户数据(CrUX),提供全面的网页性能评估。
技术简介说明
PageSpeed Insights(PSI)是 Google 面向 Web 开发者和站长的免费性能分析服务。与 Lighthouse 仅提供实验室(合成)数据不同,PSI 的独特价值在于它同时展示实验室数据(Lab Data)和真实用户数据(Field Data)。实验室数据通过 Lighthouse 在受控环境中运行审计获得;真实用户数据则来自 Chrome UX Report(CrUX),反映真实 Chrome 用户在过去 28 天内访问该页面的体验。
PSI 不仅提供性能评分和优化建议,还直接影响 Google 搜索排名——因为 Core Web Vitals 是 Google 搜索排名因素之一,而 PSI 正是衡量这些指标的官方工具。2025 年底,PSI 升级至 Lighthouse 13.0 引擎,引入了全新的 Performance Insights 诊断体系。
作为 Web 性能优化的"标准答案"工具,PSI 帮助开发者回答一个核心问题:我的网站在真实用户眼中表现如何? 这对于理解性能优化的实际业务影响至关重要。
基本信息
- 官网:https://pagespeed.web.dev/
- API 文档:https://developers.google.com/speed/docs/insights/about
- API 端点:
https://www.googleapis.com/pagespeedonline/v5/runPagespeed - License:免费使用(API 需 Google Cloud 项目,免费配额 25,000 次/天)
- 底层引擎:Lighthouse 13.0(2025 年 10 月起)
- 主要维护者/公司:Google
- 数据更新频率:真实用户数据每月更新(CrUX 月度数据集)
快速上手
安装
PSI 主要通过 Web 界面和 REST API 使用,无需安装本地软件。
Web 界面
- 访问 https://pagespeed.web.dev/ 输入 URL 即可使用
API 客户端安装
# Node.js API 客户端
npm install googleapis
# Python 客户端
pip install google-api-python-client
# 或使用简单的 HTTP 请求(无需 SDK)
curl "https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=https://example.com"基础配置
API 请求参数
GET https://www.googleapis.com/pagespeedonline/v5/runPagespeed
参数:
- url (必填): 要分析的页面 URL
- strategy (可选): mobile | desktop,默认 mobile
- category (可选): performance | accessibility | best-practices | seo | pwa
- locale (可选): 报告语言,如 zh-CN
- utm_source (可选): 用于追踪来源
获取 API Key
- 访问 Google Cloud Console
- 创建项目或选择已有项目
- 启用 "PageSpeed Insights API"
- 创建 API 密钥(Credentials → Create Credentials → API Key)
最小示例
cURL 请求
# 基础请求
curl "https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=https://example.com&strategy=mobile"
# 使用 API Key
curl "https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=https://example.com&strategy=mobile&key=YOUR_API_KEY"
# 指定类别
curl "https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=https://example.com&category=performance&category=seo"Node.js 示例
import fetch from 'node-fetch';
const PSI_API = 'https://www.googleapis.com/pagespeedonline/v5/runPagespeed';
async function analyzePage(url, strategy = 'mobile') {
const params = new URLSearchParams({
url,
strategy,
category: 'performance',
});
const response = await fetch(`${PSI_API}?${params}`);
const data = await response.json();
// 性能分数
const perfScore = data.lighthouseResult?.categories?.performance?.score;
console.log(`Performance Score: ${(perfScore * 100).toFixed(0)}`);
// Core Web Vitals(实验室数据)
const audits = data.lighthouseResult?.audits;
console.log(`LCP: ${audits['largest-contentful-paint']?.displayValue}`);
console.log(`CLS: ${audits['cumulative-layout-shift']?.displayValue}`);
console.log(`TBT: ${audits['total-blocking-time']?.displayValue}`);
// 真实用户数据(Field Data)
const fieldData = data.loadingExperience?.metrics;
if (fieldData) {
console.log(`Real-user LCP: ${fieldData.LARGEST_CONTENTFUL_PAINT?.percentile}ms`);
console.log(`Real-user INP: ${fieldData.INTERACTION_TO_NEXT_PAINT?.percentile}ms`);
console.log(`Real-user CLS: ${fieldData.CUMULATIVE_LAYOUT_SHIFT?.percentile}`);
}
return data;
}
analyzePage('https://example.com');批量分析脚本
import fetch from 'node-fetch';
const PSI_API = 'https://www.googleapis.com/pagespeedonline/v5/runPagespeed';
const API_KEY = process.env.PSI_API_KEY;
const DELAY_MS = 5000; // 避免触发限频
const urls = [
'https://example.com/',
'https://example.com/about',
'https://example.com/blog',
];
async function batchAnalyze(urls) {
const results = [];
for (const url of urls) {
console.log(`Analyzing: ${url}`);
const params = new URLSearchParams({
url,
strategy: 'mobile',
category: 'performance',
key: API_KEY,
});
try {
const response = await fetch(`${PSI_API}?${params}`);
const data = await response.json();
const score = data.lighthouseResult?.categories?.performance?.score;
results.push({ url, score: Math.round(score * 100) });
} catch (error) {
console.error(`Error analyzing ${url}:`, error.message);
results.push({ url, score: null, error: error.message });
}
// 请求间隔,避免限频
await new Promise(resolve => setTimeout(resolve, DELAY_MS));
}
return results;
}
batchAnalyze(urls).then(console.log);核心概念与架构
数据双源模型
PageSpeed Insights
│
├── 实验室数据(Lab Data)
│ ├── 来源:Lighthouse 引擎
│ ├── 环境:受控模拟(中低端移动设备 + 4G 网络)
│ ├── 用途:诊断性能瓶颈,获取优化建议
│ └── 特点:可复现,但不代表真实用户体验
│
└── 真实用户数据(Field Data)
├── 来源:Chrome UX Report(CrUX)
├── 环境:真实 Chrome 用户的实际浏览体验
├── 窗口:过去 28 天的数据
├── 用途:反映真实用户体验,影响搜索排名
└── 特点:不可控,但代表真实世界表现
Core Web Vitals 指标
| 指标 | 全称 | 良好阈值 | 需改进 | 差 |
|---|---|---|---|---|
| LCP | Largest Contentful Paint | ≤ 2.5s | 2.5s–4.0s | > 4.0s |
| INP | Interaction to Next Paint | ≤ 200ms | 200ms–500ms | > 500ms |
| CLS | Cumulative Layout Shift | ≤ 0.1 | 0.1–0.25 | > 0.25 |
注意:FID(First Input Delay)已于 2024 年被 INP 取代。
Mobile vs Desktop 差异
| 维度 | Mobile(默认) | Desktop |
|---|---|---|
| 设备模拟 | Moto G Power(中低端) | 标准桌面 |
| 网络节流 | 4G(150ms RTT, 1.6Mbps 下行) | 无节流 |
| CPU 节流 | 4x slowdown | 无节流 |
| 视口 | 360×640 | 1350×940 |
| 分数差异 | 通常更低 | 通常更高 |
API 响应结构
{
"captchaResult": "NO_CAPTCHA",
"kind": "pagespeedonline#pagespeedApiRunningResult",
"lighthouseResult": { ... }, // Lighthouse 实验室数据
"loadingExperience": { ... }, // 真实用户体验数据
"originLoadingExperience": { ... }, // 站点级别真实数据
"analysisUTCTimestamp": "...",
"version": { "major": 5, "minor": 0 }
}核心特性
- 📊 双源数据:同时展示实验室数据(Lighthouse)和真实用户数据(CrUX),提供完整性能画面
- 🔍 性能诊断:基于 Lighthouse 13.0 引擎的 Performance Insights 诊断体系
- 📱 移动/桌面分析:分别提供移动端和桌面端性能评估
- 🌐 Core Web Vitals 报告:直接展示影响 Google 搜索排名的核心指标
- 📈 历史趋势:Web 界面展示真实用户数据的历史变化趋势
- 🔗 结构化数据:JSON API 返回完整的审计结果,支持程序化分析
- 🆓 免费额度:每天 25,000 次 API 请求免费
- 🌍 全球数据:真实用户数据来自全球 Chrome 用户,覆盖多种设备和网络条件
- ⚡ 快速响应:单次分析通常 10-30 秒完成
生态图
PageSpeed Insights 生态系统
│
├── Web 界面
│ └── https://pagespeed.web.dev/
│
├── REST API (v5)
│ ├── 端点: pagespeedonline/v5/runPagespeed
│ ├── 免费配额: 25,000 次/天
│ └── 支持: 多类别、策略、语言参数
│
├── 底层技术
│ ├── Lighthouse(实验室引擎)
│ ├── Chrome UX Report(真实用户数据)
│ └── HTTP Archive(评分基准)
│
├── 集成生态
│ ├── Google Search Console(搜索排名关联)
│ ├── Treo / Calibre(商业监控,调用 PSI API)
│ ├── Lighthouse CI(本地审计替代方案)
│ └── 各种 WordPress / CMS 插件
│
└── 数据发布
├── CrUX BigQuery 数据集(月度更新)
├── CrUX API
└── CrUX Dashboard(已弃用,替代为 CrUX Vis)
适用场景
- 🚀 快速性能检查:无需安装任何工具,在浏览器中打开 PSI 输入 URL 即可查看性能报告
- 📊 搜索排名优化:了解 Core Web Vitals 表现,确保页面满足 Google 搜索排名要求
- 🔍 实验室 vs 真实对比:发现实验室数据与真实用户体验之间的差距,定位"假性能问题"
- 📈 定期性能监控:通过 API 定期采集分数,追踪性能优化趋势
- 🏗️ CI/CD 集成:在部署流水线中调用 API,自动验证页面性能是否达标
- 🌐 多页面批量审计:批量分析整个网站的关键页面,识别性能洼地
- 📱 移动端性能评估:默认移动端模拟,评估移动用户体验
开发与工程化
CI/CD 集成
# GitHub Actions 示例
name: PageSpeed Insights Check
on:
schedule:
- cron: '0 0 * * 1' # 每周一运行
workflow_dispatch:
jobs:
pagespeed:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run PageSpeed Insights
env:
PSI_API_KEY: ${{ secrets.PSI_API_KEY }}
run: |
URLS="https://example.com https://example.com/about"
for url in $URLS; do
SCORE=$(curl -s \
"https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=$url&strategy=mobile&category=performance&key=$PSI_API_KEY" \
| jq '.lighthouseResult.categories.performance.score * 100')
echo "URL: $url | Score: $SCORE"
if (( $(echo "$SCORE < 80" | bc -l) )); then
echo "::warning::Performance score below 80 for $url"
fi
done自动化监控脚本
// 性能监控服务
import fetch from 'node-fetch';
class PSIMonitor {
constructor(apiKey) {
this.apiKey = apiKey;
this.baseUrl = 'https://www.googleapis.com/pagespeedonline/v5/runPagespeed';
}
async check(url, strategy = 'mobile') {
const params = new URLSearchParams({
url,
strategy,
category: 'performance',
key: this.apiKey,
});
const response = await fetch(`${this.baseUrl}?${params}`);
if (!response.ok) {
throw new Error(`PSI API error: ${response.status}`);
}
const data = await response.json();
return {
url,
strategy,
timestamp: new Date().toISOString(),
performanceScore: data.lighthouseResult?.categories?.performance?.score,
labMetrics: this.extractLabMetrics(data),
fieldMetrics: this.extractFieldMetrics(data),
};
}
extractLabMetrics(data) {
const audits = data.lighthouseResult?.audits || {};
return {
lcp: audits['largest-contentful-paint']?.numericValue,
tbt: audits['total-blocking-time']?.numericValue,
cls: audits['cumulative-layout-shift']?.numericValue,
fcp: audits['first-contentful-paint']?.numericValue,
si: audits['speed-index']?.numericValue,
};
}
extractFieldMetrics(data) {
const metrics = data.loadingExperience?.metrics || {};
return {
lcp: metrics.LARGEST_CONTENTFUL_PAINT?.percentile,
inp: metrics.INTERACTION_TO_NEXT_PAINT?.percentile,
cls: metrics.CUMULATIVE_LAYOUT_SHIFT?.percentile,
};
}
}性能预算管理
// 定义性能预算
const budgets = {
'/': { minScore: 90, maxLCP: 2500, maxCLS: 0.1 },
'/blog/*': { minScore: 80, maxLCP: 3000, maxCLS: 0.15 },
'/admin/*': { minScore: 70, maxLCP: 4000, maxCLS: 0.2 },
};
// 检查性能预算
function checkBudget(path, results) {
const budget = budgets[path] || budgets['/*'];
const violations = [];
if (results.performanceScore * 100 < budget.minScore) {
violations.push(`Score ${results.performanceScore * 100} < ${budget.minScore}`);
}
if (results.labMetrics.lcp > budget.maxLCP) {
violations.push(`LCP ${results.labMetrics.lcp}ms > ${budget.maxLCP}ms`);
}
return violations;
}性能与安全
性能特点
- 响应时间:单次 API 请求约 10-30 秒
- 并发限制:约 240 请求/4 分钟(~1 QPS)
- 每日配额:25,000 次/天(免费)
限频策略
| 限制类型 | 值 | 说明 |
|---|---|---|
| 每日请求数 | 25,000 | 超出后返回 429 |
| 每 100 秒请求数 | 100 | 短时突发限制 |
| 每 4 分钟请求数 | ~240 | 隐含限制 |
安全注意事项
- API Key 应存储在环境变量中,不要硬编码或提交到代码仓库
- 建议为 API Key 设置 HTTP referrer 限制
- 避免在前端代码中暴露 API Key
- 大量请求建议使用 Google Cloud 服务账号认证
已知性能瓶颈
- 频繁调用可能触发限频(429 错误),需实现指数退避重试
- 新上线或低流量页面可能没有真实用户数据
- API 响应时间可能因 Google 服务端负载波动
技术对比
| 特性 | PageSpeed Insights | Lighthouse(本地) | WebPageTest | GTmetrix |
|---|---|---|---|---|
| 数据来源 | 实验室 + 真实用户 | 仅实验室 | 仅实验室 | 仅实验室 |
| 费用 | 免费 | 免费开源 | 免费 + 付费 | 免费 + 付费 |
| 全球测试点 | ✅(CrUX 全球数据) | ❌ 本地单点 | ✅ 多节点 | ✅ 多区域 |
| API 支持 | ✅ REST API | ✅ Node.js API | ✅ REST API | ✅ API |
| CI/CD 集成 | ✅ API 调用 | ✅ 原生 LHCI | ✅ API | ✅ 有限 |
| 搜索排名关联 | ✅ 直接关联 | ❌ 间接 | ❌ | ❌ |
| 历史趋势 | ✅ Web 界面 | ❌ 需 CI Server | ✅ | ✅ |
| 自定义程度 | 低 | 极高 | 高 | 中等 |
| 离线使用 | ❌ | ✅ | ❌ | ❌ |
| 真实用户数据 | ✅ CrUX | ❌ | ❌ | ❌ |
PSI vs Lighthouse 分数差异
- PSI 分数通常高于本地 Lighthouse:因为真实用户通常拥有更好的设备和网络
- PSI 分数低于本地 Lighthouse 的情况:当页面有大量真实用户(包括低端设备用户)时
- 关键区别:PSI 的真实用户数据反映的是过去 28 天的整体体验,不是单次测试结果
最佳实践
生产环境建议
- 双数据源验证:同时关注实验室数据和真实用户数据,实验室数据用于定位问题,真实数据用于评估实际影响
- 优先级排序:以真实用户数据为主(影响搜索排名),实验室数据为辅(定位优化方向)
- API 调用策略:
- 实现请求间隔(≥ 5 秒),避免触发限频
- 使用指数退避重试处理 429 错误
- 缓存结果(PSI 结果在短期内相对稳定)
- 监控频率:
- 关键页面每周 1-2 次 API 检查
- 重大变更后立即手动验证
- 区分页面类型:为首页、商品页、博客页等设置不同的性能预算
常见陷阱
- ❌ 只关注性能分数:分数只是手段,Core Web Vitals 指标才是影响排名的关键
- ❌ 忽略真实用户数据:实验室满分但真实用户数据差,说明优化方向有误
- ❌ 频繁调用 API:超出配额导致监控中断
- ❌ 新页面期望真实数据:新上线页面需要数周积累才有真实用户数据
- ❌ 2026 年 3 月分数下降恐慌:Google 定期更新评分算法,分数波动是正常现象
推荐模式
- ✅ Web 界面:手动快速检查单个页面
- ✅ API 脚本:定期批量监控多个关键 URL
- ✅ CI/CD 集成:每次部署前自动检查性能预算
- ✅ 搭配 CrUX:深入分析真实用户数据分布
- ✅ 搭配 Lighthouse CI:本地开发时快速迭代,PSI 验证最终效果
技术局限与边界
已知限制
| 局限 | 详细说明 |
|---|---|
| API 限频 | 25,000 次/天,不适合大规模批量扫描 |
| 无隐私/认证页面支持 | 无法测试需登录的页面 |
| 真实数据延迟 | CrUX 数据有约 3 天延迟,且按月度发布 |
| 低流量页面无数据 | 访问量不足的页面没有真实用户数据 |
| 单页面测试 | 每次只能分析一个 URL,不支持站点级别批量审计 |
| 无法自定义测试条件 | 不能选择测试设备、网络、地区 |
| 无视频分析 | 不像 WebPageTest 提供电影条分析 |
| API 响应结构变化 | Lighthouse 版本升级可能导致 API 响应字段变化 |
不适用场景
- 全站批量性能审计(应使用 Unlighthouse 或 Lighthouse CI)
- 需登录/认证页面的测试
- 需要精细控制测试条件(设备、网络、地区)的场景
- 需要视频/视觉分析的场景
学习资源
官方文档
- PageSpeed Insights 官网 - 在线分析入口
- PSI API 文档 - API 参考
- PSI Release Notes - 更新日志
- Core Web Vitals - 指标详解
教程
- Monitor Performance with the PageSpeed Insights API - Addy Osmani 教程
- CrUX: A Detailed Guide (DebugBear) - CrUX 数据详解
社区资源
- PageSpeed Insights Discuss (Google Groups) - 官方讨论组
- Chrome UX Report Google Group - CrUX 公告
- Stack Overflow
[pagespeed]标签 - 技术问答
2026 年现状
最新版本
- API v5:当前版本,底层使用 Lighthouse 13.0 引擎
- Lighthouse 13.0 集成:2025 年 10 月 20 日更新,引入全新 Performance Insights 体系
- 2026 年 3 月评分更新:算法调整导致部分网站分数下降
发展趋势
- Performance Insights 深化:v13 引擎提供更细粒度的性能诊断(LCP 分解、CLS 定位、图片传输优化等)
- INP 持续优化:INP 作为交互响应性指标的地位进一步巩固
- Agentic Browsing 审计:未来 PSI 可能集成 Lighthouse 的 Agentic Browsing 审计结果
- CrUX 数据扩展:覆盖超过 1800 万 origin,数据维度不断丰富
- Soft Navigations API:将扩展到 SPA 客户端导航的 Core Web Vitals 测量
CrUX 数据生态
- 月度数据集:每月第二个周二更新 BigQuery 数据集
- 2026 年 3 月数据:覆盖 18,257,384 个 origin
- CrUX Dashboard 已弃用:2025 年 11 月后停用,替代为 CrUX Vis
- CrUX API:提供 origin 和 URL 级别的真实用户数据查询