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

求助:如何用R语言rvest包从Statista图表提取数据为DataFrame?

从Statista提取美国庇护获批数据并转为DataFrame的解决方案

问题根源

Statista的图表数据大多是动态加载的,直接用rvest抓取静态HTML拿不到实际数据,你之前定位image类元素的方向完全错了——数据根本不在图片标签里。

可行方案

方案一:用RSelenium模拟浏览器抓取(最稳妥,适配动态内容)

这个方法通过模拟真实浏览器加载页面,能完整获取JS渲染后的内容:

  1. 先装需要的包:
install.packages(c("RSelenium", "rvest", "dplyr"))
library(RSelenium)
library(rvest)
library(dplyr)
  1. 启动Chrome驱动(如果没装ChromeDriver,rsDriver会自动下载适配版本,失败的话得手动下载对应Chrome版本的驱动并放系统路径):
driver <- rsDriver(browser = "chrome", chromever = "latest")
remDr <- driver[["client"]]
  1. 打开目标页面,等几秒让数据加载完:
remDr$navigate("https://www.statista.com/chart/25619/asylum-grants-in-the-us-by-nationality/")
Sys.sleep(5) # 时间可以根据网速调整
  1. 提取表格数据并转成DataFrame:
# 获取渲染后的页面源码
page_source <- remDr$getPageSource()[[1]]
html <- read_html(page_source)

# 定位Statista的图表表格(类名可能随页面更新,失效的话用F12看最新的)
asylum_table <- html %>% 
  html_element(css = ".chart-table") %>% 
  html_table(header = TRUE)

# 转成DataFrame,可选清理列名
asylum_df <- asylum_table %>% 
  clean_names()
  1. 用完记得关闭浏览器:
remDr$close()
driver$server$stop()

方案二:直接解析页面内嵌的JSON数据(无需模拟浏览器)

部分Statista页面会把数据藏在HTML的<script>标签里,不用开浏览器就能抓:

library(rvest)
library(jsonlite)
library(dplyr)

# 抓静态页面源码
html_url <- read_html("https://www.statista.com/chart/25619/asylum-grants-in-the-us-by-nationality/")

# 找到带图表数据的script标签
script_data <- html_url %>% 
  html_elements(css = "script[type='application/json']") %>% 
  html_text()

# 筛选包含图表数据的JSON片段并解析
target_json <- fromJSON(script_data[grep("chartData", script_data)])

# 提取国家和获批数量(JSON结构可能更新,失效的话用F12查看数据节点)
asylum_df <- target_json$data$series[[1]]$data %>% 
  as.data.frame() %>% 
  rename(nationality = x, asylum_grants = y)

注意事项

  • Statista有反爬机制,别频繁刷页面,建议每次请求加几秒延迟。
  • 页面结构可能会变,如果代码失效,用浏览器F12开发者工具重新定位元素或JSON节点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 10:29:52