如何在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请求即可完成下载,步骤如下:
- 加载
httr库处理带Cookie的HTTP请求 - 解析响应页面,定位PDF下载按钮对应的链接
- 携带会话Cookie发送请求,确保服务器允许下载
- 将二进制响应内容写入本地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
相关产品推荐
相关产品推荐

