调用API存数据到CSV出现JSONDecodeError及多API数据写Excel问题
问题1:JSONDecodeError报错解决方案
- 报错的核心原因是你拿到的响应内容并非合法JSON格式,大概率是请求被接口拦截,返回了空内容、错误页面或者验证页,和浏览器访问结果不一致,常见解决方法如下:
- 添加合法请求头模拟浏览器访问,避免接口拦截:给请求加上
User-Agent字段,示例如下:headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } # 发送请求时带上headers download = s.get(CSV_URL, headers=headers) - 增加响应校验逻辑,先确认请求成功再处理内容:
download = s.get(CSV_URL, headers=headers) # 非200状态码直接抛出异常,方便定位问题 download.raise_for_status() # 可以先打印前100个字符确认返回内容格式,避免把CSV/错误页当成JSON解析 print(download.content[:100]) - 如果你调用的是返回JSON的接口,先确认响应头
Content-Type为application/json再调用download.json()解析,不要强行解析CSV内容为JSON。
- 添加合法请求头模拟浏览器访问,避免接口拦截:给请求加上
问题2:两个API数据写入Excel不同Sheet的实现方案
- 不强制要求用for循环,推荐用
pandas库简化处理逻辑,既可以直接读取接口返回的CSV/JSON格式数据,也可以直接写入指定Sheet,示例代码如下:import pandas as pd import requests # 提前配置两个API的地址、对应Sheet名、请求头等信息 api_config = [ {"url": "第一个API地址", "sheet_name": "Sheet1", "headers": {}}, {"url": "第二个API地址", "sheet_name": "Sheet2", "headers": {}} ] # 写入已有Excel文件,if_sheet_exists参数可控制同名Sheet的处理逻辑,replace为覆盖 with pd.ExcelWriter("你的目标Excel文件名.xlsx", mode='a', engine='openpyxl', if_sheet_exists='replace') as writer: for config in api_config: resp = requests.get(config["url"], headers=config.get("headers", {})) resp.raise_for_status() # 接口返回CSV格式用下面的代码读取 df = pd.read_csv(resp.content) # 接口返回JSON格式用下面的代码读取,可按需调整orient参数适配你的JSON结构 # df = pd.DataFrame(resp.json()) # 写入对应Sheet,index=False代表不写入pandas默认的索引列 df.to_excel(writer, sheet_name=config["sheet_name"], index=False) - 上述示例用for循环遍历配置的API列表,代码更简洁易维护;如果不想用for循环,也可以单独写两次读写逻辑分别处理两个接口,功能上没有差异。
内容的提问来源于stack exchange,提问作者Rahul Vaidya
相关产品推荐
相关产品推荐

