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

Python for循环爬取比赛数据合并到单个DataFrame问题排查

问题根因

  • 最终DataFrame的生成逻辑放在了id遍历循环外部,每次循环爬取的单场比赛数据没有实时追加到全局存储的DataFrame中,循环结束后只会保留最后一个id的爬取结果,看起来就像只执行了一次循环。
  • 初始定义的全局df全程没有被使用,循环内生成的df_h、df_a也属于无效代码没有被调用。

修复后可运行代码

import requests
from bs4 import BeautifulSoup
import json
import pandas as pd

# 初始化全局存储用的空DataFrame
colnames = ["x", "y", "xg", "team"]
df = pd.DataFrame(columns=colnames)

for match_id in range(16376,16379):
    # 避免和内置函数id重名,把变量名改成match_id
    understat = f'https://understat.com/match/{match_id}'
    res = requests.get(understat)
    soup = BeautifulSoup(res.content, "lxml")
    scripts = soup.find_all('script')

    # 提取shots数据的json内容
    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])

    # 生成当前场次的临时DataFrame,追加到全局df
    temp_df = pd.DataFrame([x, y, xg, team], index=colnames).T
    df = pd.concat([df, temp_df], ignore_index=True)

# 所有场次爬取完成后可以输出查看或者保存
print(df.head())
# df.to_csv("understat_shots.csv", index=False, encoding="utf_8_sig")

优化建议

  • 可以在请求部分增加超时设置和异常捕获,避免单个id请求失败导致整个程序终止。
  • 可以设置合理的请求间隔,避免请求频率过高被网站封禁IP。

内容的提问来源于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 08:06:03