Python中yfinance获取数据总是遇到too many request错误无法获取价格怎么办?

这问题都出现半年了。尝试用 AI 解决,给我试了半天还都是 too many request.

我的网络是可以用 gemini cli 之类的,按理说应该不是网络问题啊。

简单测试代码如下:

import yfinance as yf
import pandas as pd

设置永辉超市的股票代码

ticker = “601933.SS” # .SS 表示上海证券交易所

创建 yfinance 对象

stock = yf.Ticker(ticker)

获取实时价格(最新收盘价或当前价格,视市场情况而定)

current_price = stock.history(period=“1d”)[“Close”].iloc[-1]

获取股票的详细信息(包括公司名称等)

info = stock.info

输出结果

print(f"永辉超市 ({ticker}) 的实时价格: {current_price:.2f} CNY") print(f"公司名称: {info.get(‘shortName’, ‘未知’)}")

运行就直接报错:

 line 11, in <module>
    current_price = stock.history(period="1d")["Close"].iloc[-1]
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/anaconda3/lib/python3.12/site-packages/yfinance/utils.py", line 103, in wrapper
    result = func(*args, **kwargs)
             ^^^^^^^^^^^^^^^^^^^^^
  File "/opt/anaconda3/lib/python3.12/site-packages/yfinance/base.py", line 91, in history
    return self._lazy_load_price_history().history(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/anaconda3/lib/python3.12/site-packages/yfinance/utils.py", line 103, in wrapper
    result = func(*args, **kwargs)
             ^^^^^^^^^^^^^^^^^^^^^
  File "/opt/anaconda3/lib/python3.12/site-packages/yfinance/scrapers/history.py", line 178, in history
    data = get_fn(
           ^^^^^^^
  File "/opt/anaconda3/lib/python3.12/site-packages/yfinance/utils.py", line 103, in wrapper
    result = func(*args, **kwargs)
             ^^^^^^^^^^^^^^^^^^^^^
  File "/opt/anaconda3/lib/python3.12/site-packages/yfinance/data.py", line 364, in get
    return self._make_request(url, request_method = self._session.get, user_agent_headers=user_agent_headers, params=
params, timeout=timeout)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/anaconda3/lib/python3.12/site-packages/yfinance/utils.py", line 103, in wrapper
    result = func(*args, **kwargs)
             ^^^^^^^^^^^^^^^^^^^^^
  File "/opt/anaconda3/lib/python3.12/site-packages/yfinance/data.py", line 424, in _make_request
    raise YFRateLimitError()
yfinance.exceptions.YFRateLimitError: Too Many Requests. Rate limited. Try after a while.

这要怎么解决呢,难道 yahoo 的 API 封这么严重啊。有没有知道怎么解决的老兄啊,感谢!


Python中yfinance获取数据总是遇到too many request错误无法获取价格怎么办?

17 回复

本来就不支持 A 股和港股的 tick 。只有美股有 tick 数据。


用yfinance遇到429错误(Too Many Requests)主要是因为请求太频繁触发了雅虎的限流。这破事儿挺常见的,雅虎那边对免费API的限制越来越严。

最直接的解决办法就是加个重试机制和随机延迟,模拟真人操作。别用那些花里胡哨的代理池,对于简单数据抓取来说维护成本太高。这里给你个我常用的代码片段,核心是用requests库自定义下载器,配合retrytime.sleep

import yfinance as yf
import time
import random
from requests import Session
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

# 1. 创建带重试机制的自定义session
session = Session()
retry = Retry(total=3, backoff_factor=1, status_forcelist=[429, 500, 502, 503, 504])
session.mount('https://', HTTPAdapter(max_retries=retry))
session.mount('http://', HTTPAdapter(max_retries=retry))

# 2. 设置请求头,模拟浏览器
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
session.headers.update(headers)

# 3. 下载数据时使用自定义session
ticker = yf.Ticker("AAPL", session=session)

# 4. 在批量下载时添加随机延迟
def safe_download(ticker_symbol):
    try:
        data = yf.download(ticker_symbol, period="1mo", progress=False)
        time.sleep(random.uniform(1, 3))  # 关键:随机等待1-3秒
        return data
    except Exception as e:
        print(f"下载 {ticker_symbol} 失败: {e}")
        return None

# 示例:批量下载多个股票
symbols = ["AAPL", "MSFT", "GOOGL"]
for symbol in symbols:
    df = safe_download(symbol)
    if df is not None:
        print(f"{symbol} 数据形状: {df.shape}")

如果这样还是频繁被拦,可以试试用yfinancedownload函数一次性拉取多个股票,这比循环调用Ticker对象更高效,因为它是单次请求获取多个代码的数据。另外,检查一下你是不是在短时间内在循环里疯狂调接口,如果是历史数据回测,建议一次性拉取更长时间段的数据,而不是分成很多小段去请求。

简单说就是:加延迟、用重试、合并请求。

高频包括 tick 级别的数据,都是网络里最宝贵的资源,你甚至花钱都不知道去哪里获取。虽然不如 alpha 因子 珍贵,但是要得到也是要费不少时间和精力的,所有开源的这些封装都是忽悠人的。

如果需要可以私我 可以提供 tick 数据

yfinance.exceptions.YFRateLimitError: Too Many Requests. Rate limited.

超过服务器配置的每秒请求的数量了

秒级的数据都可以获取,为什么只用 yfinance

yfinance 就是经常超时。现在免费的数据接口越来越少了,质量好一些的都需要付费。最近我都在考虑要不要付费开通下 tushare 的权限了。

https://query1.finance.yahoo.com

User-Agent curl/7.68.0


api 改了,需要加个 UserAgent 。苹果也用的 yahoo 的接口。

自测黄金还能用 代号是:GC=F ,SGC=F 和 SGU=F

金融领域 整理好没有出错的数据,就相当难得了,很多数据源压根就没人维护,甚至还有很多错误,像是拆股后,前复权后复权 都没人弄

useragent 写错了

Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:136.0) Gecko/20100101 Firefox/136.0

你弄疼人家了还不让人家叫

tushare 冲一个会员吧

好的谢谢我试试

限流很正常啊,毕竟是爬虫。我都是搭好几个混着用的。

免费还是收费?

这些数据源很容易变化,开源库要赶着更新才行

回到顶部