R语言解析Google Lighthouse PageSpeed JSON转dataframe报错
报错原因
触发json_str must be a character string(json_str必须为字符串类型)报错的核心原因有两个:
str(max.level = 2)的作用仅为在控制台打印R对象的层级结构,返回值为NULL,根本不会输出JSON格式字符串,传入fromJSON()不符合参数要求- 调用
httr::content()时默认已经把API返回的JSON响应解析为R原生嵌套列表,不需要再重复调用JSON解析函数
正确实现(仅保留速度类指标)
不需要加载rjson包,和jsonlite功能重复容易引发函数冲突,直接按以下逻辑处理即可:
library(httr) library(jsonlite) library(tidyverse) # 构造API请求地址,加参数&strategy=mobile可获取移动端测速结果 url <- "https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=https://www.google.com" # 稳定获取解析后的JSON数据 raw_json <- httr::GET(url) %>% httr::content(as = "text", encoding = "UTF-8") %>% fromJSON() # 定位测速指标存储节点 all_audits <- raw_json$lighthouseResult$audits # 定义需要提取的速度类指标ID,过滤SEO、无障碍、最佳实践等非速度类指标 target_speed_metrics <- c( "first-contentful-paint", # 首次内容绘制FCP "largest-contentful-paint", # 最大内容绘制LCP "total-blocking-time", # 总阻塞时间TBT "speed-index", # 速度指数SI "cumulative-layout-shift", # 累积布局偏移CLS "interactive", # 可交互时间TTI "max-potential-fid" # 最大潜在首次输入延迟FID ) # 整理为规整dataframe df_pagespeed <- map_dfr(target_speed_metrics, function(metric_id){ curr_metric <- all_audits[[metric_id]] tibble( metric_name = curr_metric$title, metric_id = metric_id, score = curr_metric$score, display_value = curr_metric$displayValue, numeric_value = ifelse(is.null(curr_metric$numericValue), NA, curr_metric$numericValue), unit = ifelse(is.null(curr_metric$numericUnit), NA, curr_metric$numericUnit) ) })
补充说明
- 若需要提取其他自定义指标,直接在
target_speed_metrics向量里追加对应指标的ID即可 - 批量测试多个网址时,把上述逻辑封装为函数,传入不同url做映射调用即可,核心提取逻辑不需要调整
内容的提问来源于stack exchange,提问作者user13056765
相关产品推荐
相关产品推荐

