API数据获取遇连接超时:R代码报错解决方案求助
问题描述
运行以下R代码获取交易所数据时,出现连接超时错误,无法建立与NASDAQ API的连接:
library(tidyquant) library(jsonlite) library(tidyverse) library(readr) library(igraph) library(dplyr) library(lubridate) library(data.table) Sp500 <- tq_index("SP500") %>% add_column(exchange = "SP500") sp400 <- tq_index("SP400") %>% add_column(exchange = "SP400") sp600 <- tq_index("SP600") %>% add_column(exchange = "SP600") NASDAQ <-tq_exchange("NASDAQ") %>% add_column(exchange = "NASDAQ") NYSE<-tq_exchange("NYSE")%>% add_column(exchange = "NYSE") #Rus2000 <- tq_index("RUSSELL2000") %>% add_column(exchange = "RUSSELL2000") #Rus1000 <- tq_index("RUSSELL1000") %>% add_column(exchange = "RUSSELL1000") tickers <- rbind(NASDAQ,NYSE) str(tickers)
报错信息:
> NASDAQ <-tq_exchange("NASDAQ") %>% add_column(exchange = "NASDAQ") Getting data... Error in open.connection(con, "rb") : cannot open the connection to 'https://api.nasdaq.com/api/screener/stocks?tableonly=true&exchange=nasdaq&download=true' In addition: Warning message: In open.connection(con, "rb") : URL 'https://api.nasdaq.com/api/screener/stocks?tableonly=true&exchange=nasdaq&download=true': Timeout of 60 seconds was reached
解决方法
检查网络可用性
先在浏览器中直接访问报错里的API链接,确认网络能正常连接到该地址。如果无法访问,可能是网络限制(如防火墙、地区封锁),需要调整网络设置。延长请求超时时间
tidyquant底层依赖httr包发起请求,默认超时60秒。可以通过设置全局超时或自定义请求来延长:# 设置全局超时为120秒 options(httr_timeout = 120) # 或者自定义tq_exchange的请求参数,手动添加超时 library(httr) NASDAQ <- tq_exchange("NASDAQ", get = "stock.screener", options = list(timeout = timeout(120))) %>% add_column(exchange = "NASDAQ")更新tidyquant包
旧版本的tidyquant可能存在API适配问题,更新到最新版本:install.packages("tidyquant")模拟浏览器请求头
部分API会拦截非浏览器的请求,可手动设置User-Agent模拟浏览器:# 定义自定义请求头 ua <- 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") # 用httr直接请求API,再解析数据 response <- GET("https://api.nasdaq.com/api/screener/stocks?tableonly=true&exchange=nasdaq&download=true", ua, timeout(120)) data <- fromJSON(content(response, "text")) NASDAQ <- data$data$table$rows %>% as_tibble() %>% add_column(exchange = "NASDAQ")添加重试机制
临时网络波动可能导致超时,用tryCatch或purrr::possibly实现重试:library(purrr) # 定义带重试的获取函数 get_exchange_data <- possibly(function(exchange_name) { tq_exchange(exchange_name) %>% add_column(exchange = exchange_name) }, otherwise = NULL) # 重试3次 NASDAQ <- NULL for (i in 1:3) { NASDAQ <- get_exchange_data("NASDAQ") if (!is.null(NASDAQ)) break Sys.sleep(2) # 每次重试间隔2秒 }
内容的提问来源于stack exchange,提问作者ebrahimi
相关产品推荐
相关产品推荐

