如何在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
相关产品推荐
相关产品推荐

