使用R语言httr包GET方法下载NSE CSV文件失败的解决咨询
问题:使用httr从NSE存档网站下载CSV时遭遇连接重置错误
我在R语言中尝试从印度国家证券交易所(NSE)存档网站下载CSV文件,使用的代码如下:
downloadfilename = paste("sec_bhavdata_full_", (format(myDate, "%d%m%Y")), ".csv", sep = "") myURL = paste("https://nsearchives.nseindia.com/products/content/", downloadfilename, sep = "") GET(myURL, user_agent("Mozilla/5.0"), write_disk(downloadfilename))
运行后收到错误:
Error in curl::curl_fetch_memory(url, handle = handle) :
Recv failure: Connection was reset
示例URL为:
https://nsearchives.nseindia.com/products/content/sec_bhavdata_full_24092024.csv
请问是否可以使用library(httr)完成该CSV文件的下载?该如何解决当前的连接重置问题?
解决方案
可以用httr完成下载,连接重置问题大概率是NSE服务器的反爬机制或连接参数配置导致的,以下是几种可行修复方案:
1. 完善请求头信息
NSE服务器会校验请求头的完整性,仅设置user_agent可能不足以通过验证,添加更多浏览器请求头字段模拟真实访问:
library(httr) myDate <- as.Date("2024-09-24") downloadfilename <- paste0("sec_bhavdata_full_", format(myDate, "%d%m%Y"), ".csv") myURL <- paste0("https://nsearchives.nseindia.com/products/content/", downloadfilename) # 构建完整请求头 request_headers <- add_headers( `User-Agent` = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36", `Accept` = "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", `Referer` = "https://www.nseindia.com/", `Accept-Language` = "en-US,en;q=0.5" ) # 发起请求并保存文件 GET(myURL, request_headers, write_disk(downloadfilename, overwrite = TRUE))
2. 添加请求延迟
频繁请求会触发服务器限流,在请求前添加随机延迟规避爬虫识别:
# 在GET请求前添加1-3秒的随机延迟 Sys.sleep(runif(1, 1, 3)) GET(myURL, request_headers, write_disk(downloadfilename, overwrite = TRUE))
3. 调整连接超时参数
连接重置可能是TCP连接超时导致的,通过config设置更长的超时时间:
GET(myURL, request_headers, config(timeout = 30), # 设置30秒超时阈值 write_disk(downloadfilename, overwrite = TRUE))
4. 验证URL有效性
确认生成的URL对应日期存在NSE存档,节假日或非交易日可能没有对应的CSV文件,这种情况也会触发连接类错误。
内容的提问来源于stack exchange,提问作者R Subroto
相关产品推荐
相关产品推荐

