You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 23:00:31