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

如何在R中从需验证URL下载Medicare临床实验室收费表文件?

解决Medicare临床实验室收费表ZIP下载的许可验证问题

嘿,这个问题我太熟悉了!Medicare的这个许可验证页面确实会卡住默认的download.file()函数——因为它需要你提交一个表单来确认接受许可,而不是直接访问文件的原始URL。download.file()只会发送简单的GET请求,处理不了这种需要交互的表单提交,所以才会下载到验证页面的HTML。

下面给你几个靠谱的解决办法:

方法1:用httr包模拟表单提交(最推荐)

httr包能帮你模拟浏览器的行为,先处理许可验证的表单提交,再跟随重定向获取实际的ZIP文件。

首先,你需要先确认许可页面里的表单参数。一般来说,那个「Accept」按钮对应的表单字段是submit=Accept,但如果页面是ASP.NET做的,可能还有隐藏的__VIEWSTATE之类的字段,这时候可以用html_form()来自动解析:

library(httr)
library(rvest)  # 用于解析HTML表单

# 替换成你实际的许可页面URL
license_url <- "http://www.cms.gov/apps/ama/license.asp?..."

# 第一步:获取许可页面并解析表单
page <- GET(license_url)
form <- html_form(page)[[1]]  # 假设页面上只有一个表单

# 第二步:填写表单,选择「Accept」选项
filled_form <- set_values(form, submit = "Accept")

# 第三步:提交表单,跟随重定向到ZIP文件
response <- submit_form(page, filled_form, submit = "submit")

# 检查请求是否成功(如果失败会抛出错误)
stop_for_status(response)

# 第四步:将响应内容保存为ZIP文件
writeBin(content(response, "raw"), "clinical_lab_fee_schedule.zip")

如果页面没有复杂的隐藏字段,也可以直接用POST请求简化操作:

library(httr)

license_url <- "http://www.cms.gov/apps/ama/license.asp?..."

# 直接提交Accept表单,跟随重定向
response <- POST(license_url,
                 body = list(submit = "Accept"),
                 encode = "form",
                 followlocation = TRUE)

stop_for_status(response)
writeBin(content(response, "raw"), "clinical_lab_fee_schedule.zip")

方法2:用curl包处理(更底层的方式)

如果你习惯curl的思路,curl包也能轻松搞定,它支持表单提交和自动跟随重定向:

library(curl)

# 创建curl句柄,开启重定向
handle <- new_handle(followlocation = TRUE)
# 设置要提交的表单字段
handle_setform(handle, submit = "Accept")

# 下载文件
curl_download(license_url, destfile = "clinical_lab_fee_schedule.zip", handle = handle)

为什么download.file()搞不定?

简单来说,download.file()默认只发送GET请求,而这个许可验证需要发送POST请求来提交「Accept」的表单数据,同时还要处理页面的重定向。它没有内置处理表单交互的能力,所以只能拿到验证页面的HTML,而不是目标ZIP文件。

内容的提问来源于stack exchange,提问作者Jared Marx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:54:10