3行代码拉取NBA官方数据:nba_api实战指南
【免费下载链接】nba_apiAn API Client package to access the APIs for NBA.com项目地址: https://gitcode.com/gh_mirrors/nb/nba_api
nba_api 是 NBA.com 官方 API 的 Python 客户端,一条 pip 命令装好之后,球员生涯统计、球队比赛日志、实时比分板都能直接拿到手,还能转成 pandas DataFrame。你不用再手写请求 URL、翻 JSON 字段找数据。
项目能做什么
它的核心是把 NBA.com 官网背后的数据接口封装成了 Python 类:浏览器 Network 面板里能看到的统计表,这里基本都能拉到。
几个典型用法:
- 查一个球员的生涯数据:只要球员 ID,返回所有赛季、所有球队的完整统计
- 追踪一整个赛季的胜负:球队比赛日志一次调用,每场的日期、对手、胜负、各项数据全在一行里
- 看今天的比赛实况:实时比分板返回进行中的比赛、当前比分、节次和双方数据王
目前 src/nba_api/stats/endpoints/ 下有 100 多个端点类,覆盖球员、球队、联盟、单场明细这几大类。
3分钟跑通第一个查询
先安装,pandas 是转 DataFrame 用的,建议一起装上:
pip install nba_api pandas然后调一个端点试试:
from nba_api.stats.endpoints import playercareerstats career = playercareerstats.PlayerCareerStats(player_id='203999') df = career.get_data_frames()[0] print(df[['GP', 'PTS']].head()) # 约基奇的生涯出场与得分如果看到带 GP(出场数)、PTS(得分)的表格,说明装好了。player_id 是 NBA 官方 ID,怎么查下面坑指南里会讲。
核心功能体验
按球员ID拉生涯数据
场景:想横向对比两个球员的生涯轨迹。调用:PlayerCareerStats必填参数只有 player_id,其余都有默认值。输出:get_data_frames()返回一个 DataFrame 列表,第一个就是生涯汇总表,含赛季、球队、出场、得分、篮板、助攻等列。
career = playercareerstats.PlayerCareerStats(player_id='2544') career.get_data_frames()[0]查球队一个赛季的胜负
场景:追踪一支球队整季的战绩起伏和得分走势。调用:TeamGameLog传球队 ID 和赛季即可。输出:一场比赛一行,WL 列标胜负,W/L 是滚动战绩,还有对手和球队各项技术统计。
from nba_api.stats.endpoints import teamgamelog log = teamgamelog.TeamGameLog(team_id='1610612747', season='2022-23') df = log.get_data_frames()[0] print(len(df[df['WL'] == 'W']), len(df[df['WL'] == 'L']))拿今天的实时比分板
场景:想知道现在有哪些比赛、比分多少、谁在砍高分。调用:ScoreBoard不需要任何必填参数。输出:get_dict()里的 scoreboard 结构包含每场游戏的 gameId、状态、主客队实时比分,还有单场得分/篮板/助攻领跑者。
from nba_api.live.nba.endpoints import scoreboard board = scoreboard.ScoreBoard().get_dict() print(board['scoreboard']['games'][0]['gameStatusText'])每个端点的返回都能按需切换格式:get_json()拿原始 JSON、get_dict()拿字典、get_data_frames()拿 DataFrame,用哪个阶段就切哪个。
踩坑指南与提速技巧
遇到不知道球员、球队 ID的情况,别去网上搜,包里的静态数据就能查:
from nba_api.stats.static import players, teams players.find_players_by_full_name('james') # 支持正则、不区分大小写 teams.find_teams_by_full_name('Lakers')这些数据内嵌在包里,查询不发任何网络请求,也是新手最常用的功能。
⚠️ 遇到请求频繁被拒或超时,说明打得有点猛。官方没有公开的限速文档,稳妥做法是请求之间隔几秒,失败按退避重试。像生涯统计这种不常变的数据,拉一次落盘缓存(CSV 或 pickle),之后增量更新就行。
要批量拉多个球员的数据,用线程池并发,但线程数压低一点,避免被限:
from concurrent.futures import ThreadPoolExecutor with ThreadPoolExecutor(max_workers=3) as ex: dfs = list(ex.map(lambda pid: playercareerstats.PlayerCareerStats( player_id=pid).get_data_frames()[0], player_ids))如果网络环境需要走代理,每个端点的构造函数都接收proxy、headers、timeout参数,不用自己改 HTTP 层,docs/nba_api/stats/examples.md里有完整示例。
下一步
各端点的参数说明和返回结构在 docs/nba_api/stats/endpoints/,Jupyter 格式的动手示例在 docs/examples/。想给项目补新端点的话,先看tools/里的生成器工具和CONTRIBUTING.md的贡献流程,照着现有端点仿写一个新类就行。
【免费下载链接】nba_apiAn API Client package to access the APIs for NBA.com项目地址: https://gitcode.com/gh_mirrors/nb/nba_api
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考