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

Python3.9运行Google财经日内数据抓取代码报Length mismatch错误如何解决

错误根因

你遇到的ValueError: Length mismatch: Expected axis has 0 elements, new values have 6 elements报错,直接触发原因是parsedData为空列表,转换为pandas DataFrame后是0列的空结构,此时强制赋值6个列名触发长度不匹配。
导致parsedData为空的核心原因有两个:

  • 代码中URL拼接错误使用了HTML转义符&,Python3的requests库不会自动解析这类转义符,实际请求的URL格式不符合要求,无法拿到正确数据
  • 谷歌公开的finance/getprices接口早已下线,即使修复URL格式也无法获取到对应的行情返回
Python3.9适配修改点
  • 修正URL拼接逻辑,把所有&替换为标准参数分隔符&
  • 增加请求状态、字段合法性、空数据校验逻辑,避免异常场景下触发报错
  • 若要保留获取日内数据的功能,需替换为雅虎财经、Alpha Vantage等当前可用的行情数据源

修复基础逻辑后的参考代码

import datetime
import pandas as pd
import requests

def getGoogleIntradayData(ticker,numSeconds,numDays):
    parsedData = []
    syncChar = 'a'
    numSkipLines = 7

    # 修复URL拼接的转义符问题
    urlStr = 'http://www.google.com/finance/getprices?q='
    urlStr += ticker
    urlStr += '&i=' + str(numSeconds)
    urlStr += '&p=' + str(numDays) + 'd'
    urlStr += '&f=d,o,h,l,c,v'

    resp = requests.get(urlStr)
    # 增加请求状态校验
    if resp.status_code != 200:
        print(f"请求失败,状态码:{resp.status_code}")
        return pd.DataFrame(columns=['open', 'high', 'low', 'close', 'volume'])
    
    rawData = resp.text
    lines = rawData.split('\n')
    nrows = len(lines)
    
    for i in range(numSkipLines,nrows):
        if lines[i].strip() == "": 
            continue
        split_data = lines[i].split(',')
        # 增加字段数量校验,避免解析报错
        if len(split_data) != 6:
            continue
        dtField, o, h, l, c, v = split_data
        if dtField[0]==syncChar:
            dtBase = dtField[1:]
            dtIncr = 0
        else:
            try:
                dtIncr = int(dtField)
            except:
                continue
        try:
            dtValue = datetime.datetime.fromtimestamp(
                float(dtBase) + (dtIncr*numSeconds)
            )
            o, h, l, c = [float(x) for x in [o, h, l, c]]
            parsedData.append((dtValue, o, h, l, c, v))
        except:
            continue
    
    # 空数据判断
    if not parsedData:
        print("未获取到有效行情数据,谷歌Finance接口已下线建议更换数据源")
        return pd.DataFrame(columns=['open', 'high', 'low', 'close', 'volume'])
        
    qt = pd.DataFrame(parsedData, columns=['datetime', 'open', 'high', 'low', 'close', 'volume'])
    qt.index = qt.datetime
    del qt['datetime']
    return qt    

qtIntra = getGoogleIntradayData('AAPL',300,5)
print(type(qtIntra))
print(qtIntra.head())
print(qtIntra.tail())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:36:04