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

