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
相关产品推荐
相关产品推荐

