PageSpeed Insights logo

PageSpeed Insights

Google 提供的免费在线页面速度分析工具,结合 Lighthouse 实验室数据和 Chrome 真实用户数据(CrUX),提供全面的网页性能评估。

精选工具性能审计Web VitalsCore Web Vitals在线工具

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 界面

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

  1. 访问 Google Cloud Console
  2. 创建项目或选择已有项目
  3. 启用 "PageSpeed Insights API"
  4. 创建 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 指标

指标全称良好阈值需改进
LCPLargest Contentful Paint≤ 2.5s2.5s–4.0s> 4.0s
INPInteraction to Next Paint≤ 200ms200ms–500ms> 500ms
CLSCumulative Layout Shift≤ 0.10.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×6401350×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 InsightsLighthouse(本地)WebPageTestGTmetrix
数据来源实验室 + 真实用户仅实验室仅实验室仅实验室
费用免费免费开源免费 + 付费免费 + 付费
全球测试点✅(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 天的整体体验,不是单次测试结果

最佳实践

生产环境建议

  1. 双数据源验证:同时关注实验室数据和真实用户数据,实验室数据用于定位问题,真实数据用于评估实际影响
  2. 优先级排序:以真实用户数据为主(影响搜索排名),实验室数据为辅(定位优化方向)
  3. API 调用策略
    • 实现请求间隔(≥ 5 秒),避免触发限频
    • 使用指数退避重试处理 429 错误
    • 缓存结果(PSI 结果在短期内相对稳定)
  4. 监控频率
    • 关键页面每周 1-2 次 API 检查
    • 重大变更后立即手动验证
  5. 区分页面类型:为首页、商品页、博客页等设置不同的性能预算

常见陷阱

  • 只关注性能分数:分数只是手段,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)
  • 需登录/认证页面的测试
  • 需要精细控制测试条件(设备、网络、地区)的场景
  • 需要视频/视觉分析的场景

学习资源

官方文档

教程

社区资源

2026 年现状

最新版本

  • API v5:当前版本,底层使用 Lighthouse 13.0 引擎
  • Lighthouse 13.0 集成:2025 年 10 月 20 日更新,引入全新 Performance Insights 体系
  • 2026 年 3 月评分更新:算法调整导致部分网站分数下降

发展趋势

  1. Performance Insights 深化:v13 引擎提供更细粒度的性能诊断(LCP 分解、CLS 定位、图片传输优化等)
  2. INP 持续优化:INP 作为交互响应性指标的地位进一步巩固
  3. Agentic Browsing 审计:未来 PSI 可能集成 Lighthouse 的 Agentic Browsing 审计结果
  4. CrUX 数据扩展:覆盖超过 1800 万 origin,数据维度不断丰富
  5. 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 级别的真实用户数据查询