R语言使用read.csv读取指定URL文件失败,RCurl的getURL也无效
解决CBOE VXTH数据导入失败的问题
我之前也踩过类似的坑,你遇到的问题主要有两个核心原因:一是用了错误的函数处理Excel格式文件,二是CBOE的服务器会拦截没有合适请求头的自动化请求。下面给你几个靠谱的解决方案:
方法1:用httr+readxl直接读取(推荐)
这个方法不需要下载文件到本地,先模拟浏览器请求获取文件内容,再用Excel专用包解析:
首先安装需要的依赖包:
install.packages(c("httr", "readxl"))
然后运行以下代码:
library(httr) library(readxl) # 构造请求头,模拟正常浏览器访问,避免被服务器拦截 browser_headers <- add_headers( "User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" ) # 发送请求获取文件 response <- GET("https://www.cboe.com/publish/vxthdata/vxth_dailydata.xls", browser_headers) # 检查请求是否成功,如果失败会直接报错提示 stop_for_status(response) # 从响应的二进制内容中读取Excel数据 vxth_data <- read_excel(content(response, "raw")) # 验证数据是否正常加载 head(vxth_data)
方法2:先下载文件到本地再读取
如果你更习惯本地文件操作,可以先把文件下载到电脑,再读取:
library(httr) library(readxl) browser_headers <- add_headers( "User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" ) # 下载文件到当前工作目录,覆盖已存在的同名文件 GET( "https://www.cboe.com/publish/vxthdata/vxth_dailydata.xls", browser_headers, write_disk("vxth_dailydata.xls", overwrite = TRUE) ) # 读取本地Excel文件 vxth_data <- read_excel("vxth_dailydata.xls")
为什么之前的方法不行?
read.csv()是专门处理**逗号分隔的文本文件(.csv)**的,而你要导入的是二进制的Excel文件(.xls),直接用它会把二进制内容当成乱码文本读取,自然失败。- RCurl的
getURL()默认返回文本内容,同样无法处理二进制Excel文件;而且没有设置模拟浏览器的请求头,CBOE的服务器会识别出这是自动化请求,直接拒绝或者返回错误内容。
内容的提问来源于stack exchange,提问作者Mehdi Zare
相关产品推荐
相关产品推荐

