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

