尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

免费足球数据一步到位:Understat异步Python包快速搭建你的xG分析工作台

免费足球数据一步到位:Understat异步Python包快速搭建你的xG分析工作台 免费足球数据一步到位Understat异步Python包快速搭建你的xG分析工作台【免费下载链接】understatAn asynchronous Python package for https://understat.com/.项目地址: https://gitcode.com/gh_mirrors/un/understat周五下午我收到一位做足球内容的朋友的求助他要赶一篇英超复盘稿需要过去五个赛季的射手数据、每场比赛的射门分布、还有各队的高位逼抢指标。他试过手动去数据站翻表格半小时只整理出两轮比赛试过抓包发现页面全是JavaScript动态渲染正则根本抠不出东西最后看了一眼商业数据API的报价单默默关掉了网页。如果你也卡在数据拿不到这一步那这个开源的Understat异步Python包值得你花五分钟认识一下。它把 understat.com 上的海量足球数据封装成了十几个简单的异步方法免费、开箱即用xG、xA、PPDA、OPPDA 这些专业指标都能直接拉到本地。下面我带你从零跑通一条完整的数据链路顺便把高效用法和避坑点一次讲清楚。先聊点实在的为什么免费足球数据这么难到手在做技术选型之前得先明白痛点出在哪。市面上的足球数据来源无非三条路商业API数据全、更新快但年费动辄上万美元个人和小团队根本吃不消自建爬虫目标站点普遍用JS异步渲染数据直接抓HTML只能拿到空壳还要处理反爬、登录、数据清洗一堆麻烦事手动整理适合单场比赛一旦涉及多赛季、多联赛效率低到让人崩溃。而 Understat 这类站点其实藏着一个后门它的数据接口本身是公开的 JSON 接口只是藏在页面脚本里普通浏览器用户看不见罢了。Understat异步Python包做的就是把这些接口整理成一套风格统一的 Python 方法——你只管传联赛名、赛季号剩下的解析工作它全包了。说白了这个包就像一把翻译钥匙把网站后台的JSON数据翻译成你能直接用的Python列表和字典。认识主角这个包一口气能给你哪些数据整个包只有一个核心类Understat构造函数接收一个aiohttp.ClientSession之后所有数据请求都复用这一个连接。支持六大联赛英超epl、西甲la_liga、德甲bundesliga、意甲serie_a、法甲ligue_1、俄超rfpl。接口速查表如下按使用频率排列方法一句话说明返回内容get_league_players某联赛某赛季的全部球员统计进球、xG、xA、射门、关键传球等get_league_table联赛积分榜积分、xG、PPDA、OPPDA等18列get_league_results已结束的比赛比分、双方xG、比赛时间get_league_fixtures未开始的赛程对阵、时间get_team_results/get_team_fixtures单支球队的比赛结果与赛程同上聚焦单队get_team_players/get_team_stats球队球员明细与赛季统计球员数据或球队汇总get_player_shots单个球员的全部射门射门位置、脚法、结果、xGget_player_matches/get_player_stats球员出场记录与场均数据按场次或按位置聚合get_match_players/get_match_shots单场比赛的出场名单与射门主客两队字典结构get_stats各联赛按月的统计快照联赛月份分组数据所有方法返回的都是 Python 原生的列表或字典字段与网站页面一一对应不需要你自己写任何 HTML 解析逻辑。完整的方法签名和输出示例可以翻仓库里的官方文档docs/classes/understat.rst。首次实战三行核心代码拿下英超射手榜第一步安装两条路任选最省事的方式是直接用 pippip install understat如果你更想用最新源码也可以把仓库克隆到本地再装git clone https://gitcode.com/gh_mirrors/un/understat cd understat pip install .装完之后建议顺手跑一遍测试确认环境没问题pytest tests/测试用例都放在 tests/ 目录里覆盖了每个接口的常规调用和过滤参数既是质量保障也是很好的用法示范。第二步写第一个查询脚本新建一个top_scorers.py贴入下面这段代码import asyncio import aiohttp from understat import Understat async def main(): # 整个会话只创建一次复用连接 async with aiohttp.ClientSession() as session: understat Understat(session) # 拉取英超2023赛季全部球员数据 players await understat.get_league_players(epl, 2023) # 注意接口返回的数值是字符串先转float再排序 top sorted(players, keylambda p: float(p[goals]), reverseTrue)[:10] print(英超2023赛季射手榜 TOP10) for i, p in enumerate(top, 1): print(f{i}. {p[player_name]}: {p[goals]}球 xG{float(p[xG]):.2f}) asyncio.run(main())运行方式python top_scorers.py跑通之后你会发现拿到整个联赛几千名球员的完整赛季数据前后不过一两秒——异步 连接复用的优势在这里体现得淋漓尽致。xG 和实际进球摆在一起谁在超额完成、谁在挥霍机会一眼就能看出来。第三步学会给数据瘦身很多接口都支持过滤你既可以用字典也可以用关键字参数效果一样# 两种写法等价只看利物浦的球员 players await understat.get_league_players(epl, 2023, {team_title: Liverpool}) players await understat.get_league_players(epl, 2023, team_titleLiverpool)想查某位球员的射门明细只需知道他的 Understat IDshots await understat.get_player_shots(619) # 例如某球员的全部射门记录每条射门记录都包含分钟、射门位置坐标、结果进球/被扑/射偏、射门方式左脚/右脚/头球和当时情境运动战/定位球/点球做复盘和可视化都够用。进阶玩法三种高频场景的落地写法场景一给全联盟做一次逼抢强度体检PPDA每次防守动作前的传球次数是衡量球队压迫强度的经典指标数值越低代表逼抢越凶。get_league_table直接把这个指标算好了连 OPPDA对手的PPDA也一并给出async def pressing_check(): async with aiohttp.ClientSession() as session: understat Understat(session) table await understat.get_league_table(epl, 2023) header table[0] # [Team, M, W, ..., PPDA, OPPDA, ...] rows table[1:] # 去掉表头 # 按PPDA升序排列逼抢最凶的排最前 rows.sort(keylambda r: float(r[13])) for r in rows: print(f{r[0]:22} PPDA{r[13]} OPPDA{r[14]}) asyncio.run(pressing_check())想单独看主场或客场的表现把h_a参数换成home或away即可想只统计某段时间比如冬窗后的状态传start_date和end_datetable await understat.get_league_table( epl, 2023, h_aaway, start_date2024-01-01, end_date2024-05-01)日期格式固定为YYYY-MM-DD这是官方文档里明确写的约定。场景二多赛季数据一口气批量抓取做时间序列分析时一个赛季的数据往往不够。借助asyncio.gather可以并发拉取多个赛季再合并成一个大的数据框import asyncio import aiohttp from understat import Understat async def fetch_season(session, season): understat Understat(session) players await understat.get_league_players(epl, season) for p in players: p[season] season # 打上赛季标记 return players async def main(): async with aiohttp.ClientSession() as session: results await asyncio.gather( *(fetch_season(session, s) for s in range(2019, 2024)) ) all_players [p for batch in results for p in batch] print(f五个赛季共拿到 {len(all_players)} 条球员记录) asyncio.run(main())拿到手后转成pandas.DataFrame就能直接接上你自己的建模流程了。场景三单场比赛的颗粒度复盘赛后想逐球复盘用比赛ID直接调射门接口返回的是以主客队分组的字典结构data await understat.get_match_shots(22073) # 比赛ID home_shots data[h] # 主队射门明细 away_shots data[a] # 客队射门明细配合get_match_players还能拿到双方出场名单写战报、做赛后评分的数据底子一下就齐了。让效率再翻一倍几个值得养成的习惯复用同一个会话。aiohttp.ClientSession创建一次、全程复用能省掉大量重复握手开销这也是该包设计上就要求你传 session 进来的原因善用并发而非串行。多个独立请求用asyncio.gather打包发出十几条请求和一条请求的耗时几乎一样给重复查询加缓存。用functools.lru_cache或本地文件缓存把已经拉过的数据存下来避免反复打接口先用过滤再取全量。大部分接口支持options过滤能精确到字段值能过滤就先过滤数据量小处理也快看清字段类型。接口返回的数值几乎都是字符串比如goals: 27做运算前记得先float()转换这是新手最容易踩的坑。新手避坑清单这几点提前知道能少走弯路请求频率别太狠。数据免费不等于可以无限薅长时间高频请求容易触发对方防护给自己留点间隔更稳妥日期参数有格式要求。get_league_table的起止日期必须是YYYY-MM-DD格式错了会直接抛异常联赛名走小写别名。传epl、la_liga这类短别名即可包内部会自动映射成站点使用的写法版本升级先看文档。不同小版本的接口细节可能有微调升级后留意 docs/ 目录下的说明有问题先看测试。tests/test_understat.py 里几乎覆盖了所有接口的调用姿势比看源码更快上手。写在最后数据到手之后才是真正精彩的开始到这里一条免费获取足球数据 → 本地分析 → 产出洞察的完整链路已经打通了。不管是给球队算PPDA、给射手排xG效率榜还是批量积累多赛季数据做预测模型Understat异步Python包都能稳稳托住你的数据需求。想继续深入的话这几个文件按顺序读最顺先看 docs/user/installation.rst 搞定环境再翻 docs/classes/understat.rst 了解每个方法的参数与输出最后打开核心源码 understat/understat.py 看看数据是怎么被解析、过滤、聚合的——源码不到五百行读一遍你对异步数据封装的理解会提升一大截。数据只是理解足球的辅助工具别让工具本身成为门槛。愿你在数据的加持下看到球场里更多此前被忽略的细节。【免费下载链接】understatAn asynchronous Python package for https://understat.com/.项目地址: https://gitcode.com/gh_mirrors/un/understat创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表