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
相关产品推荐
相关产品推荐

