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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:41:33