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

如何提取API返回的JSON对象数据并将各值写入CSV的不同列

解决方案

核心逻辑:把所有接口返回的JSON对象先统一收集到列表中,最后用pandas直接转换为DataFrame,自动完成键到列名、值到单元格的映射。如果接口返回的是嵌套JSON,用pd.json_normalize()做扁平化处理即可。

原代码可优化点:

  • 循环中反复调用df.to_csv()完全没有必要,额外消耗IO性能
  • df.append()已被pandas官方废弃,且循环拼接DataFrame的性能远低于先存列表再统一转换
  • 没有处理接口请求失败返回None的场景,拼接时会抛出异常

优化后代码

import requests
import pandas as pd

# 请替换为实际起始ID
booking_id = x 
# 请替换为实际遍历总次数
y = 100 
# 请替换为实际API前缀
base_url = "你的API前缀" 

HEADERS = {'user-agent': ('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5)'
                          'AppleWebKit/537.36 (KHTML, like Gecko)'
                          'Chrome/45.0.2454.101 Safari/537.36'),
                          'referer': 'https://book.nightsbridge.com/'}

def get_data(url):
    try:
        response = requests.get(url, headers=HEADERS, timeout=10)
        if response.status_code == 200:
            return response.json()
        else:
            print(f"请求{url}失败,状态码:{response.status_code},返回内容:{response.text}")
            return None
    except Exception as e:
        print(f"请求{url}出现异常:{str(e)}")
        return None

# 先把所有数据存在列表里,性能更高
data_list = []

for i in range(y):
    booking_url = base_url + str(booking_id)
    data = get_data(booking_url)
    # 请求成功才加入列表
    if data:
        data_list.append(data)
    booking_id +=1

# 核心:扁平化JSON,自动把所有键转为列名,值对应到单元格
# 如果是单层JSON,也可以直接用 df = pd.DataFrame(data_list) 效果一样
df = pd.json_normalize(data_list)

# 最后统一导出
df.to_csv('filename1.csv', index=False, encoding='utf-8-sig')
df.to_excel('filename2.xlsx', index=False)

关键说明

  • pd.json_normalize() 会自动处理嵌套JSON,比如嵌套的{"user":{"name":"张三","age":18}}会被展开为user.name、user.age两列,完全满足每个值对应独立单元格的需求。
  • 加入了超时和异常捕获,避免请求超时直接中断整个采集流程。
  • 最后导出时加了index=False避免多出一列无用的行号列,encoding='utf-8-sig'保证中文在Excel中打开CSV不会乱码。

内容的提问来源于stack exchange,提问作者weylandswart

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 18:06:01