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

使用R语言download.file下载文件时获取旧版本的问题

解决R中download.file无法获取最新文件的问题

问题出在download.file默认的HTTP请求头没有携带强制服务器跳过缓存的指令——虽然你设置了cacheOK=FALSE,但这个参数只控制R本地的缓存,无法影响服务器端的缓存策略。浏览器能拿到最新文件,是因为它默认会发送缓存控制相关的请求头,让服务器返回最新版本。

下面是两种可靠的解决方法:

方法1:使用httr包发送带缓存控制头的请求

httr包能更灵活地控制HTTP请求头,强制服务器返回最新文件:

# 首次使用先安装httr
# install.packages("httr")
library(httr)

report <- "MWTS"
url <- paste0("http://www.census.gov/econ_getzippedfile/?programCode=", report)
zip_path <- paste0(report, "-mf.zip")

# 发送请求,添加缓存控制头
response <- GET(url, add_headers(
  `Cache-Control` = "no-cache",
  `Pragma` = "no-cache",
  `If-Modified-Since` = "Thu, 01 Jan 1970 00:00:00 GMT"
))

# 确保请求成功,失败则抛出错误
stop_for_status(response)

# 将响应内容写入zip文件
writeBin(content(response, "raw"), zip_path)

# 读取csv文件
file.raw <- readLines(unz(zip_path, paste0(report, "-mf.csv")))

添加的请求头作用:

  • Cache-Control: no-cache:告诉服务器必须验证缓存内容是否最新,不直接返回缓存
  • Pragma: no-cache:兼容旧版HTTP协议的缓存控制逻辑
  • If-Modified-Since:设为1970年,确保服务器认为本地无有效缓存,直接返回最新文件

方法2:使用curl包控制请求头

如果习惯用curl工具,也可以用curl包实现同样效果:

# 首次使用先安装curl
# install.packages("curl")
library(curl)

report <- "MWTS"
url <- paste0("http://www.census.gov/econ_getzippedfile/?programCode=", report)
zip_path <- paste0(report, "-mf.zip")

# 创建请求句柄,添加缓存控制头
h <- new_handle()
handle_setheaders(h,
  "Cache-Control" = "no-cache",
  "Pragma" = "no-cache"
)

# 下载文件
curl_download(url, zip_path, handle = h)

# 读取csv文件
file.raw <- readLines(unz(zip_path, paste0(report, "-mf.csv")))

用这两种方法下载后,再执行grep("^371", file.raw)应该就能得到预期的数百个结果了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 12:30:42