You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python循环爬取比赛数据仅单场生效 多场结果合并到同一DataFrame求助

问题原因
  • 核心问题是你将单场比赛的DataFrame变量df定义在了循环内部,每一轮遍历都会用新的单场数据覆盖上一轮的df值,循环结束后自然只能保留最后一场比赛的爬取结果
  • 你没有设置专门的容器来累计存储多场比赛的爬取结果,也没有做单场数据和总数据集的合并逻辑
修复方案

修改逻辑为:在循环外初始化存储容器,每次循环生成单场数据后追加到容器,最后合并为总DataFrame。还可以额外增加match_id字段标识每条数据所属的比赛,方便后续溯源。
修改后的完整代码如下:

import requests
from bs4 import BeautifulSoup
import json
import pandas as pd
import time # 可选,加延迟防封禁

# 循环外初始化存储所有单场df的列表
all_match_df = []

for match_id in range(16376,16379):
    understat = f'https://understat.com/match/{match_id}'
    res = requests.get(understat)
    soup = BeautifulSoup(res.content, "lxml")
    scripts = soup.find_all('script')

    strings = scripts[1].string
    index_start = strings.index("('") + 2
    index_end = strings.index("')")
    json_data = strings[index_start:index_end]
    json_data = json_data.encode('utf8').decode('unicode_escape')
    data1 = json.loads(json_data)

    x = []
    y = []
    xg = []
    team = []
    data_home = data1["h"]
    data_away = data1["a"]

    for index in range(len(data_home)):
        for key in data_home[index]:
            if key == "X":
                x.append(data_home[index][key])
            if key == "Y":
                y.append(data_home[index][key])
            if key == "xG":
                xg.append(data_home[index][key])
            if key == "h_team":
                team.append(data_home[index][key])

    for index in range(len(data_away)):
        for key in data_away[index]:
            if key == "X":
                x.append(data_away[index][key])
            if key == "Y":
                y.append(data_away[index][key])
            if key == "xG":
                xg.append(data_away[index][key])
            if key == "a_team":
                team.append(data_away[index][key])

    colnames = ["x", "y", "xg", "team"]
    single_df = pd.DataFrame([x, y, xg, team], index=colnames)
    single_df = single_df.T
    # 新增比赛ID列,方便区分不同场次
    single_df['match_id'] = match_id
    # 把当前单场df追加到总列表里
    all_match_df.append(single_df)
    
    # 可选:加1秒延迟,避免请求太频繁被网站封禁
    time.sleep(1)

# 所有循环跑完后,合并所有单场df为总df
final_df = pd.concat(all_match_df, ignore_index=True)

# 后续可以直接用final_df做分析或者导出
print(final_df.shape) # 可以打印行数确认是否拿到了所有比赛的数据
额外优化建议
  • 可以加异常捕获逻辑,处理部分ID无效、请求失败的情况,避免单个ID爬取出错导致整个程序终止
  • 可以根据需求新增比赛日期、对阵双方等公共字段到单场DataFrame中,完善数据维度

内容的提问来源于stack exchange,提问作者user16805952

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 07:27:02