代码如下:
pythonimport 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 许可协议。转载请注明出处!