Python抓取tatrabanka.sk汇率报错:数组长度不一致的解决咨询
解决tatrabanka.sk汇率抓取脚本的ValueError问题
问题描述
每日从tatrabanka.sk网站抓取汇率数据,网站更新后Python脚本返回ValueError: All arrays must be of the same length错误,询问处理方法及是否需要改用bs4抓取完整网站。
测试代码
import pandas as pd import numpy as np from datetime import datetime tmp_url = "https://www.tatrabanka.sk/rest/tatra/exchange/list/20.11.2022-00:00" pd.read_json(tmp_url)
报错信息
... ValueError: All arrays must be of the same length
完整脚本
dr = pd.date_range(start = datetime.today().strftime('%m/%d/%Y'), end = datetime.today().strftime('%m/%d/%Y'), freq = '1440min') df_date = pd.to_datetime(dr, format = '%Y-%m-%d').strftime('%d.%m.%Y') df_date = df_date + '-00:00' url_list = 'https://www.tatrabanka.sk/rest/tatra/exchange/list/' + df_date smbl = ["USD", "PLN", "HUF", "CZK", "HRK", "RON"] data = [] tmp_url = "https://www.tatrabanka.sk/rest/tatra/exchange/list/20.11.2022-00:00" pd.read_json(tmp_url) for urls in url_list: print(urls) dft = pd.read_json(urls) dft['DateReal'] = urls[51:61] data.append(dft.loc[dft["feCycd"].isin(smbl)]) out_df = pd.concat(data)
解决方案
1. 报错原因分析
pd.read_json直接解析接口返回的JSON时失败,是因为网站更新后接口返回的JSON结构发生变化,存在长度不一致的数组字段,导致pandas无法直接将其转换为标准DataFrame。
2. 修正JSON解析逻辑
不需要改用bs4,网站仍提供REST接口,只需手动解析JSON结构后再转换为DataFrame:
import pandas as pd import requests from datetime import datetime # 测试接口解析 tmp_url = "https://www.tatrabanka.sk/rest/tatra/exchange/list/20.11.2022-00:00" response = requests.get(tmp_url) json_data = response.json() # 查看返回结构后,提取汇率数据节点(示例假设数据在'exchangeRates'下,需根据实际返回调整) df = pd.DataFrame(json_data['exchangeRates']) print(df.head())
3. 修正完整脚本的URL列表生成逻辑
原脚本中url_list的生成方式错误,会导致遍历的是字符串的每个字符而非完整URL,需调整为列表推导式:
# 生成日期范围 dr = pd.date_range(start=datetime.today().strftime('%m/%d/%Y'), end=datetime.today().strftime('%m/%d/%Y'), freq='1440min') df_date = pd.to_datetime(dr, format='%Y-%m-%d').strftime('%d.%m.%Y') df_date = df_date + '-00:00' # 正确生成URL列表 url_list = ['https://www.tatrabanka.sk/rest/tatra/exchange/list/' + date_str for date_str in df_date] smbl = ["USD", "PLN", "HUF", "CZK", "HRK", "RON"] data = [] for url in url_list: print(url) response = requests.get(url) json_data = response.json() dft = pd.DataFrame(json_data['exchangeRates']) # 替换为实际数据节点 dft['DateReal'] = url[51:61] data.append(dft.loc[dft["feCycd"].isin(smbl)]) out_df = pd.concat(data) print(out_df)
4. 是否需要改用bs4?
不需要。REST接口返回的数据结构虽然变化,但仍结构化,直接解析接口比抓取页面更高效、稳定,且维护成本更低。只有当接口彻底关闭时,再考虑改用bs4抓取页面。
内容的提问来源于stack exchange,提问作者314mip
相关产品推荐
相关产品推荐

