Requests库使用问题:无法获取API数据寻求技术解决方案
以下是针对你遇到的response.text为空问题的具体排查步骤,结合你的环境(Python3.8.5 + Requests2.26.0)逐一验证:
先确认响应基础信息
先打印响应状态码和响应头,确认请求是否真的成功:response = requests.get('https://api.example.com/data') print(response.status_code) print(response.headers)如果状态码是
204 No Content,说明API确实返回空;如果是3xx重定向码,可检查是否重定向到了空响应的地址;如果是200,再看Content-Length头,若值为0,可能API返回空,但你用cURL能拿到数据,这大概率是请求参数/头不一致导致。对齐cURL的请求头
很多API会校验User-Agent、Accept等请求头,requests默认的头和cURL不同(比如requests的User-Agent是python-requests/2.26.0),直接复制cURL的请求头到代码中:
比如你用cURL测试的命令是curl https://api.example.com/data,可以加上-v参数查看cURL发送的头,然后在requests中模拟:headers = { 'User-Agent': 'curl/7.68.0', # 替换成你cURL的实际User-Agent 'Accept': '*/*' } response = requests.get('https://api.example.com/data', headers=headers) print(response.text)查看二进制原始响应
response.text是经过requests自动编码后的字符串,如果编码识别错误,可能会显示为空。直接查看二进制内容:print(response.content)这里可能会看到实际的响应数据(比如非UTF-8编码的内容),或者API返回的错误提示(比如JSON格式的错误信息)。
禁用自动重定向
requests默认自动处理3xx重定向,若重定向后的地址返回空,会导致最终响应为空。试试禁用重定向:response = requests.get('https://api.example.com/data', allow_redirects=False) print(response.status_code) print(response.headers.get('Location'))如果状态码是3xx,手动访问
Location地址确认是否能拿到数据。排除代理/SSL干扰
本地代理可能导致请求异常,试试禁用代理:response = requests.get('https://api.example.com/data', proxies={"http": None, "https": None})另外,虽然没有报错,但SSL验证异常也可能导致响应异常,可临时关闭验证(仅用于排查,生产环境请勿使用):
response = requests.get('https://api.example.com/data', verify=False)手动设置响应编码
如果requests自动识别的编码不正确,会导致解码后为空字符串,手动指定编码再尝试:response = requests.get('https://api.example.com/data') response.encoding = 'utf-8' # 替换为API实际使用的编码,比如gbk print(response.text)使用Session保持会话
部分API需要Cookie或会话信息才能返回数据,cURL会自动处理Cookie,但单次requests请求不会保存会话,试试用Session:session = requests.Session() response = session.get('https://api.example.com/data') print(response.text)
内容的提问来源于stack exchange,提问作者Tenzin Lungrig

