使用R的download.file下载xls文件异常问题求助
解决R download.file下载xls返回HTML页面的问题
嘿,我之前碰到过一模一样的情况!这绝对是目标网站的用户代理检测在搞鬼——它把download.file默认的请求识别成了非浏览器请求,所以给你返回了那个“浏览器不被支持”的HTML页面,而不是真实的xls文件,这就是为什么下载的文件体积远小于正常文件的原因。
下面给你几个可行的解决方案,适配你用的Windows 10 + R 3.4.4环境:
方案1:用base R的download.file模拟浏览器UA
R的download.file默认的User-Agent是带有R版本标识的,很容易被网站识别。我们可以手动设置一个浏览器的UA字符串,让网站以为请求来自Chrome这类主流浏览器。
方法A:使用curl(需系统安装curl)
# 复制一个Chrome浏览器的User-Agent(也可换成Firefox的) browser_ua <- "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" # 用curl方法下载,传递UA头 download.file( url = "你的目标xls文件URL", destfile = "C:/你要保存的路径/file.xls", method = "curl", extra = paste0("-A '", browser_ua, "'") )
方法B:使用wininet(Windows默认方法)
Windows下download.file默认用wininet,可以尝试强制使用IE的网络设置并添加UA头:
# 启用IE兼容的网络访问 setInternet2(use = TRUE) browser_ua <- "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" download.file( url = "你的目标xls文件URL", destfile = "C:/你要保存的路径/file.xls", headers = c("User-Agent" = browser_ua) )
方案2:用httr包(更可靠的HTTP请求工具)
base R的download.file在处理复杂请求时局限性比较大,推荐用httr包来发送请求,它对请求头的控制更灵活:
# 先安装httr(如果还没装的话) install.packages("httr") library(httr) browser_ua <- "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" # 发送请求并保存文件到本地 GET( url = "你的目标xls文件URL", user_agent(browser_ua), # 设置UA write_disk("C:/你要保存的路径/file.xls", overwrite = TRUE) # 写入磁盘 )
为什么会出现这个问题?
大部分网站会通过检查请求头里的User-Agent字段来判断请求是否来自合法的浏览器。R的download.file默认发送的UA是类似"R (3.4.4 x86_64-w64-mingw32 x86_64 mingw32)",网站会把这种请求当成爬虫或者非标准客户端,直接返回拦截页面,也就是你下载到的那个小体积HTML文件。
内容的提问来源于stack exchange,提问作者Konstantin Taranov
相关产品推荐
相关产品推荐

