如何提取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
相关产品推荐
相关产品推荐

