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

如何从fbref.com爬取联赛球员数据(而非球队数据)至pandas DataFrame?

解决FBref联赛球员数据爬取问题

你的代码存在三个核心问题

  • 未初始化BeautifulSoup实例:仅执行了requests.get但未将返回的HTML内容传入BeautifulSoup,导致soup变量未定义(运行时会直接报错)
  • 语法错误:最后一行代码argentina_standard_df = pd.DataFrame(temp)]].多了多余的方括号与句号
  • 表格定位错误:你尝试的stats_squads_standards_for是球队数据表格的ID,而球员数据表格的固定ID为stats_standard

修正后的通用爬取代码

以下代码兼容FBref所有联赛的球员标准数据爬取,只需传入对应联赛的统计页面URL即可:

import requests
import pandas as pd
from bs4 import BeautifulSoup

def get_league_player_stats(league_url):
    # 模拟浏览器请求(避免反爬拦截)
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
    }
    response = requests.get(league_url, headers=headers)
    soup = BeautifulSoup(response.text, 'html.parser')
    
    # 精准定位球员数据表格(全联赛通用ID)
    player_table = soup.find('table', id='stats_standard')
    
    # 读取表格并处理合并表头
    df_list = pd.read_html(str(player_table), header=[0, 1])
    player_df = df_list[0]
    
    # 合并多级表头为单层(可选,方便后续数据处理)
    player_df.columns = ['_'.join(col).strip() for col in player_df.columns.values]
    
    return player_df

# 测试阿根廷联赛
argentina_url = 'https://fbref.com/en/comps/21/stats/Primera-Division-Stats'
argentina_players = get_league_player_stats(argentina_url)
print(argentina_players.head())

# 测试奥地利德甲
austria_url = 'https://fbref.com/en/comps/56/stats/Austrian-Bundesliga-Stats'
austria_players = get_league_player_stats(austria_url)
print(austria_players.head())

关键说明

  • 通用定位逻辑:FBref所有联赛的球员标准数据表格ID均为stats_standard,用ID定位比class更稳定(class可能随页面更新变动)
  • 多级表头处理:页面中球员表格是合并表头(如"Per 90 Minutes"下的子指标),header=[0,1]参数会保留两级表头,后续合并为单层表头更便于数据分析
  • 反爬适配:添加User-Agent请求头模拟浏览器访问,避免被网站直接拦截;若爬取频率高,建议添加time.sleep(2)延迟请求间隔

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 00:53:30