You need to enable JavaScript to run this app. 如何使用R爬取ICPSR网站视觉为表格但底层非表格结构的PATH调查变量数据
优惠活动
大模型
产品
解决方案
定价
更多

如何使用R爬取ICPSR网站视觉为表格但底层非表格结构的PATH调查变量数据

R爬取ICPSR PATH调查变量表实现方案

该页面为JS动态渲染的伪表格,静态HTML无结构化表格数据,常规rvest等静态解析工具无法直接抓取,以下两种方案均可实现需求:

方案一:直接调用后台数据接口(优先推荐,效率更高)

页面实际通过内部接口返回JSON格式的全量变量数据,无需解析前端页面,直接请求接口即可获取结构化数据:

# 依赖包安装(首次使用执行)
# install.packages(c("httr2", "jsonlite", "tidyverse", "writexl"))
library(httr2)
library(jsonlite)
library(tidyverse)
library(writexl)

# 构造数据请求
data_req <- request("https://www.icpsr.umich.edu/web/NAHDAP/search/variables") |>
  req_url_query(
    start = 0,
    sort = "STUDYID asc,DATASETID asc,STARTPOS asc",
    SERIESFULL_FACET_Q = "606|Population Assessment of Tobacco and Health (PATH) Study Series",
    DATASETTITLE_FACET = "Wave 4: Youth / Parent Questionnaire Data",
    EXTERNAL_FLAG = 1,
    ARCHIVE = "NAHDAP",
    rows = 1000,
    format = "json"
  )

# 发送请求解析数据
resp <- req_perform(data_req)
raw_json <- resp_body_json(resp)

# 转换为数据框
var_result <- map_dfr(raw_json$variables, function(item) {
  tibble(
    变量ID = item$name,
    问题文本 = item$label,
    变量类型 = item$type,
    来源数据集 = item$datasetTitle,
    研究编号 = item$studyId,
    数据集编号 = item$datasetId
  )
})

# 导出为Excel
write_xlsx(var_result, "PATH Wave4 变量对照表.xlsx")

方案二:RSelenium模拟浏览器渲染抓取(接口变动时备用)

如果网站后续调整接口规则,可通过模拟浏览器拿到渲染后的完整页面再解析:

# 依赖包安装(首次使用执行)
# install.packages(c("RSelenium", "rvest", "writexl"))
library(RSelenium)
library(rvest)
library(writexl)

# 启动Chrome驱动(需提前安装和本地Chrome版本匹配的ChromeDriver)
rd <- rsDriver(browser = "chrome", chromever = "你的本地Chrome版本号", port = 4567L)
remDr <- rd$client

# 打开目标页面
remDr$navigate("https://www.icpsr.umich.edu/web/NAHDAP/search/variables?start=0&sort=STUDYID%20asc%2CDATASETID%20asc%2CSTARTPOS%20asc&SERIESFULL_FACET_Q=606%7CPopulation%20Assessment%20of%20Tobacco%20and%20Health%20(PATH)%20Study%20Series&DATASETTITLE_FACET=Wave%204%3A%20Youth%20%2F%20Parent%20Questionnaire%20Data&EXTERNAL_FLAG=1&ARCHIVE=NAHDAP&rows=1000#")
Sys.sleep(5) # 等待页面渲染完成

# 获取渲染后页面源码
page_html <- read_html(remDr$getPageSource()[[1]])

# 解析变量信息
var_result <- page_html |>
  html_elements(".searchResultVariable") |>
  map_dfr(~{
    tibble(
      变量ID = html_element(.x, ".variableName a") |> html_text2(),
      问题文本 = html_element(.x, ".variableLabel") |> html_text2(),
      变量类型 = html_element(.x, ".variableType") |> html_text2(),
      来源数据集 = html_element(.x, ".datasetName a") |> html_text2()
    )
  })

# 导出Excel
write_xlsx(var_result, "PATH Wave4 变量对照表.xlsx")

# 关闭驱动
remDr$close()
rd$server$stop()

补充说明

  • 若变量总数超过1000条,可调整start参数分页拉取,例如start=1000拉取第二页数据,多页结果直接按行拼接即可
  • 爬取时请控制请求频率,避免对站点服务器造成压力

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 19:18:02