nba_api 上手指南:3 行 Python 拿到 NBA 官方数据 nba_api 上手指南3 行 Python 拿到 NBA 官方数据【免费下载链接】nba_apiAn API Client package to access the APIs for NBA.com项目地址: https://gitcode.com/gh_mirrors/nb/nba_api你花了 2 小时写爬虫抓 NBA 数据结果打开就是一堆嵌套的 div。换成 nba_api3 行 Python 就能拿到 NBA 官方数据。它是一个 Python 客户端直连 nba.com 的官方接口球员统计、球队日志、实时比分全部来自官网同款数据管道不用自己解析 HTML、不用处理翻页。pip 一条命令装好 nba_api30 秒看到第一条数据先装。终端里一条命令pip install nba_api装完了。跑一下验证环境通了没有。这里拉一次官方球队列表能打印出 30 就说明链路没问题from nba_api.stats.static import teams print(len(teams.get_teams())) # 30就这两步。后面所有玩法都是在这个基础上加参数。数据全景图nba_api 的菜单先看看它到底能端上来什么。别背用哪块查哪块数据类别你能查到什么对应端点名球员生涯统计、逐场日志、关键时刻数据playercareerstats、playergamelog、leaguedashplayerclutch球队球队比赛日志、赛季分项数据、阵容teamgamelog、teamdashboardbygeneralsplits、commonteamroster比赛技术统计、逐次回合、赢球概率boxscoretraditionalv2、playbyplayv2、winprobabilitypbp联盟联盟排行榜、 standingsleagueleaders、leaguestandings实时当日比分板、实时技术统计live 模块的ScoreBoard、BoxScore、PlayByPlay端点有 100 多个每个对应官网上的一个数据页面。某个端点的参数和返回结构仓库里docs/nba_api/stats/endpoints/下一个端点一份文档配了真实输出示例查起来很快。三个场景三段代码查 Stephen Curry 的整个生涯这段在干嘛名字换 ID用 ID 拉生涯统计转成 DataFrame。from nba_api.stats.static import players from nba_api.stats.endpoints import playercareerstats pid players.find_players_by_full_name(Stephen Curry)[0][id] stats playercareerstats.PlayerCareerStats(player_idpid) df stats.get_data_frames()[0] # 生涯累计一行 print(df[[GP, PTS, AST, STL]])注意这个端点一次返回 10 个数据集get_data_frames()全给你按赛季逐行的是其中一个用哪列就从哪个 frame 里取。追凯尔特人 2023-24 一个赛季的胜负这段在干嘛找队 ID拉整季比赛日志数一下 W 和 L。from nba_api.stats.static import teams from nba_api.stats.endpoints import teamgamelog tid teams.find_teams_by_full_name(Boston Celtics)[0][id] log teamgamelog.TeamGameLog(team_idtid, season2023-24) df log.get_data_frames()[0] print(df[WL].value_counts())跑完你会看到凯尔特人那个赛季的胜负场数。同一张表里还有每场的得分、命中率做赛季走势直接可用。60 秒刷新一次实时比分这段在干嘛死循环里反复拉当日比分板打印每场的两边比分等 60 秒再来。import time from nba_api.live.nba.endpoints import scoreboard while True: data scoreboard.ScoreBoard().get_dict() for g in data[scoreboard][games]: h, a g[homeTeam], g[awayTeam] print(f{a[teamCity]} {a[teamName]} {a[score]} : {h[score]} {h[teamCity]} {h[teamName]}) time.sleep(60)没有比赛的日子 games 是空的循环不会报错安静等你下次看。你大概率会踩的 4 个坑⚠️ 这四种症状我全栽过你基本也躲不开。按症状 → 原因 → 修复看。球员 ID 到底去哪查症状把球员名字直接塞进 stats 端点要么报错要么返回空。原因stats 接口只认数字 ID名字只在静态模块里能用。修复就一行pid players.find_players_by_full_name(Stephen Curry)[0][id]批量拉取被限流症状循环里连发几十个请求开始 403 或超时。原因官网对单个 IP 有速率限制。修复请求之间time.sleep(1)并发别超过 5 个线程。够用还显得你有礼貌。DataFrame 列名大小写不统一症状两个端点 join 一下TEAM_ID 和 Team_ID 对不上全是 NaN。原因不同端点的列名风格不一致。修复拿到数据后统一处理一遍df.columns df.columns.str.upper()。端点突然返回空症状昨天还正常的代码今天返回空表。原因多半是赛季参数越界赛季没开始就查或者官网把端点改了名新旧版本并存。修复先用默认参数调一次确认是参数问题还是端点问题后者就去docs/nba_api/stats/endpoints/里找同名端点的新版本。从玩具到生产如果你要跑在服务器上按优先级上三个升级。本地缓存同一查询别请求两次import pickle cache fcache/{pid}.pkl try: df pickle.load(open(cache, rb)) except FileNotFoundError: df playercareerstats.PlayerCareerStats(player_idpid).get_data_frames()[0] pickle.dump(df, open(cache, wb))历史数据不会变落盘一次就够。并发批量拉取用ThreadPoolExecutor(max_workers5)包一层每个球员 ID 提交一个任务f.result()收结果。线程数控制在 5 以内配合上面的限流经验一天全量拉完不成问题。失败自动重试外层套一个 for 循环捕获异常后time.sleep(5)再来最多 3 次。网络抖动和偶发限流大部分都死在第二次重试里。 三样都上日常的全量数据管道基本不用人盯。延伸 下一步想动源码先看这个目录树nba_api/ ├── src/nba_api/stats/ # 全部统计端点 ├── src/nba_api/live/ # 实时端点 ├── src/nba_api/library/ # HTTP 客户端与枚举 ├── tests/ # 端点集成测试 ├── docs/ # 参数与输出文档 └── tools/ # 开发工具给项目提 PR三步git clone https://gitcode.com/gh_mirrors/nb/nba_api从 master 拉一个分支改端点或加端点后跑tests/里对应的测试端点的参数和返回结构都以测试为准测试通过提交 PR说清楚改了哪个端点、为什么改现在打开终端把第一节那 5 行跑一遍。【免费下载链接】nba_apiAn API Client package to access the APIs for NBA.com项目地址: https://gitcode.com/gh_mirrors/nb/nba_api创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考