如何用R抓取动态网站?芝加哥某校毕业率数据抓取遇阻求助
解决R抓取To&Through网站毕业率数据的方案
核心问题分析
你遇到的是典型动态渲染页面的数据抓取问题:该网站用React类前端框架构建,毕业率时间轴数据并非直接写入静态HTML,而是通过JavaScript动态生成DOM节点,因此SelectorGadget无法定位静态节点,常规rvest静态抓取失效;同时数据可能未通过独立API接口加载,而是直接嵌入页面初始化脚本中。
方案1:提取页面初始化脚本中的JSON数据(推荐)
这类SPA网站通常会把初始数据打包在页面的<script>标签里(比如window.__INITIAL_STATE__变量),直接提取解析即可,无需模拟浏览器:
library(rvest) library(jsonlite) # 目标URL target_url <- "https://toandthrough.uchicago.edu/tool/cps/comm/2021/school/77/details/#/hs-graduation" # 抓取静态页面源码 page_html <- read_html(target_url) # 提取所有script标签文本,筛选包含初始化数据的脚本 all_scripts <- page_html %>% html_nodes("script") %>% html_text() # 匹配包含毕业率或初始化状态的脚本(可根据实际内容调整关键词) target_script <- grep("__INITIAL_STATE__|graduation", all_scripts, value = TRUE)[1] # 清理JSON字符串:去掉开头的window变量声明和结尾的分号 cleaned_json <- gsub("^window\\.__INITIAL_STATE__\\s*=\\s*|;\\s*$", "", target_script) # 解析JSON为R数据结构 site_data <- fromJSON(cleaned_json) # 定位时间轴毕业率数据(需根据实际JSON结构调整路径,可通过str(site_data)查看层级) graduation_timeline <- site_data$schoolDetails$graduation$timelineData print(graduation_timeline)
方案2:模拟浏览器渲染抓取动态DOM
如果方案1无法找到数据,可通过模拟真实浏览器让JavaScript完全渲染页面,再抓取生成后的DOM节点:
library(RSelenium) library(rvest) # 启动Chrome浏览器(需提前安装ChromeDriver并配置环境变量) driver <- rsDriver(browser = "chrome", port = 4567L, verbose = FALSE) remDr <- driver[["client"]] # 访问目标页面并等待加载完成 remDr$navigate(target_url) Sys.sleep(5) # 可根据网络情况调整等待时间 # 获取渲染后的页面源码 rendered_source <- remDr$getPageSource()[[1]] rendered_page <- read_html(rendered_source) # 使用SelectorGadget定位的节点提取数据(示例节点,需根据实际页面调整) graduation_rates <- rendered_page %>% html_nodes(".timeline-bar__value") %>% html_text() %>% as.numeric() print(graduation_rates) # 关闭浏览器和驱动 remDr$close() driver$server$stop()
额外排查提示
- 重新检查开发者工具Network面板:切换到
Fetch/XHR标签,刷新页面后仔细查看所有请求,部分API接口可能带有加密参数或隐藏在Document类型的请求中; - 查看页面的
robots.txt,确保抓取行为符合网站规则,避免被封禁; - 如果使用方案1,可通过
str(site_data)查看数据的完整层级结构,精准定位毕业率数据的存储路径。
内容的提问来源于stack exchange,提问作者dkro23
相关产品推荐
相关产品推荐

