You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用R抓取指定Highcharts数据失败,寻求技术解决办法

嘿,我来帮你搞定这个Highcharts数据抓取的问题!你说得完全没错——这类动态渲染的图表数据确实藏在JavaScript代码里,不是直接嵌在HTML节点里,所以用常规的html_nodes自然抓不到。下面是亲测可行的具体步骤:

1. 先加载需要的R包

首先得装上并加载几个核心工具包,用来抓网页、处理字符串和解析JSON:

install.packages(c("rvest", "jsonlite", "stringr"))
library(rvest)
library(jsonlite)
library(stringr)
2. 抓取网页并定位藏数据的JS代码块

先把目标网页的内容拉下来,然后找到包含Highcharts配置的那一段JS代码——通常这类代码会以Highcharts.chart(开头,里面的series字段就是我们要的图表数据:

# 读取网页内容
url <- "https://modi.minerba.esdm.go.id/pimpinan/produksiPenjualan?t=2020"
page <- read_html(url)

# 提取所有<script>标签里的文本,然后筛选出包含Highcharts配置的部分
js_text <- page %>% 
  html_elements("script") %>% 
  html_text() %>% 
  str_subset("Highcharts.chart")

# 清理字符串,把它转换成可解析的JSON格式
# 先去掉开头的"Highcharts.chart('container', "和结尾的");"部分
json_str <- str_remove(js_text, "^Highcharts.chart\\('container', ") %>% 
  str_remove("\\);$")
3. 解析JSON并整理成可用的数据框

现在把处理好的JSON字符串解析成R对象,然后提取出series里的数据,整理成方便分析的格式:

# 解析JSON
chart_data <- fromJSON(json_str)

# 提取每个系列的数据,合并成数据框
final_data <- do.call(rbind, lapply(chart_data$series, function(x) {
  data.frame(
    category = x$name,
    month = x$data$name,
    value = x$data$y,
    stringsAsFactors = FALSE
  )
}))

# 看看结果
head(final_data)
一些注意事项
  • 如果后续网页的JS代码结构有变动,可能需要调整str_subset里的匹配关键词,或者正则表达式的规则
  • 要是遇到编码问题,可以在read_html里加上encoding = "UTF-8"参数试试

内容的提问来源于stack exchange,提问作者Horje

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:15:51