使用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
相关产品推荐
相关产品推荐

