调用JSON接口遇HTTP Error 403,求解决写入Google Sheet问题
解决API请求403 Forbidden并写入Google Sheet的方案
问题根源
目标API服务器拦截了urllib.request.urlopen的默认请求——因为它的请求头缺少User-Agent标识,被判定为非合法客户端请求。而你之前用requests库能成功,是因为requests会自动添加默认的User-Agent,通过了服务器验证。
解决方案
方案1:给urllib请求添加User-Agent头
修改请求代码,手动添加模拟浏览器的请求头,让服务器识别为合法请求:
import json from urllib.request import urlopen, Request import gspread gc = gspread.service_account(filename='creds.json') sh = gc.open_by_key('1-1aiGMn2yUWRlh_jnIebcMNs-6phzUNxkktAFH7uY9o') worksheet = sh.sheet1 url = 'https://api.chucknorris.io/jokes/random' # 构造带User-Agent的请求 req = Request( url, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'} ) response = urlopen(req) data_json = json.loads(response.read()) result = [] for key in data_json: result.append([key, data_json[key] if not isinstance( data_json[key], list) else ",".join(map(str, data_json[key]))]) worksheet.update('a1', result)
方案2:改用requests库(更简洁)
既然已经验证requests能正常访问API,直接复用该库的逻辑,代码更简洁易维护:
import json import requests import gspread gc = gspread.service_account(filename='creds.json') sh = gc.open_by_key('1-1aiGMn2yUWRlh_jnIebcMNs-6phzUNxkktAFH7uY9o') worksheet = sh.sheet1 url = 'https://api.chucknorris.io/jokes/random' # 使用requests请求API,自动处理请求头 req = requests.get(url, verify=False) data_json = req.json() # 直接解析JSON响应,无需手动load result = [] for key in data_json: result.append([key, data_json[key] if not isinstance( data_json[key], list) else ",".join(map(str, data_json[key]))]) worksheet.update('a1', result)
说明
- 两种方案都能解决403问题,方案2更推荐,因为
requests库的API更友好,后续扩展也更方便。 - 如果API服务器要求严格,可能需要调整
User-Agent的值,你可以从浏览器的请求头中复制真实的User-Agent字符串替换。
内容的提问来源于stack exchange,提问作者Anthony Madle
相关产品推荐
相关产品推荐

