调用OECD API时出现HTTP Error 403: Forbidden错误的求助
调用OECD API时出现HTTP Error 403: Forbidden错误的求助
哎,碰到这种403 Forbidden真的挺闹心的,我给你几个实际可行的排查方向,你挨个试试:
- 给请求加个浏览器模拟头:很多公共API会拦截纯脚本发起的请求,因为默认请求头会暴露是代码调用。你可以用
requests库先带自定义请求头获取内容,再传给pandas解析,代码改成这样:
import pandas as pd from io import StringIO import requests url = 'https://sdmx.oecd.org/public/rest/data/OECD.SDD.STES,DSD_STES@DF_CLI/.M.LI...AA...H?startPeriod=2023-02&dimensionAtObservation=AllDimensions&format=csvfilewithlabels' # 模拟Chrome浏览器的请求头 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36' } response = requests.get(url, headers=headers) # 把响应内容转成pandas能读的格式 df = pd.read_csv(StringIO(response.text))
这种方式大概率能绕过简单的反爬拦截,我之前碰过好几个类似的403都是这么解决的。
- 检查URL是否有隐形问题:有时候复制官方示例的URL时,可能会带隐形的特殊字符,或者参数编码不对。你可以试着手动拆解参数再重新拼接,确保每个参数都正确,比如把
startPeriod、dimensionAtObservation这些参数单独列出来用requests的params参数传递,这样能自动处理编码问题:
import pandas as pd from io import StringIO import requests base_url = 'https://sdmx.oecd.org/public/rest/data/OECD.SDD.STES,DSD_STES@DF_CLI/.M.LI...AA...H' params = { 'startPeriod': '2023-02', 'dimensionAtObservation': 'AllDimensions', 'format': 'csvfilewithlabels' } headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36'} response = requests.get(base_url, params=params, headers=headers) df = pd.read_csv(StringIO(response.text))
排查IP或访问频率限制:哪怕文档说不需要密钥,公共API一般都会有访问频率限制,或者你的IP因为之前的多次请求被临时封禁了。可以试试换个网络(比如手机热点),或者隔个10分钟再发起请求,看看是不是这个原因。
试试SDMX专用库:OECD的API是基于SDMX标准的,用专门的
pandasdmx库调用会更贴合API规范,可能不会触发拦截。先安装pandasdmx,然后用下面的代码试试:
import pandasdmx as pdsdmx # 初始化OECD请求对象 oecd = pdsdmx.Request('OECD') # 拉取数据 data_response = oecd.data( resource_id='DF_CLI', key='.M.LI...AA...H', start_period='2023-02' ) # 转成DataFrame df = data_response.write(data_response.data, format='pandas')
这个库会自动处理请求头和参数格式,适配SDMX API的要求,成功概率更高。
备注:内容来源于stack exchange,提问作者Georgie Joy
相关产品推荐
相关产品推荐

