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

用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 17:47:15