Python requests调用NBA Stats API失败但curl请求正常的问题排查
解决NBA Stats API请求在Python requests中失败的问题
我一眼就发现你的curl请求和Python代码里的请求存在几个关键差异,正是这些细节导致了连接重置的错误,咱们一步步来修复:
1. URL里的转义字符坑
你的Python代码URL里用了&(这是HTML里对&的转义写法),但HTTP请求的参数分隔符应该直接用&。curl会自动帮你处理这种转义字符,可requests会原封不动把&发出去,服务器根本没法正确解析参数,自然就拒绝连接了。
修复方式:把URL里所有的&全部替换成&。
2. 请求头的格式错误
你的请求头里有两处格式问题,这也是服务器不认的原因:
Accept-Language字段:你写的是'en-USen;q=0.5',正确格式应该是'en-US,en;q=0.5'(语言选项之间需要用逗号分隔)。Accept-Encoding字段:你用空格分隔了编码类型,HTTP规范里要求用逗号,改成'gzip, deflate, br'才行。
另外补充下,Accept字段你原来的写法也缺了逗号,最好改成'application/json, text/plain, */*',保持格式一致。
3. 可选优化:用Session保持会话
NBA的Stats API有时候会校验会话一致性,用requests的Session对象模拟浏览器的会话状态,能提升请求的成功率。
修复后的完整代码
import requests # 修复URL,替换所有&为& url = "https://stats.nba.com/stats/playerdashboardbygeneralsplits?PlayerID=1628369&TeamID=0&MeasureType=Base&PerMode=PerGame&PlusMinus=N&PaceAdjust=N&Rank=N&LeagueID=00&Season=2020-21&SeasonType=Regular+Season&PORound=0&Outcome=&Location=&Month=0&SeasonSegment=&DateFrom=&DateTo=&OpponentTeamID=0&VsConference=&VsDivision=&GameSegment=&Period=0&ShotClockRange=&LastNGames=0" headers = { 'Host': 'stats.nba.com', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0', 'Accept': 'application/json, text/plain, */*', 'Accept-Language': 'en-US,en;q=0.5', 'Referer': 'https://stats.nba.com/', 'Accept-Encoding': 'gzip, deflate, br', 'Connection': 'keep-alive', 'x-nba-stats-origin': 'stats', 'x-nba-stats-token': 'true' } # 使用Session发送请求,模拟浏览器会话 session = requests.Session() response = session.get(url, headers=headers) # 验证结果 print(response.status_code) print(response.json())
为啥curl成功而requests失败?
curl在处理请求时会做很多兼容处理,比如自动解析HTML转义字符、宽容对待请求头的格式小错误。但requests库更严格遵循HTTP规范,你写啥它就发啥,这些看似细微的格式问题,到了服务器那边就成了拒绝连接的理由,最终引发ConnectionResetError。
内容的提问来源于stack exchange,提问作者Jacob Pavlock
相关产品推荐
相关产品推荐

