免费足球数据一键到手understat开源Python包从入门到实战的完整指南【免费下载链接】understatAn asynchronous Python package for https://understat.com/.项目地址: https://gitcode.com/gh_mirrors/un/understat晚上十一点体育小编小周还在为明天的选题抓狂谁才是本赛季英超最被低估的射手她打开 understat——一个能免费抓取五大联赛足球数据的开源Python包几分钟就把答案摆上了桌。没有高价API没有翻网页的手工劳动只有几行代码。如果你也写过体育分析、做过数据可视化或者只是单纯想在朋友面前秀一手专业操作这篇指南就是为你准备的。我们会从零开始一步步升级你的能力直到你能独立搞定一套完整的足球数据分析任务。全程不需要你懂爬虫原理只要会复制粘贴、能看懂注释就行。第一章先认识它这个开源Python包能帮你拿回哪些免费足球数据understat核心源码位于understat/understat.py是一个异步的Python包它把 Understat.com 上全部可访问的数据封装成了十几个方法。网站上有多少数据它就能帮你拿回多少关键是全程免费、开源、无需注册。它主要覆盖三块内容想查什么对应方法使用场景举例某联赛某赛季的全部球员数据get_league_players英超2023-24所有球员的进球、助攻、xG某联赛的积分榜get_league_table带xG、PPDA的完整排名还能按日期切片某球队的赛果与赛程get_team_results/get_team_fixtures阿森纳整个赛季的主客场比赛明细某球员的每一脚射门get_player_shots萨拉赫每脚射门的坐标、角度与xG某场比赛的双方数据get_match_shots/get_match_players一场德比战里两队的射门分布支持的联赛包括英超epl、西甲la_liga、德甲bundesliga、意甲serie_a、法甲ligue_1和俄超rfpl。数据维度上除了传统的进球、助攻、红黄牌还包含 xG预期进球、xA预期助攻、npxG排除点球的预期进球、xGChain参与进攻链条的预期进球、PPDA对手每次防守动作前允许的传球次数、xPTS预期积分等专业指标。这些指标对普通球迷可能陌生但一句大白话就能解释xG 是这一脚按历史数据该进几个球PPDA 是对手敢不敢在你面前慢慢倒脚。有了它们你就能回答运气好和真有实力这类问题。对了它基于 aiohttp 实现异步请求网络等待时不会干坐着可以同时发多个请求整体耗时往往只有同步方式的几分之一。想要最完整的接口说明直接翻项目里的docs/目录。第二章3步完成安装1分钟验证是否可用先搞定环境这一步任何人都能独立完成。第1步安装依赖与包最省事的办法用 pip 一条命令装好pip install understat如果你想看源码、顺便体验从仓库安装也可以克隆下来再装git clone https://gitcode.com/gh_mirrors/un/understat cd understat pip install .第2步验证是否装好打开终端输入下面这行没有任何报错就说明安装成功python -c from understat import Understat; print(OK)第3步确认Python环境这个包要求 Python 3.6 及以上版本并且需要能联网毕竟数据来自线上。执行python --version看一下版本号即可。整个过程不到一分钟。装好后我们正式开始第一次能力升级。第三章学会第一段代码把英超射手榜拉进终端我们的小周就是从这里开始的。目标很简单拿到某赛季英超所有球员数据按进球数排出前十。import asyncio import aiohttp from understat import Understat async def get_top_scorers(season2023): # 创建一个复用的网络会话一次请求一个连接性能更好 async with aiohttp.ClientSession() as session: understat Understat(session) # 拉取英超指定赛季的全部球员数据 players await understat.get_league_players(epl, season) # 注意包返回的数值字段默认是字符串先转换再排序 for p in players: p[goals] int(p[goals]) p[xG] float(p[xG]) # 按进球数从高到低排序取前10 top sorted(players, keylambda x: x[goals], reverseTrue)[:10] for i, p in enumerate(top, 1): print(f{i}. {p[player_name]}: {p[goals]}球 | xG {p[xG]:.2f}) # asyncio.run 是异步代码的统一入口 asyncio.run(get_top_scorers())保存为scorers.py运行python scorers.py终端里就会蹦出一份带 xG 对照的射手榜。进球数与 xG 摆在一起谁在超额完成任务、谁在挥霍机会一眼便知。这就是第一级能力会调接口、会看结果。接下来我们把它放大到球队、比赛和积分榜。第四章搞定多维度查询积分榜、球队表现与条件过滤射手榜只是开胃菜。understat 的十几个方法都支持同一个灵活特性用options字典或关键字参数过滤数据。这意味着你不用自己写任何筛选逻辑。比如想直接拿到一份带 xG、PPDA 的专业版积分榜import asyncio import aiohttp from understat import Understat async def show_table(): async with aiohttp.ClientSession() as session: understat Understat(session) # 返回的第一行是表头后面才是球队 table await understat.get_league_table(epl, 2023) for row in table[:6]: print(row) asyncio.run(show_table())每一行里依次是球队名、场次、胜平负、进球、失球、积分、xG、NPxG、xGA、PPDA、OPPDA、xPTS……专业程度直逼付费数据商。再比如想分析阿森纳整个赛季的主场表现import asyncio import aiohttp from understat import Understat async def home_report(team_nameArsenal, season2023): async with aiohttp.ClientSession() as session: understat Understat(session) # 拿球队赛季所有已结束的比赛 results await understat.get_team_results(team_name, season) # 筛选出主场比赛 home [r for r in results if r[h][title] team_name] wins [r for r in home if r[goals][h] r[goals][a]] print(f{team_name} {season}赛季主场{len(home)}场赢下{len(wins)}场) asyncio.run(home_report())想只看某一队的球员一条过滤就搞定players await understat.get_league_players( epl, 2023, {team_title: Arsenal} )到这里你的第二级能力已解锁想查什么维度都能查到。测试文件tests/test_understat.py里还演示了大量过滤组合建议当字典翻。第五章进阶提速让脚本同时抓取多个赛季做研究的人最头疼的往往是数据量。比如要对比某球员近5个赛季的走势同步一个个抓要等很久。异步包的优势这时候就体现出来了——用asyncio.gather一次性并发多个请求import asyncio import aiohttp from understat import Understat async def fetch_multi_seasons(seasons(2019, 2020, 2021, 2022, 2023)): async with aiohttp.ClientSession() as session: understat Understat(session) # 同时发起多个赛季的请求谁先返回先处理谁 results await asyncio.gather(*[ understat.get_league_players(epl, s) for s in seasons ]) # 给每个赛季的数据打上标记方便后面合并 for season, data in zip(seasons, results): for p in data: p[season] season return results data asyncio.run(fetch_multi_seasons())配合三个习惯你基本就是老手级别了复用一个ClientSession连接可以复用避免每次请求都重新握手速度快且更礼貌。批量请求用gather网络等待的时间被摊薄整体耗时可缩短到原来的几分之一。本地做简单缓存把抓过的数据存成 JSON 文件下次直接读文件既快又不给服务器添麻烦。顺便一提把多个赛季的数据拼进 Pandas DataFrame做趋势分析、画折线图都是水到渠成的事。第六章实战练手写一份被低估射手分析报告现在到了验收时刻。我们把前面所有能力串起来完成小周的那个选题找出本赛季被低估的射手。判断逻辑很简单如果一名球员进球数明显低于他的 xG说明他创造机会的能力很强只是运气没兑现——这类球员往往是潜力股同理助攻低于 xA 也代表送出好球但队友没进。import asyncio import aiohttp from understat import Understat async def find_underrated(season2023, min_games25): async with aiohttp.ClientSession() as session: understat Understat(session) players await understat.get_league_players(epl, season) candidates [] for p in players: # 跳过出场太少的球员样本量不足没有参考意义 if int(p[games]) min_games: continue goals, xg int(p[goals]), float(p[xG]) assists, xa int(p[assists]), float(p[xA]) # 进球比xG低3球以上且助攻比xA低2次以上 - 被低估 if xg - goals 3 and xa - assists 2: candidates.append((p[player_name], p[team_title], goals, xg, assists, xa)) # 按xG与实际进球的差距排序差距越大越值得关注 candidates.sort(keylambda x: x[3] - x[2], reverseTrue) for name, team, goals, xg, assists, xa in candidates[:8]: print(f{name}{team}进球{goals} | xG {xg:.2f} | f助攻{assists} | xA {xa:.2f}) asyncio.run(find_underrated())跑完这份报告你就可以在文章里写从预期进球模型看某某球员被严重低估他的机会创造能力远超进球数字所体现的。——专业感和说服力直接拉满。第七章排坑FAQ新手最容易踩的5个坑最后把最容易让人卡住的几个问题一次性讲透。Q1一运行就报错 RuntimeError: no running event loop这是最常见的异步入门问题。原因是你没在异步环境里调用方法。记住口诀所有await调用必须放进async def函数里再用asyncio.run()作为统一入口。照着本文的代码结构写就不会错。Q2拿到的数字怎么都是字符串这是包的默认行为所有字段原样返回。排序、计算前先转换比如int(p[goals])、float(p[xG])。你可以在抓取后就地清洗也可以封装一个转换函数统一处理。Q3pip install aiohttp报版本冲突先确认 Python 版本在 3.6 以上然后升级 pip 再装pip install --upgrade pip。建议用虚拟环境venv隔离依赖能省掉大量烦恼。Q4请求多了感觉变慢甚至被拒别把数据源当测试机。控制并发量、合理设置间隔、复用会话、把结果缓存到本地都是好办法。抓全量数据尽量错峰进行。Q5想知道某个球员或球队怎么查球员类接口通常需要球员ID。先用get_league_players按名字过滤找到他的id再调用get_player_shots、get_player_matches等球队类接口则直接传队名即可。想了解更多用法docs/目录里的API文档和tests/下的测试用例是最好的参考。最后一步今晚就动手安装只需要一条命令第一份数据报告只需要十分钟。小周用这份被低估射手报告当天就上了头条——而你距离同样的成果只差打开终端。建议按这个顺序走一遍装包 → 跑射手榜示例 → 换成你喜欢的球队和联赛 → 试试过滤参数 → 然后做一份属于自己的分析。遇到问题就翻tests/test_understat.py那里几乎覆盖了所有接口的用法。数据不会替你做判断但它能把你的直觉变成别人拿不走的证据。现在打开终端跑起你的第一行代码吧。【免费下载链接】understatAn asynchronous Python package for https://understat.com/.项目地址: https://gitcode.com/gh_mirrors/un/understat创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考