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

批量爬取Yahoo Finance数据遇ValueError:高量股票代码报错

解决大量股票代码请求时的ValueError问题

错误原因

一次性请求10000+股票代码时,要么是大量股票无有效估值数据,导致faang.valuation_measures返回空字典/标量;要么是Yahoo接口对批量请求做了限制,返回数据格式异常,直接传给pd.DataFrame()就会触发这个错误。

解决方案

1. 先校验返回数据有效性

转换DataFrame前先检查估值数据格式,避免空数据报错:

import pandas as pd
from yahooquery import Ticker

symbols = ['AAPL','GOOG','MSFT'] + ['无效代码']*10000  # 模拟大量代码场景
faang = Ticker(symbols)
val_measures = faang.valuation_measures

# 判断数据是否为可迭代的有效格式
if isinstance(val_measures, (list, pd.core.frame.DataFrame)):
    df = pd.DataFrame(val_measures)
else:
    # 空数据时创建指定列的空DataFrame
    df = pd.DataFrame(columns=['symbol', 'marketCap', 'peRatio', 'pbRatio'])  # 按需定义列名

df.to_excel('output.xlsx')

2. 分批次处理大量股票

一次性请求太多代码易触发接口限制,分批次请求更稳定:

import pandas as pd
from yahooquery import Ticker
import time

symbols = ['AAPL','GOOG','MSFT'] + ['其他代码']*10000
batch_size = 500  # 每批次请求500个,可根据实际调整
all_data = []

for i in range(0, len(symbols), batch_size):
    batch_symbols = symbols[i:i+batch_size]
    ticker = Ticker(batch_symbols)
    val_data = ticker.valuation_measures
    # 仅保留有效数据
    if val_data:
        all_data.extend(val_data)
    time.sleep(1)  # 加延迟避免请求过于频繁

# 合并所有数据,无数据则生成空DataFrame
df = pd.DataFrame(all_data) if all_data else pd.DataFrame()
df.to_excel('output.xlsx')

3. 加入请求重试机制

针对请求失败的批次,添加重试逻辑提升成功率:

import pandas as pd
from yahooquery import Ticker
import time

def get_valuation_batch(batch_symbols):
    max_retries = 3
    for _ in range(max_retries):
        try:
            ticker = Ticker(batch_symbols)
            val_data = ticker.valuation_measures
            return val_data if val_data else []
        except Exception as e:
            print(f"批次请求失败,重试中: {e}")
            time.sleep(2)
    return []

symbols = ['AAPL','GOOG','MSFT'] + ['其他代码']*10000
batch_size = 500
all_data = []

for i in range(0, len(symbols), batch_size):
    batch = symbols[i:i+batch_size]
    data = get_valuation_batch(batch)
    all_data.extend(data)
    time.sleep(1)

df = pd.DataFrame(all_data) if all_data else pd.DataFrame()
df.to_excel('output.xlsx')

内容的提问来源于stack exchange,提问作者HTMLHelpMe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 15:25:18