编辑
2025-02-28
技术
00
请注意,本文编写于 352 天前,最后修改于 352 天前,其中某些信息可能已经过时。

代码如下:

python
import requests import pandas as pd from requests.exceptions import RequestException def safe_json_to_excel(url, output_file, timeout=10): try: # 添加浏览器指纹头 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', 'Accept': 'application/json' } response = requests.get(url, headers=headers, timeout=timeout) response.raise_for_status() data = response.json() # 处理不同API返回结构 if isinstance(data, dict): if 'data' in data: # 常见结构1:{data: [...]} # 检查是否存在嵌套的字典列表 nested_columns = [] sample_data = data['data'][0] if data['data'] else {} for key, value in sample_data.items(): if isinstance(value, list) and value and isinstance(value[0], dict): nested_columns.append(key) if nested_columns: # 对每个包含嵌套字典的列进行展开 dfs = [] for col in nested_columns: # 首先创建基础DataFrame base_df = pd.json_normalize(data['data']) # 展开嵌套列 expanded_data = [] for idx, row in base_df.iterrows(): if isinstance(row[col], list): for item in row[col]: if isinstance(item, dict): new_row = row.drop(col).to_dict() new_row.update(item) expanded_data.append(new_row) if expanded_data: df_nested = pd.DataFrame(expanded_data) dfs.append(df_nested) # 合并所有展开的数据框 if dfs: df = pd.concat(dfs, axis=0, ignore_index=True) else: df = pd.json_normalize(data['data']) else: df = pd.json_normalize(data['data']) elif 'items' in data: # 常见结构2:{items: [...]} df = pd.json_normalize(data['items']) else: df = pd.json_normalize(data) else: df = pd.json_normalize(data) # 保存结果 df.to_excel(output_file, index=False, engine='openpyxl') print(f"成功保存 {len(df)} 行数据") except RequestException as e: print(f"请求失败: {str(e)}") except ValueError: print("响应不是有效JSON") except KeyError as e: print(f"JSON结构异常,缺少关键字段: {str(e)}") # 使用示例 safe_json_to_excel( url="https://srv1.te-germany.com/DataSourceContainerTracingPublic/Get?customerId=459&apiKey=", output_file="container_tracing.xlsx" )

本文作者:ivan

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!