R语言使用RCurl、httr下载网站CSV文件失败问题求助
问题根因
- RCurl抛出
tlsv1 alert protocol version错误的原因是目标站点仅支持TLS 1.2及以上版本协议,RCurl默认使用的低版本TLS协议无法完成握手,httr默认适配高版本TLS因此可以正常建立连接。 - 你当前使用的下载URL包含
#锚点标识,该部分内容仅用于浏览器前端页面路由,不会发送到服务端,因此实际请求返回的是站点首页HTML内容,并非你需要的CSV文件。
修复方案
该数据集托管于Tableau公共视图,需要构造符合Tableau服务端导出规则的请求,修改后的可运行代码如下:
library(httr) # 替换前端路由URL为Tableau服务端可识别的导出路径 export_url <- "https://report.acr.org/t/PUBLIC/views/NRDRLCSLocator/ADownload.csv" resp <- GET( export_url, # 模拟浏览器请求头,避免被反爬策略拦截 add_headers( "User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" ), # 配置Tableau CSV导出所需的固定参数 query = list( `:format` = "csv", `:showVizHome` = "no" ), write_disk(tf <- tempfile(fileext = ".csv"), overwrite = TRUE) ) # 校验返回内容格式后读取数据 if (http_type(resp) == "text/csv") { lcsr <- read.csv(tf, check.names = FALSE) } else { stop("导出失败,请检查请求参数是否正确") }
注意事项
- 不要直接复制浏览器地址栏中带
#的页面URL作为数据下载地址,Tableau服务端导出接口需要使用不带前端路由的视图路径 - 如果后续出现请求被拦截的情况,可以从浏览器F12开发者工具的网络面板中,复制同域请求的Cookie值加入请求头即可正常导出
内容的提问来源于stack exchange,提问作者Todd Burus
相关产品推荐
相关产品推荐

