如何解决understatr包的‘json文本存在无效字符’错误?
针对understatr包抓取数据失效的解决方案
1. 先排查基础问题
- 手动访问Understat官网,确认站点能正常加载(没有Cloudflare验证弹窗、页面报错等),如果网站本身有反爬或临时故障,包肯定没法正常请求。
- 卸载并重装最新版的understatr:
remove.packages("understatr") install.packages("understatr") # 若CRAN版本滞后,可装GitHub开发版(需先装devtools) # devtools::install_github("ewenme/understatr")
2. 解决"invalid char in json text"错误
这个错误一般是请求到的内容含特殊字符,干扰了jsonlite解析,试试以下方法:
- 手动模拟请求流程,清理数据后再解析:
library(curl) library(jsonlite) # 替换x为你的player_id player_url <- paste0("https://understat.com/player/", x) # 带浏览器UA请求,避免被反爬拦截 h <- new_handle(useragent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36") req <- curl_fetch_memory(player_url, handle = h) # 提取页面中的JSON数据 raw_content <- rawToChar(req$content) json_str <- sub(".*window.__NEXT_DATA__ = (.*?);</script>.*", "\\1", raw_content, perl = TRUE) # 清理换行、回车等特殊字符 json_str <- gsub("\\r|\\n", "", json_str) # 解析并提取赛季数据 data <- fromJSON(json_str) player_stats <- data$props$pageProps$playerData$seasons
3. 解决get_leagues_meta返回空tibble的问题
- 同样用带UA的curl手动请求联赛数据:
leagues_url <- "https://understat.com/leagues" req <- curl_fetch_memory(leagues_url, handle = h) raw_content <- rawToChar(req$content) json_str <- sub(".*window.__NEXT_DATA__ = (.*?);</script>.*", "\\1", raw_content, perl = TRUE) json_data <- fromJSON(json_str) leagues_meta <- json_data$props$pageProps$leaguesList - 重启R会话,只加载understatr、jsonlite、curl三个包,排除其他包的依赖冲突。
4. 测试干净环境
关闭所有R窗口,重新打开后只运行以下代码测试:
install.packages(c("understatr", "jsonlite", "curl")) library(understatr) library(jsonlite) library(curl) # 测试联赛元数据 get_leagues_meta() # 测试球员数据(用已知有效的player_id,比如1437对应梅西) get_player_seasons_stats(player_id = 1437)
内容的提问来源于stack exchange,提问作者jeffreyohene
相关产品推荐
相关产品推荐

