GitHub Workflow运行nba_api请求超时问题求助
解决GitHub Workflow中调用NBA API超时的问题
问题场景
本地Python环境执行以下代码可正常获取数据:
leaguegamefinder.LeagueGameFinder(player_or_team_abbreviation='T',date_from_nullable = Today,date_to_nullable = Today, league_id_nullable = '00', outcome_nullable = "W")
但在GitHub Workflow中运行时触发超时错误:
requests.exceptions.ReadTimeout: HTTPSConnectionPool(host='stats.nba.com', port=443): Read timed out. (read timeout=30)
已知NBA API会拦截部分云服务商IP,尝试更换代理、修改请求头后问题仍存在,以下是可行的解决思路:
可行解决办法
使用自托管运行器(Self-hosted Runner)
放弃GitHub官方的云运行环境,改用自己本地机器或非云服务商的服务器作为Workflow的运行器。这样请求的IP不在NBA的黑名单范围内,能直接正常调用API。只需在GitHub仓库中配置自托管运行器,Workflow里指定使用该runner执行任务即可。添加请求重试机制
部分超时可能是临时网络波动导致,给请求增加重试逻辑能提升成功率。可以借助requests的适配器实现自动重试:from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry import requests from nba_api.stats.endpoints import leaguegamefinder # 配置重试策略 session = requests.Session() retry_strategy = Retry( total=5, backoff_factor=1, status_forcelist=[429, 500, 502, 503, 504] ) adapter = HTTPAdapter(max_retries=retry_strategy) session.mount('https://', adapter) # 将nba_api的请求绑定到配置好的session leaguegamefinder.session = session # 执行请求 game_finder = leaguegamefinder.LeagueGameFinder( player_or_team_abbreviation='T', date_from_nullable=Today, date_to_nullable=Today, league_id_nullable='00', outcome_nullable="W" )调整请求节奏与超时参数
延长请求超时时间,同时在请求前增加随机延迟,模拟正常用户的访问频率,降低被拦截概率:import time import random from nba_api.stats.endpoints import leaguegamefinder # 请求前随机延迟1-3秒 time.sleep(random.uniform(1, 3)) # 设置更长的超时时间(例如60秒) game_finder = leaguegamefinder.LeagueGameFinder( player_or_team_abbreviation='T', date_from_nullable=Today, date_to_nullable=Today, league_id_nullable='00', outcome_nullable="W", timeout=60 )改用本地预存数据
如果需求是每日获取固定范围的比赛数据,可以在本地提前拉取数据并上传到GitHub仓库,Workflow直接读取仓库中的缓存文件,避免每次调用NBA API。比如设置本地定时任务,每天自动拉取数据并推送到仓库,Workflow只需读取仓库内的文件即可。
内容的提问来源于stack exchange,提问作者LouHeb
相关产品推荐
相关产品推荐

