调用无筛选条件的Azure零售价格API拉取数据报错,求解决方案指导
故障原因
- 无筛选条件调用Azure Retail Prices API时,接口会返回全量全球Azure服务定价数据,总数据量超千万条,分页请求次数极多,很容易触发API限流规则(返回429状态码)或请求超时,这是报错的核心原因
- 代码已导入重试模块但未实际启用,请求失败后无容错机制直接中断
- 代码存在逻辑冗余:第一页返回的Items数据会被先后添加两次,生成的结果存在大量重复数据
- 代码中写入文件用的
folder目录如果未提前在本地创建,会触发路径不存在的IO错误
修复步骤
优先给API请求添加筛选条件,大幅减少数据返回量。比如你文件名标注要拉美国中南部的虚拟机价格,可以将初始请求地址替换为带筛选的地址:
https://prices.azure.com/api/retail/prices?$filter=serviceName eq 'Virtual Machines' and armRegionName eq 'southcentralus'
如果确实需要全量数据,可以拆分筛选条件分批次拉取,比如按区域、按服务类型拆分请求,避免单次任务请求量过大。使用修复后的代码,新增重试逻辑、超时设置、路径校验,同时修复重复添加数据的问题:
import requests import json import pandas as pd import os from requests.adapters import HTTPAdapter from requests.packages.urllib3.util.retry import Retry # 配置重试策略 session = requests.Session() retry_strategy = Retry( total=5, # 最多重试5次 backoff_factor=1, # 重试间隔:1s, 2s, 4s... status_forcelist=[429, 500, 502, 503, 504] # 这些状态码触发重试 ) adapter = HTTPAdapter(max_retries=retry_strategy) session.mount("https://", adapter) session.mount("http://", adapter) # 带筛选的API地址,可根据需求修改筛选条件 api_url = "https://prices.azure.com/api/retail/prices?$filter=serviceName eq 'Virtual Machines' and armRegionName eq 'southcentralus'" filename = 'azureretailprices_vm_scus' # 确保存储目录存在 save_folder = 'folder' os.makedirs(save_folder, exist_ok=True) priceitems = [] response = session.get(api_url, timeout=30) # 循环拉取所有分页数据 while True: resp_json = response.json() # 加入当前页数据 for item in resp_json['Items']: priceitems.append(item) # 没有下一页就退出 next_link = resp_json.get('NextPageLink') if not next_link: break # 拉取下一页 print(f"拉取下一页:{next_link}") response = session.get(next_link, timeout=30) # 保存JSON文件 with open(os.path.join(save_folder, f"{filename}.json"), 'w', encoding='utf-8') as f: json.dump(priceitems, f, ensure_ascii=False, indent=2) # 转存Excel df = pd.json_normalize(priceitems) df.to_excel(os.path.join(save_folder, f"{filename}.xlsx"), sheet_name='RetailPrices', index=False)
- 运行修复后的代码即可正常拉取数据,不会触发报错。
内容的提问来源于stack exchange,提问作者kakaji
相关产品推荐
相关产品推荐

