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

如何在R中使用rvest提交表单后模拟点击下载按钮?

半自动CFDI PDF下载实现(无需Selenium)

问题背景

我需要开发一个半自动程序,从墨西哥SAT的CFDI验证页面下载PDF文件。目前已实现自动填充表单、展示验证码并获取用户输入的功能,但不知道如何在不运行Selenium服务器的前提下,完成PDF下载的最后一步。

现有代码

library(rvest)
library(magick)

mihtml = read_html("https://verificacfdi.facturaelectronica.sat.gob.mx/")

imgsrc = mihtml |> html_element("#ctl00_MainContent_ImgCaptcha") |>
  html_attr("src")
imagen = paste0("https://verificacfdi.facturaelectronica.sat.gob.mx/",
       imgsrc)
image_read(imagen)
captcha = readline()
search =  html_form(mihtml)[[1]] |>
  html_form_set("ctl00$MainContent$TxtUUID" = "1DF85D1E-D8A5-45BE-983B-581A941A25DA",
              "ctl00$MainContent$TxtRfcEmisor" = "APU640930KV9", 
              "ctl00$MainContent$TxtRfcReceptor" = "IEC7508071B2",
              "ctl00$MainContent$TxtCaptchaNumbers" = captcha)

resp = html_form_submit(search, submit = "ctl00$MainContent$BtnBusqueda")

# 查看验证结果表格
resp |> read_html() |> 
  html_node(".table") |> html_table()

解决方案:直接提取下载链接并请求文件

无需模拟点击按钮,直接从验证结果页面提取PDF下载链接,利用会话Cookie发送GET请求即可完成下载,步骤如下:

  1. 加载httr库处理带Cookie的HTTP请求
  2. 解析响应页面,定位PDF下载按钮对应的链接
  3. 携带会话Cookie发送请求,确保服务器允许下载
  4. 将二进制响应内容写入本地PDF文件

修改后的完整代码

library(rvest)
library(magick)
library(httr) # 新增:处理HTTP请求和会话Cookie

mihtml = read_html("https://verificacfdi.facturaelectronica.sat.gob.mx/")

imgsrc = mihtml |> html_element("#ctl00_MainContent_ImgCaptcha") |>
  html_attr("src")
imagen = paste0("https://verificacfdi.facturaelectronica.sat.gob.mx/",
       imgsrc)
image_read(imagen)
captcha = readline()
search =  html_form(mihtml)[[1]] |>
  html_form_set("ctl00$MainContent$TxtUUID" = "1DF85D1E-D8A5-45BE-983B-581A941A25DA",
              "ctl00$MainContent$TxtRfcEmisor" = "APU640930KV9", 
              "ctl00$MainContent$TxtRfcReceptor" = "IEC7508071B2",
              "ctl00$MainContent$TxtCaptchaNumbers" = captcha)

resp = html_form_submit(search, submit = "ctl00$MainContent$BtnBusqueda")

# 查看验证结果表格
resp |> read_html() |> 
  html_node(".table") |> html_table()

# --- 新增PDF下载逻辑 ---
# 提取PDF下载链接(根据页面实际元素调整选择器)
pdf_link <- resp %>% 
  read_html() %>% 
  html_element("#ctl00_MainContent_LnkVerPDF") %>% # 验证页面中PDF下载按钮的ID
  html_attr("href")

# 拼接完整的PDF下载URL
full_pdf_link <- paste0("https://verificacfdi.facturaelectronica.sat.gob.mx/", pdf_link)

# 发送GET请求下载PDF,携带会话Cookie保持验证状态
pdf_resp <- GET(full_pdf_link, set_cookies(cookies(resp)))

# 将二进制内容写入本地PDF文件
writeBin(content(pdf_resp, "raw"), "cfdi_document.pdf")

注意事项

  • 确认下载链接选择器:如果#ctl00_MainContent_LnkVerPDF不是正确的元素ID,需要在浏览器开发者工具中查看实际下载按钮的属性,替换为对应的CSS选择器。
  • Cookie保持会话:必须携带resp中的Cookie,否则服务器会拒绝下载请求,因为需要验证会话合法性。
  • 自定义保存路径:可以修改writeBin的第二个参数,指定自定义的保存路径和文件名。

内容的提问来源于stack exchange,提问作者Elio Diaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 11:13:12