求助:如何用R语言rvest包从Statista图表提取数据为DataFrame?
从Statista提取美国庇护获批数据并转为DataFrame的解决方案
问题根源
Statista的图表数据大多是动态加载的,直接用rvest抓取静态HTML拿不到实际数据,你之前定位image类元素的方向完全错了——数据根本不在图片标签里。
可行方案
方案一:用RSelenium模拟浏览器抓取(最稳妥,适配动态内容)
这个方法通过模拟真实浏览器加载页面,能完整获取JS渲染后的内容:
- 先装需要的包:
install.packages(c("RSelenium", "rvest", "dplyr")) library(RSelenium) library(rvest) library(dplyr)
- 启动Chrome驱动(如果没装ChromeDriver,
rsDriver会自动下载适配版本,失败的话得手动下载对应Chrome版本的驱动并放系统路径):
driver <- rsDriver(browser = "chrome", chromever = "latest") remDr <- driver[["client"]]
- 打开目标页面,等几秒让数据加载完:
remDr$navigate("https://www.statista.com/chart/25619/asylum-grants-in-the-us-by-nationality/") Sys.sleep(5) # 时间可以根据网速调整
- 提取表格数据并转成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()
- 用完记得关闭浏览器:
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
相关产品推荐
相关产品推荐

