R语言解析Google Page Speed API嵌套列表导出审计结果CSV
问题描述
处理Google Page Speed API返回的响应数据时,嵌套列表无法正常解析拆解,目标是仅提取页面速度审计结果并导出为CSV文件,用于对比分析客户网站的加载时长与性能表现。
原有实现直接将接口返回的顶层列表强转为数据框后,调用tidyr::unnest方法展开audits字段失败,无法得到包含first-contentful-paint等有实际参考价值指标的规整数据框。
原有错误实现代码:
library(httr) library(tidyverse) library(tidyr) #URL to submit GET request to url <- "https://www.googleapis.com/pagespeedonline/v5/runPagespeedurl=https://www.google.com/" # GET request returned as list raw_list <- url %>% httr::GET() %>% httr::content() #turning the list into a dataframe df_pagespeed <- as.data.frame(do.call(rbind, raw_list)) #attempted unpack list in audit results with no luck df_pagespeed <- tidyr::unnest(df_pagespeed, cols = audits) # select only the audit results. df_pagespeed_final <- df_pagespeed[c(audits)] #export to csv file write.csv(df_pagespeed_final,"test-pagespeed.csv", row.names = FALSE)
问题原因
- 接口请求URL格式错误:
runPagespeed路径后缺少参数分隔符?,请求本身无法返回正确的结构化数据 - 节点定位错误:审计结果
audits字段存放在返回结构的lighthouseResult节点下,并非返回结果的根层级 - 嵌套结构处理逻辑错误:
audits下每个审计项为独立嵌套对象,包含id、标题、得分、数值、描述等多个异构字段,直接对顶层列表做rbind转数据框后,audits列不是规整的列表列,无法直接用unnest展开
修正后可运行代码
library(httr) library(tidyverse) # 修正请求URL,补充参数分隔符,可按需加strategy=mobile/desktop切换检测端 url <- "https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=https://www.google.com/" # 发起请求并解析返回结果 resp <- GET(url) # 接口报错时直接终止,避免后续解析空数据 stop_for_status(resp) raw_list <- content(resp) # 定位到审计结果节点 audits_list <- pluck(raw_list, "lighthouseResult", "audits") # 遍历提取每个审计项的核心字段,空值自动填充NA df_pagespeed_final <- map_dfr(audits_list, function(item) { tibble( audit_id = item$id, audit_title = item$title, audit_score = item$score %||% NA, # 数值类指标默认单位为毫秒 audit_value = item$numericValue %||% NA, audit_unit = item$numericUnit %||% NA, audit_description = item$description ) }) # 如需仅筛选核心加载性能指标,可放开下面这行注释 # core_metrics <- c("first-contentful-paint", "largest-contentful-paint", # "speed-index", "interactive", "total-blocking-time", # "cumulative-layout-shift") # df_pagespeed_final <- filter(df_pagespeed_final, audit_id %in% core_metrics) # 导出CSV write.csv(df_pagespeed_final, "pagespeed-audit-result.csv", row.names = FALSE, fileEncoding = "UTF-8")
注意事项
- 代码中
%||%是rlang包提供的空值兜底运算符,随tidyverse加载,无需额外引入 - 数值类性能指标的
audit_value字段默认单位为毫秒,布局偏移指标CLS为无单位比值,可直接用于多站点横向对比 - 批量检测多个站点时,只需要循环替换URL参数中的站点地址,给结果表新增站点标识列即可合并所有检测结果
内容的提问来源于stack exchange,提问作者user13056765
相关产品推荐
相关产品推荐

