如何将Azure Prices REST API导出为CSV?分页脚本问题排查
Azure Prices API 分页数据导出CSV问题排查与修复
问题分析
你的代码存在三个核心问题:
- 未实现循环请求逻辑:仅调用了一次
GetJSON函数,没有根据返回的NextPageLink持续发起后续请求,自然只能获取第一页数据 - CSV写入覆盖数据:每次调用
to_csv都使用默认的w(覆盖)模式,即使获取多页数据,最终文件也只会保留最后一页内容 - 数据提取错误:接口返回的JSON中,实际价格数据存储在
Items字段下,你直接将整个JSON对象转为DataFrame,会把NextPageLink、Count这些元数据也当成数据行写入,导致格式错误
修正后的代码
import requests import pandas as pd from timeit import default_timer as timer from datetime import timedelta start = timer() next_page_link = "https://prices.azure.com/api/retail/prices" # 初始化空列表存储所有分页数据 all_price_items = [] def fetch_page(page_url): response = requests.get(page_url) response.raise_for_status() # 捕获请求失败的异常 page_data = response.json() # 提取当前页的有效价格数据 all_price_items.extend(page_data['Items']) print(f"已累计获取 {len(all_price_items)} 条数据,耗时: {timedelta(seconds=timer()-start)}") # 返回下一页链接(不存在则返回None) return page_data.get('NextPageLink') # 循环遍历所有分页 while next_page_link: next_page_link = fetch_page(next_page_link) # 将所有数据合并后写入CSV pd.DataFrame(all_price_items).to_csv("azure_prices.csv", index=False, encoding='utf-8-sig') print(f"数据导出完成,总条数: {len(all_price_items)},总耗时: {timedelta(seconds=timer()-start)}")
关键修改说明
- 添加循环逻辑:用
while循环持续调用分页请求函数,直到NextPageLink为空(无后续页面) - 累积数据再写入:先将所有页面的
Items数据存入列表,最后一次性写入CSV,避免重复IO操作和数据覆盖 - 修正数据提取:明确提取
page_data['Items']中的有效价格数据,排除元数据字段 - 添加错误处理:用
response.raise_for_status()捕获请求失败的情况,避免静默报错 - 优化进度监控:显示累计数据条数和耗时,方便跟踪抓取进度
内容的提问来源于stack exchange,提问作者Francesco Mantovani
相关产品推荐
相关产品推荐

