如何使用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
相关产品推荐
相关产品推荐

