如何在R中模拟点击网站按钮实现搜索并下载Excel文件?
在R语言中实现EnviroTox Database的搜索与Excel下载
问题描述
需要在R语言中模拟以下操作:
- 访问https://envirotoxdatabase.org,点击「Search」按钮完成搜索
- 点击「Download as Excel File」按钮下载搜索结果文件
查看网页HTML后发现下载按钮对应的<form>标签关联了Python后端脚本,尝试使用httr::POST实现但未成功,原有尝试代码如下:
qurl = 'https://envirotoxdatabase.org' fl = 'test.xlsx' res = httr::POST( qurl, body = list(id = 'a2downloadform', action = 'https://envirotoxdatabase.org/index.php/home/downloadExcelPython', class = 'pull-right'), httr::write_disk(fl, overwrite = TRUE), encode = 'form' )
解决方案
原有代码的核心问题是:POST目标URL错误、表单参数不完整,且未维持搜索与下载的会话关联。以下是修正后的实现步骤:
1. 核心要点
- 必须维持会话状态:搜索结果与下载请求绑定,需用
httr::handle保留会话信息 - 完整获取表单参数:下载表单包含隐藏字段(如CSRF令牌、搜索会话ID),需从网页中解析提取
- 先执行搜索请求,确保会话中存在有效搜索状态后再触发下载
2. 完整实现代码
library(httr) library(rvest) # 初始化会话,维持访问状态 session <- handle("https://envirotoxdatabase.org") # 第一步:执行搜索请求(替换为你的搜索关键词) search_params <- list( query = "your_search_keyword" # 这里填写实际要搜索的内容 ) search_response <- POST( url = "https://envirotoxdatabase.org/index.php/home/search", handle = session, body = search_params, encode = "form" ) # 第二步:解析页面获取下载表单的完整参数 page_content <- read_html(search_response) # 定位到ID为a2downloadform的下载表单 download_form <- html_form(page_content) %>% purrr::keep(~ .x$attrs$id == "a2downloadform") %>% purrr::pluck(1) # 提取表单所有字段的参数值 form_body <- lapply(download_form$fields, function(field) field$value) # 第三步:触发Excel下载 output_file <- "test.xlsx" download_response <- POST( url = download_form$url, handle = session, body = form_body, write_disk(output_file, overwrite = TRUE), encode = "form" ) # 检查下载结果 if (http_status(download_response)$category == "Success") { cat("文件下载成功,路径:", normalizePath(output_file), "\n") } else { cat("下载失败,状态码:", http_status(download_response)$status_code, "\n") }
3. 关键说明
- 搜索请求的URL和参数需根据网页实际的搜索表单调整:可以用浏览器开发者工具(F12)查看搜索按钮提交的请求详情,确认目标URL和参数名
- 如果搜索是GET请求(而非POST),则将
POST改为GET,并将参数放在query参数中而非body - 使用
rvest解析表单能自动获取所有隐藏字段,避免手动构造参数出错
内容的提问来源于stack exchange,提问作者andschar
相关产品推荐
相关产品推荐

