如何从Google PageSpeed Insights API提取加载体验时序与占比数据?
我正在开发一款基于Google PageSpeed Insights API的应用,通过curl https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=目标URL调用API获取JSON响应,也用Java代码实现了程序化调用:
String pythonScript = "import os\n" + "os.system(\"curl https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url= "+pageSpeedMetrics.getCompanyUrl()+" > "+PYTHON_FILE_LOCATION+fileName+"\")"; BufferedWriter out = new BufferedWriter(new FileWriter(PYTHON_FILE_LOCATION.concat(PAGESPEEDINSIGHT_PYTHON_FILE_NAME))); out.write(pythonScript); out.close(); System.out.println(pythonScript); Process p = r.exec("python "+PYTHON_FILE_LOCATION.concat(PAGESPEEDINSIGHT_PYTHON_FILE_NAME)+""); p.waitFor(); JSONObject json = new JSONObject(); json.put("crux_loading_experience", jsonPagespeedInsight.getJSONObject("loadingExperience")); json.put("crux_origin_loading_experience", jsonPagespeedInsight.getJSONObject("originLoadingExperience"));
但我发现,在PageSpeed Insights在线工具里能看到FCP(First Contentful Paint)和FID(First Input Delay)的时序图表及对应的百分比值,可API返回的JSON里并没有直接给出这些可视化的数值。想请教这些值是如何从API响应数据生成的?
解答:
其实这些可视化数据的核心来源就是API响应里的distributions字段,在线工具只是把这些原始数据做了可视化转换:
核心数据来源:
distributions数组
每个性能指标(比如FIRST_CONTENTFUL_PAINT_MS、FIRST_INPUT_DELAY_MS)的metrics对象里,都包含一个distributions数组。这个数组里的每一项代表一个延迟区间,包含三个关键值:min:区间的最小延迟(毫秒)max:区间的最大延迟(毫秒,最后一项可能没有,代表大于等于min的所有情况)proportion:该区间内用户的占比(小数形式,比如0.5647代表56.47%)
百分比值的生成
在线工具里显示的百分比,就是把proportion值乘以100得到的。比如你提供的示例响应中:- FCP的0-1000ms区间占比是0.5647 → 转换成56.47%
- 1000-2500ms区间占比0.3140 → 31.40%
- 2500ms+区间占比0.1213 → 12.13%
这些就是在线工具里展示的百分比数值。
时序图表的生成
时序图表是按延迟区间的时间顺序(从短到长)来排列这些区间,用柱状图或折线图的形式呈现每个区间的用户占比。比如横轴是延迟区间(0-1s、1-2.5s、2.5s+),纵轴是对应的用户百分比,这样就能直观展示不同加载速度下的用户分布情况。额外的参考值:
percentile字段
另外API返回的percentile值(比如FID的98分位是98ms),会被在线工具突出显示,作为该指标的关键参考——代表98%的用户的延迟都低于这个数值。
如果你想在自己的应用里实现类似的展示,只需要解析distributions数组,提取每个区间的范围和占比,转换成百分比后,就可以用前端图表库来生成对应的时序可视化了。
内容的提问来源于stack exchange,提问作者Mithun Manohar




