用R点击网页Download按钮下载数据得到空Excel,该如何解决?
问题分析与解决
你的代码之所以返回空Excel文件,核心问题是POST请求参数不完整,且缺少必要的会话与浏览器模拟逻辑,导致服务器未正确识别下载请求。
具体修正思路与代码
该网站基于ASP.NET构建,这类站点会通过__VIEWSTATE、__EVENTVALIDATION等隐藏字段验证请求合法性,同时需要维持会话状态、模拟浏览器请求头才能正常返回文件。修正后的代码如下:
library(httr) library(rvest) # 初始化会话,获取页面表单关键字段 target_url <- "https://www.portaldaindustria.com.br/estatisticas/indicadores-industriais/" session <- session(target_url) page_source <- read_html(session) # 提取ASP.NET表单必填的隐藏字段 viewstate <- html_element(page_source, "#__VIEWSTATE") %>% html_attr("value") event_validation <- html_element(page_source, "#__EVENTVALIDATION") %>% html_attr("value") # 构造完整的POST请求参数 post_body <- list( `__VIEWSTATE` = viewstate, `__EVENTVALIDATION` = event_validation, `DOWNLOAD` = "" # 对应下载按钮的表单标识 ) # 发送请求并保存文件 download_res <- session_post( session, url = target_url, body = post_body, encode = "form", write_disk("Ind.xlsx", overwrite = TRUE), add_headers("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 (download_res$status_code == 200 && file.size("Ind.xlsx") > 0) { cat("文件下载成功!") } else { cat("下载失败,状态码:", download_res$status_code) }
关键要点说明
- 使用
session对象维持会话,自动处理服务器的cookie验证; - 必须携带
__VIEWSTATE和__EVENTVALIDATION字段,否则服务器会拒绝请求; - 添加
User-Agent请求头模拟浏览器,避免被服务器识别为非合法请求; - 用
session_post替代原生POST,确保请求上下文与浏览器操作一致。
内容的提问来源于stack exchange,提问作者Alexandre Sanches
相关产品推荐
相关产品推荐

