You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于R语言抓取带双下拉框的.aspx表单数据遇阻求助

解决ASPX表单批量抓取问题

原代码的核心问题

  • 未初始化会话:ASPX页面依赖会话状态(如ViewState、EventValidation),必须用html_session()创建会话,而非直接用read_html()
  • 字段赋值错误:设置报表类型时误用了年份字段名ctl00$ContentPlaceHolder1$ddYear,应该用报表类型字段ctl00$ContentPlaceHolder1$ddReportType
  • 语法错误:type<- form$fields[[4]]$options[2]type 多了冗余的type后缀
  • 提交按钮参数错误:hfExport是隐藏字段,导出数据的有效按钮是ctl00$ContentPlaceHolder1$btnExport
  • 批量逻辑缺失:未实现年份循环遍历,仅处理单个年份

修正后的完整代码

library(tidyverse)
library(rvest)

# 初始化会话,维持ASPX页面状态
base_url <- "https://profiles.doe.mass.edu/statereport/enrollmentbygrade.aspx"
session <- html_session(base_url)

# 提取表单和年份选项
form <- html_form(session)[[2]]
years <- names(form$fields[["ctl00$ContentPlaceHolder1$ddYear"]]$options)
# 排除默认的"Select Year"选项
years <- years[years != ""]

# 定义批量抓取函数
scrape_year_data <- function(year) {
  # 更新表单的年份和报表类型选项
  form_update <- html_form_set(form, 
                               "ctl00$ContentPlaceHolder1$ddYear" = year,
                               "ctl00$ContentPlaceHolder1$ddReportType" = "School")
  
  # 提交表单,触发导出
  response <- html_form_submit(session, form_update, submit = "ctl00$ContentPlaceHolder1$btnExport")
  
  # 读取导出的CSV数据(页面导出为CSV格式,无需解析HTML表格)
  df <- read_csv(content(response, as = "text"))
  
  # 添加年份标识列
  df <- df %>% mutate(Year = year)
  
  return(df)
}

# 批量遍历所有年份,抓取并合并数据
all_data <- map_dfr(years, scrape_year_data)

# 查看结果示例
head(all_data)

关键说明

  • 会话维持:html_session()会自动携带ASPX页面生成的ViewState等隐藏参数,确保表单提交有效
  • 直接读取CSV:页面导出的是标准CSV格式,用read_csv()比解析HTML表格更高效准确
  • 批量处理:用map_dfr()遍历所有年份,自动将各年份数据合并为单个数据框
  • 字段名规范:直接使用表单字段的真实name(可通过浏览器开发者工具查看),避免依赖字段索引(如[[4]])导致的结构变化问题

内容的提问来源于stack exchange,提问作者Peter Ciurczak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 15:52:20