如何将TRAC Immigration网页图表中的驱逐数据抓取到R中?
抓取TRAC Immigration网站的ICE驱逐月度数据到R
这个网站的图表数据并非静态嵌入HTML,而是通过JavaScript动态渲染,但数据实际藏在页面的JS变量里,无需浏览器模拟工具,直接提取JS数据即可,步骤如下:
步骤1:加载所需R包
先安装并加载必要的工具包:
# 首次运行时安装包 install.packages(c("rvest", "stringr", "jsonlite", "dplyr")) # 加载包 library(rvest) library(stringr) library(jsonlite) library(dplyr)
步骤2:抓取页面源码并提取JS数据
访问目标页面后,抓取HTML源码,定位存储图表数据的JS变量(该页面数据存在chart_data变量中):
# 抓取目标页面 url <- "https://trac.syr.edu/phptools/immigration/remove/" page <- read_html(url) # 提取页面所有JS脚本内容 scripts <- page %>% html_elements("script") %>% html_text() # 筛选包含图表数据的脚本片段 chart_script <- scripts[str_detect(scripts, "chart_data")] # 提取chart_data对应的JSON格式数据 data_json <- str_extract(chart_script, "chart_data = \\[.*?\\];") %>% str_remove("chart_data = ") %>% str_remove(";")
步骤3:解析JSON并转换为数据框
将提取到的JSON字符串转换为R可处理的数据框,此时就能获取所有城市的月度驱逐数据:
# 解析JSON数据 raw_data <- fromJSON(data_json) # 整理为整洁的数据框 clean_data <- raw_data %>% mutate( # 拆分日期为年和月 year = str_sub(date, 1, 4) %>% as.integer(), month = str_sub(date, 6, 7) %>% as.integer(), # 转换驱逐人数为数值型 removals = as.integer(value) ) %>% select(city, state, year, month, removals)
步骤4:筛选德克萨斯州的数据
最后筛选出德克萨斯州(TX)的城市数据,得到目标数据集:
tx_removals <- clean_data %>% filter(state == "TX") # 查看结果示例 head(tx_removals)
注意事项
- 网站的JS变量名可能随更新变化,若后续代码失效,检查页面源码中的变量名,调整
str_detect的关键词即可。 - 数据中
date字段格式为YYYY-MM,拆分年月时需确认格式一致性。
内容的提问来源于stack exchange,提问作者Cecile Tobin
相关产品推荐
相关产品推荐

