Python实战:用数据爬虫+可视化轻松分析两队历史交锋记录

目录导读
- 为什么需要Python分析历史交锋? —— 从数据中洞察胜负规律
- 核心工具与思路 —— 爬虫、Pandas、Matplotlib/Plotly的组合拳
- 手把手案例:抓取公开赛事数据
- 1 确定数据源(以FootyStats、API-Football为例)
- 2 用Requests+BeautifulSoup抓取比赛列表
- 3 数据清洗与字段提取(日期、主客队、比分)
- 历史交锋记录的可视化呈现 —— 热力图、胜负趋势线、进球分布
- 问答环节 —— 常见报错与处理技巧
- 进阶延伸 —— 结合ELO评分预测未来交锋
为什么需要Python分析历史交锋?
当你关注两支球队(比如利物浦vs曼城)的“过往恩怨”时,单纯看几场比赛比分远远不够,你需要回答:主场优势有多大?最近5次交锋谁占上风?大球还是小球概率高? 手动翻网页表格不仅低效,且容易遗漏,Python能自动化抓取、清洗、统计并可视化,让你在5分钟内得到一份“交锋战报”。
核心工具与思路
- 数据获取:
requests+BeautifulSoup(静态HTML)或selenium(动态网页)。 - 数据处理:
pandas负责DataFrame操作、分组聚合。 - 可视化:
matplotlib适合折线图/柱状图,plotly适合交互式图表。 - 核心逻辑:筛选出两队同时出现在同一场比赛的记录,然后按“主队/客队”维度拆分统计。
手把手案例(伪代码级示范)
1 确定数据源
以开源足球API(如api-football.com,免费版有请求限制)或FootyStats为例。注意:爬取公开数据需遵守robots.txt及使用频率限制。
2 抓取比赛列表(示例结构)
import requests
from bs4 import BeautifulSoup
url = "https://example.com/head-to-head?team1=liv&team2=mci"
headers = {"User-Agent": "Mozilla/5.0"}
res = requests.get(url, headers=headers)
soup = BeautifulSoup(res.text, "html.parser")
# 假设每行比赛位于 class="match-row" 的div中
for row in soup.select(".match-row"):
date = row.select_one(".date").text.strip()
score = row.select_one(".score").text.strip().replace(" ", "")
# 拆分主客比分
home_goals, away_goals = map(int, score.split("-"))
真实场景下如果你直接用脚本抓取,可能会遇到验证码,建议使用专业API或预先下载的CSV数据。
3 数据清洗与交锋记录生成
import pandas as pd # 假设已获得列表 data = [(date, home_team, away_team, home_goals, away_goals)] df = pd.DataFrame(data, columns=["日期", "主队", "客队", "主队进球", "客队进球"]) # 筛选出涉及利物浦和曼城的所有比赛 mask = ((df["主队"].isin(["利物浦", "曼城"])) & (df["客队"].isin(["利物浦", "曼城"]))) h2h = df[mask].copy() h2h["利物浦进球"] = h2h.apply(lambda r: r["主队进球"] if r["主队"]=="利物浦" else r["客队进球"], axis=1) h2h["曼城进球"] = h2h.apply(lambda r: r["客队进球"] if r["主队"]=="利物浦" else r["主队进球"], axis=1)
可视化呈现
- 胜负饼图:统计利物浦胜/平/负场次。
- 进球数趋势:
plt.plot(h2h["日期"], h2h["利物浦进球"], marker="o")观察进攻状态起伏。 - 主客场热力图:用
pd.crosstab生成“利物浦主场胜/负” vs “曼城主场胜/负”的交叉表,配合seaborn.heatmap输出直观色块。
问答环节
Q1:为什么我的BeautifulSoup抓不到数据?
A:大概率是目标网页为动态渲染(JS加载),解决方案:先右键“查看网页源代码”确认数据是否在HTML中;若不在,改用selenium + webdriver,或直接找后端API接口(F12 -> Network -> XHR)。
Q2:数据中两队名称不统一(利物浦”和“Liverpool”)怎么办?
A:用pandas的replace方法做映射字典统一化,或者用fuzzywuzzy库进行模糊匹配。
Q3:如何考虑中立场(比如决赛)? A:额外添加“比赛场地”字段,若为“中立场”,则单独标记,统计时排除主场优势干扰。
Q4:想分析近10场交手,如何快速切片?
A:按日期排序后使用df.tail(10)即可。
进阶延伸:结合ELO评分预测未来交锋
你可以在历史交锋数据基础上,计算双方ELO积分差值,再结合Logistic回归,估算胜率。p_win = 1 / (1 + 10^((elo_opp - elo_self)/400)),用Python实现这个模型,就能从“回顾”转向“预测”。
用Python分析历史交锋,核心在于“结构化数据获取” + “上下文逻辑筛选”,无论你是体育数据分析师,还是博彩爱好者,掌握这套流程都能让你快速输出洞察,自动化脚本要合法合规,优先考虑官方API或公开数据集,下次看到“利物浦vs曼城”的赛前海报,你能用代码几分钟内生成一张专属交锋图表,成为朋友圈里的数据达人。