使用GSpread将JSON写入Google Sheet遇问题,含HTTP 403错误求助
解决JSON数据写入Google Sheet及HTTP 403问题
问题拆解
- 初始尝试写入JSON时,因JSON包含列表等复杂数据类型,导致写入失败
- 修改代码后出现
urllib.error.HTTPError: HTTP Error 403: Forbidden,但用requests可正常访问API,说明是urllib默认请求头被服务器拦截
解决方案
1. 替换urllib为requests获取API数据
urllib默认请求头缺少服务器认可的标识,容易被拦截。改用requests库,其默认请求头更符合服务器要求,可直接避免403错误。
2. 统一处理JSON中的复杂数据类型
Google Sheet仅支持字符串、数字等基础类型写入,需将JSON中的列表、字典等复杂类型转换为字符串格式。
修正后的完整脚本
import json import requests import gspread # 初始化Google Sheet连接 gc = gspread.service_account(filename='creds.json') sh = gc.open_by_key('1-1aiGMn2yUWRlh_jnIebcMNs-6phzUNxkktAFH7uY9o') worksheet = sh.sheet1 # 用requests获取API数据,规避403拦截 url = 'https://api.chucknorris.io/jokes/random' response = requests.get(url) data_json = response.json() # 转换JSON数据为Sheet可接受的二维列表格式 result = [] for key, value in data_json.items(): # 处理列表类型,转为逗号分隔字符串 if isinstance(value, list): processed_value = ",".join(map(str, value)) # 处理字典类型,转为JSON字符串 elif isinstance(value, dict): processed_value = json.dumps(value) # 其他类型直接转为字符串 else: processed_value = str(value) result.append([key, processed_value]) # 写入Sheet,指定参数确保内容格式正确 worksheet.update('A1', result, value_input_option='USER_ENTERED')
关键细节说明
requests.get(url):自动适配服务器要求的请求头,解决403问题- 类型转换逻辑:确保所有JSON值都能被Google Sheet识别写入
value_input_option='USER_ENTERED':让Sheet以用户手动输入的逻辑解析内容,避免格式异常
追加数据的替代写法
如果需要每次请求后将数据追加到Sheet末尾,可替换写入部分代码:
# 获取当前Sheet最后一行,从下一行开始写入 last_row = len(worksheet.get_all_values()) + 1 worksheet.update(f'A{last_row}', result, value_input_option='USER_ENTERED')
内容的提问来源于stack exchange,提问作者Anthony Madle
相关产品推荐
相关产品推荐

