使用rvest提交表单下载CSV遇HTTP 500错误,求解决方案
解决ANBIMA网站CSV下载的爬虫问题
问题根源
你遇到的HTTP 500错误和主机解析失败,核心原因是:
- 该页面的表单提交依赖
VerificaSubmit()JavaScript函数做预处理(比如验证日期格式、添加隐藏参数、动态修改表单提交路径),而rvest本身无法执行JS,直接提交表单会缺失必要参数或格式不符合要求。 read_html_live的错误是因为表单的action是相对路径或JS生成的,工具未正确补全完整URL导致解析失败。
能不能只用rvest解决?
可以,但需要手动模拟JS的预处理逻辑,步骤如下:
- 分析JS函数逻辑:打开目标页面源码,找到
VerificaSubmit()函数,查看它的具体操作:- 是否验证日期格式(比如确保
Dt_Ref是DD/MM/YYYY格式) - 是否添加了ASP.NET常见的隐藏参数(如
__VIEWSTATE、__EVENTVALIDATION) - 是否修改了表单的提交路径(比如把action改成
CZ.asp这类相对路径,需要补全为完整URL)
- 是否验证日期格式(比如确保
- 手动构造完整请求:
library(rvest) library(httr) url <- 'https://www.anbima.com.br/informacoes/est-termo/default.asp' sess <- session(url) page <- read_html(sess) # 提取ASP.NET页面的隐藏字段 viewstate <- page %>% html_element("#__VIEWSTATE") %>% html_attr("value") eventvalidation <- page %>% html_element("#__EVENTVALIDATION") %>% html_attr("value") # 构造所有提交参数,包含JS处理后的必要项 form_data <- list( escolha = 2, Idioma = "PT", saida = "csv", Dt_Ref = "13/06/2024", __VIEWSTATE = viewstate, __EVENTVALIDATION = eventvalidation, __VIEWSTATEGENERATOR = page %>% html_element("#__VIEWSTATEGENERATOR") %>% html_attr("value"), submit = "Enviar" # 对应表单提交按钮的名称 ) # 提交请求,注意补全表单action的完整URL resp <- session_post(sess, url = "https://www.anbima.com.br/informacoes/est-termo/CZ.asp", body = form_data, encode = "form") # 保存CSV文件 writeBin(resp$content, "anbima_data.csv")
如果手动模拟太麻烦,用支持JS的工具
如果不想花时间分析JS逻辑,直接用能模拟浏览器执行JS的R包,比如playwright或RSelenium,操作更直观:
示例(用playwright):
library(playwright) # 初始化浏览器 pw <- playwright$launch() browser <- pw$chromium$launch(headless = FALSE) # 非无头模式可查看操作过程 page <- browser$new_page() # 打开目标页面 page$goto("https://www.anbima.com.br/informacoes/est-termo/default.asp") # 填写表单 page$select_option("#escolha", value = "2") page$select_option("#Idioma", value = "PT") page$select_option("#saida", value = "csv") page$fill("#Dt_Ref", "13/06/2024") # 提交表单(自动触发JS验证函数) page$click("input[type='submit']") # 等待下载完成并保存 download <- page$wait_for_download() download$save_as("anbima_data.csv") # 关闭浏览器 browser$close() pw$stop()
内容的提问来源于stack exchange,提问作者user123456
相关产品推荐
相关产品推荐

