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

使用R抓取含下拉菜单的网页表格数据技术求助

R 爬取带下拉菜单的表格数据方案

1. 先搞懂网站的请求逻辑

这个网站的下拉选择不是静态渲染的,选完日期/时间/州点击查询后,是通过POST请求从后端拿数据的。你可以打开浏览器F12开发者工具,切到「网络」标签,操作一次查询,就能看到请求的细节:

  • 接口地址:https://apims.doe.gov.my/api_table_data.php
  • 提交的参数:date(格式比如2024-05-20)、time(比如14:00)、state(ALL代表全选)

2. 提取选项的实际请求参数

你之前只提取了选项的显示文本,这不够——网站实际发请求用的是选项的value属性值,所以得把这个也拿到:

# 加载需要的包
library(rvest)
library(httr)
library(purrr)
library(dplyr)

url <- "https://apims.doe.gov.my/api_table.html"
webpage <- read_html(url)

# 提取日期的显示文本和对应的value参数
date_options <- webpage %>%
  html_node("#pickdate") %>%
  html_nodes("option") %>%
  tibble(
    显示文本 = html_text(),
    请求参数 = html_attr("value")
  ) %>%
  filter(请求参数 != "") # 过滤掉空的默认选项

# 提取时间的显示文本和value参数
time_options <- webpage %>%
  html_node("#picktime") %>%
  html_nodes("option") %>%
  tibble(
    显示文本 = html_text(),
    请求参数 = html_attr("value")
  ) %>%
  filter(请求参数 != "")

# 提取全选州的value参数
state_param <- webpage %>%
  html_node("#pickstate") %>%
  html_nodes("option[value='ALL']") %>%
  html_attr("value")

3. 批量构造请求并爬取数据

把所有日期、时间的组合列出来,挨个请求接口,最后把数据合并:

# 生成所有日期+时间的参数组合
all_params <- expand.grid(
  date = date_options$请求参数,
  time = time_options$请求参数,
  state = state_param,
  stringsAsFactors = FALSE
)

# 定义单个请求的函数
get_table <- function(date, time, state) {
  # 发送POST请求
  res <- POST(
    url = "https://apims.doe.gov.my/api_table_data.php",
    body = list(date = date, time = time, state = state),
    encode = "form"
  )
  
  # 解析返回的表格,加上请求的日期时间标记
  if (http_status(res)$category == "Success") {
    table_content <- content(res) %>%
      html_node("table") %>%
      html_table(header = TRUE) %>%
      mutate(
        爬取日期 = date,
        爬取时间 = time,
        爬取州 = state
      )
    return(table_content)
  } else {
    warning(paste("请求失败:", date, time))
    return(tibble())
  }
}

# 批量执行请求,合并所有结果
final_data <- pmap_dfr(all_params, get_table)

# 查看前几行数据
head(final_data)

4. 避坑提醒

  • 别太频繁请求,建议在get_table函数里加Sys.sleep(1),每次请求间隔1秒,防止被网站封IP
  • 有些时间点可能没有数据,代码里已经处理了这种情况,会返回空表不影响合并
  • 如果日期的value格式和显示文本不一样,不用管,直接用value里的参数就行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 15:53:13