Python循环调用REST API返回403,单独调用正常求解决
问题排查与解决
首先你的代码里存在一个明显的错误,这大概率是导致前几次请求403的核心原因:
代码错误修复
你先对每行ID做了x = i.strip()处理(去除换行、空格等空白字符),但拼接请求URL时却用了未处理的i而非处理后的x。这会让大部分请求的URL携带换行符(文件每行末尾默认的换行),服务器无法识别无效的资源路径,因此返回403;而文件最后一行通常没有换行符,i和x内容一致,所以请求成功。
修复后的循环代码:
for i in f: x = i.strip() x = str(x) if x: # 改用处理后的x拼接URL Nurl = url + x print(Nurl) response_raw = requests.get(Nurl, headers=headers, auth=HTTPBasicAuth('user_abc', 'abc123')) print(response_raw)
其他可能的问题与解决
如果修复后仍出现403,可排查以下情况:
速率限制触发:多数API会限制单位时间内的请求次数,循环请求过快会触发限流。可添加请求间隔:
import time # 循环内请求后添加延迟 response_raw = requests.get(...) print(response_raw) time.sleep(1) # 暂停1秒,可根据API文档调整时长会话复用异常:多次独立请求可能导致认证状态无法正确维持,使用
requests.Session()复用连接和认证信息:# 创建会话对象,统一管理认证和请求头 session = requests.Session() session.auth = HTTPBasicAuth('user_abc', 'abc123') session.headers.update(headers) for i in f: x = i.strip() if x: Nurl = url + x print(Nurl) response_raw = session.get(Nurl) print(response_raw)服务器反爬拦截:部分服务器会拦截非浏览器标识的请求,可在请求头中添加
User-Agent模拟浏览器:headers = { 'Connection': 'keep-alive', 'Content-Type': 'application/json', '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' }
内容的提问来源于stack exchange,提问作者Sam Francis
相关产品推荐
相关产品推荐

