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

如何使用R爬取下拉选择触发显示的HTML隐藏表格并导出

R语言爬取动态下拉表格实现方案

核心思路

该站点的表格是选择下拉选项后发起POST请求动态加载的,不需要模拟浏览器点击,直接构造对应参数的POST请求即可拿到返回的表格数据。

依赖包安装

首先安装所需工具包:

install.packages(c("httr", "rvest", "dplyr", "openxlsx"))

完整实现代码

library(httr)
library(rvest)
library(dplyr)
library(openxlsx)

# 配置基础参数
target_url <- "https://www.adfg.alaska.gov/index.cfm?adfg=commercialbyareapws.harvestbydistrict"
district_list <- c(221, 222, 223, 226, 227, 228)
# 存储所有结果的列表
all_result <- list()

# 循环爬取每个区域的表格
for (d in district_list) {
  # 构造POST请求的表单参数,可从网络请求面板的「表单数据」部分核对补全所有隐藏参数
  post_data <- list(
    adfg = "commercialbyareapws.harvestbydistrict",
    district = as.character(d),
    submit = "Get Report"
  )
  
  # 发起POST请求,模拟正常浏览器请求头
  resp <- POST(
    url = target_url,
    body = post_data,
    encode = "form",
    user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36")
  )
  
  # 检查请求是否成功
  if (status_code(resp) == 200) {
    # 解析HTML提取表格,可根据实际表格的class/id调整css选择器
    table_df <- resp %>% 
      read_html() %>% 
      html_element(css = "table") %>% 
      html_table(header = TRUE)
    
    # 增加区域编号列方便区分数据
    table_df <- table_df %>% mutate(district = d)
    all_result[[as.character(d)]] <- table_df
    
    # 加请求间隔避免触发反爬
    Sys.sleep(2)
  } else {
    warning(paste("区域", d, "请求失败,状态码:", status_code(resp)))
  }
}

# 合并所有区域数据为一个data.frame
final_df <- bind_rows(all_result)

# 导出为Excel文件
write.xlsx(final_df, "阿拉斯加渔业区域收获数据.xlsx", rowNames = FALSE)

备选方案(站点有反爬校验时使用)

如果直接发POST请求拿不到数据,可以用RSelenium模拟浏览器操作,自动点击下拉选项拉取表格:

# 安装依赖
install.packages(c("RSelenium", "rvest"))
library(RSelenium)
library(rvest)
library(dplyr)
library(openxlsx)

# 启动浏览器驱动,需和本地Chrome版本匹配
driver <- rsDriver(browser = "chrome", chromever = "本地安装的Chrome版本号")
remDr <- driver$client
remDr$navigate("https://www.adfg.alaska.gov/index.cfm?adfg=commercialbyareapws.harvestbydistrict")

district_list <- c(221, 222, 223, 226, 227, 228)
all_result <- list()

for (d in district_list) {
  # 定位下拉选框选择对应值
  select_elem <- remDr$findElement(using = "css", "select[name='district']")
  select_elem$sendKeysToElement(list(as.character(d)))
  # 点击提交按钮
  submit_elem <- remDr$findElement(using = "css", "input[type='submit']")
  submit_elem$clickElement()
  # 等待表格加载
  Sys.sleep(3)
  # 解析页面表格
  page_source <- remDr$getPageSource()[[1]]
  table_df <- read_html(page_source) %>% 
    html_element("table") %>% 
    html_table(header = TRUE) %>% 
    mutate(district = d)
  all_result[[as.character(d)]] <- table_df
}

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

# 合并导出
final_df <- bind_rows(all_result)
write.xlsx(final_df, "阿拉斯加渔业区域收获数据.xlsx", rowNames = FALSE)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 13:27:04