Files
fantabeto/rookies_stats/1_scraping_fbref.ipynb
Giuseppe Musicco 1492328958 Code updated for Serie A 2023/2024
- Reorganization of data folders
- Code adapted for the new Serie A season, also considering only a small number of league games has been played
- Stats from other leagues are considered for players at their first Serie A season (rookies), for now without any adaptation based on league difficulty
- Minor fixes
2023-09-09 19:31:52 +02:00

361 lines
23 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"id": "d065632b",
"metadata": {},
"source": [
"Scraping from http://fbref.com\n",
"\n",
"Data:\n",
"- outfield players stats\n",
"- goalkeepers stats\n",
"- team stats (of and against)\n",
"\n",
"Original code by parth1902:\n",
"https://github.com/parth1902/Scrape-FBref-data"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "3b8d2e7f",
"metadata": {},
"outputs": [],
"source": [
"import requests\n",
"from bs4 import BeautifulSoup\n",
"import pandas as pd\n",
"import numpy as np\n",
"import re\n",
"import sys, getopt\n",
"import csv\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "ab920c85",
"metadata": {},
"outputs": [],
"source": [
"#standard(stats)\n",
"stats = [\"player\",\"nationality\",\"position\",\"team\",\"age\",\"birth_year\",\"games\",\"games_starts\",\"minutes\",\"goals\",\"assists\",\"pens_made\",\"pens_att\",\"cards_yellow\",\"cards_red\",\"goals_per90\",\"assists_per90\",\"goals_assists_per90\",\"goals_pens_per90\",\"goals_assists_pens_per90\",\"xg\",\"npxg\",\"xa\",\"xg_per90\",\"xa_per90\",\"xg_xa_per90\",\"npxg_per90\",\"npxg_xa_per90\"]\n",
"stats3 = [\"players_used\",\"possession\",\"games\",\"games_starts\",\"minutes\",\"goals\",\"assists\",\"pens_made\",\"pens_att\",\"cards_yellow\",\"cards_red\",\"goals_per90\",\"assists_per90\",\"goals_assists_per90\",\"goals_pens_per90\",\"goals_assists_pens_per90\",\"xg\",\"npxg\",\"xa\",\"xg_per90\",\"xa_per90\",\"xg_xa_per90\",\"npxg_per90\",\"npxg_xa_per90\"] \n",
"#goalkeeping(keepers)\n",
"keepers = [\"player\",\"nationality\",\"position\",\"team\",\"age\",\"birth_year\",\"gk_games\",\"gk_games_starts\",\"gk_minutes\",\"gk_goals_against\",\"gk_goals_against_per90\",\"gk_shots_on_target_against\",\"gk_saves\",\"gk_save_pct\",\"gk_wins\",\"gk_ties\",\"gk_losses\",\"gk_clean_sheets\",\"gk_clean_sheets_pct\",\"gk_pens_att\",\"gk_pens_allowed\",\"gk_pens_saved\",\"gk_pens_missed\"]\n",
"keepers3 = [\"players_used\",\"gk_games\",\"gk_games_starts\",\"gk_minutes\",\"gk_goals_against\",\"gk_goals_against_per90\",\"gk_shots_on_target_against\",\"gk_saves\",\"gk_save_pct\",\"gk_wins\",\"gk_ties\",\"gk_losses\",\"gk_clean_sheets\",\"gk_clean_sheets_pct\",\"gk_pens_att\",\"gk_pens_allowed\",\"gk_pens_saved\",\"gk_pens_missed\"]\n",
"#advance goalkeeping(keepersadv)\n",
"keepersadv = [\"player\",\"nationality\",\"position\",\"team\",\"age\",\"birth_year\",\"minutes_90s\",\"gk_goals_against\",\"gk_pens_allowed\",\"gk_free_kick_goals_against\",\"gk_corner_kick_goals_against\",\"gk_own_goals_against\",\"gk_psxg\",\"gk_psnpxg_per_shot_on_target_against\",\"gk_psxg_net\",\"gk_psxg_net_per90\",\"gk_passes_completed_launched\",\"gk_passes_launched\",\"gk_passes_pct_launched\",\"gk_passes\",\"gk_passes_throws\",\"gk_pct_passes_launched\",\"gk_passes_length_avg\",\"gk_goal_kicks\",\"gk_pct_goal_kicks_launched\",\"gk_goal_kick_length_avg\",\"gk_crosses\",\"gk_crosses_stopped\",\"gk_crosses_stopped_pct\",\"gk_def_actions_outside_pen_area\",\"gk_def_actions_outside_pen_area_per90\",\"gk_avg_distance_def_actions\"]\n",
"keepersadv2 = [\"minutes_90s\",\"gk_goals_against\",\"gk_pens_allowed\",\"gk_free_kick_goals_against\",\"gk_corner_kick_goals_against\",\"gk_own_goals_against\",\"gk_psxg\",\"gk_psnpxg_per_shot_on_target_against\",\"gk_psxg_net\",\"gk_psxg_net_per90\",\"gk_passes_completed_launched\",\"gk_passes_launched\",\"gk_passes_pct_launched\",\"gk_passes\",\"gk_passes_throws\",\"gk_pct_passes_launched\",\"gk_passes_length_avg\",\"gk_goal_kicks\",\"gk_pct_goal_kicks_launched\",\"gk_goal_kick_length_avg\",\"gk_crosses\",\"gk_crosses_stopped\",\"gk_crosses_stopped_pct\",\"gk_def_actions_outside_pen_area\",\"gk_def_actions_outside_pen_area_per90\",\"gk_avg_distance_def_actions\"]\n",
"#shooting(shooting)\n",
"shooting = [\"player\",\"nationality\",\"position\",\"team\",\"age\",\"birth_year\",\"minutes_90s\",\"goals\",\"pens_made\",\"pens_att\",\"shots_total\",\"shots_on_target\",\"shots_free_kicks\",\"shots_on_target_pct\",\"shots_total_per90\",\"shots_on_target_per90\",\"goals_per_shot\",\"goals_per_shot_on_target\",\"xg\",\"npxg\",\"npxg_per_shot\",\"xg_net\",\"npxg_net\"]\n",
"shooting2 = [\"minutes_90s\",\"goals\",\"pens_made\",\"pens_att\",\"shots_total\",\"shots_on_target\",\"shots_free_kicks\",\"shots_on_target_pct\",\"shots_total_per90\",\"shots_on_target_per90\",\"goals_per_shot\",\"goals_per_shot_on_target\",\"xg\",\"npxg\",\"npxg_per_shot\",\"xg_net\",\"npxg_net\"]\n",
"shooting3 = [\"goals\",\"pens_made\",\"pens_att\",\"shots_total\",\"shots_on_target\",\"shots_free_kicks\",\"shots_on_target_pct\",\"shots_total_per90\",\"shots_on_target_per90\",\"goals_per_shot\",\"goals_per_shot_on_target\",\"xg\",\"npxg\",\"npxg_per_shot\",\"xg_net\",\"npxg_net\"]\n",
"#passing(passing)\n",
"passing = [\"player\",\"nationality\",\"position\",\"team\",\"age\",\"birth_year\",\"minutes_90s\",\"passes_completed\",\"passes\",\"passes_pct\",\"passes_total_distance\",\"passes_progressive_distance\",\"passes_completed_short\",\"passes_short\",\"passes_pct_short\",\"passes_completed_medium\",\"passes_medium\",\"passes_pct_medium\",\"passes_completed_long\",\"passes_long\",\"passes_pct_long\",\"assists\",\"xa\",\"xa_net\",\"assisted_shots\",\"passes_into_final_third\",\"passes_into_penalty_area\",\"crosses_into_penalty_area\",\"progressive_passes\"]\n",
"passing2 = [\"passes_completed\",\"passes\",\"passes_pct\",\"passes_total_distance\",\"passes_progressive_distance\",\"passes_completed_short\",\"passes_short\",\"passes_pct_short\",\"passes_completed_medium\",\"passes_medium\",\"passes_pct_medium\",\"passes_completed_long\",\"passes_long\",\"passes_pct_long\",\"assists\",\"xa\",\"xa_net\",\"assisted_shots\",\"passes_into_final_third\",\"passes_into_penalty_area\",\"crosses_into_penalty_area\",\"progressive_passes\"]\n",
"#passtypes(passing_types)\n",
"passing_types = [\"player\",\"nationality\",\"position\",\"team\",\"age\",\"birth_year\",\"minutes_90s\",\"passes\",\"passes_live\",\"passes_dead\",\"passes_free_kicks\",\"through_balls\",\"passes_pressure\",\"passes_switches\",\"crosses\",\"corner_kicks\",\"corner_kicks_in\",\"corner_kicks_out\",\"corner_kicks_straight\",\"passes_ground\",\"passes_low\",\"passes_high\",\"passes_left_foot\",\"passes_right_foot\",\"passes_head\",\"throw_ins\",\"passes_other_body\",\"passes_completed\",\"passes_offsides\",\"passes_oob\",\"passes_intercepted\",\"passes_blocked\"]\n",
"passing_types2 = [\"passes\",\"passes_live\",\"passes_dead\",\"passes_free_kicks\",\"through_balls\",\"passes_pressure\",\"passes_switches\",\"crosses\",\"corner_kicks\",\"corner_kicks_in\",\"corner_kicks_out\",\"corner_kicks_straight\",\"passes_ground\",\"passes_low\",\"passes_high\",\"passes_left_foot\",\"passes_right_foot\",\"passes_head\",\"throw_ins\",\"passes_other_body\",\"passes_completed\",\"passes_offsides\",\"passes_oob\",\"passes_intercepted\",\"passes_blocked\"]\n",
"#goal and shot creation(gca)\n",
"gca = [\"player\",\"nationality\",\"position\",\"team\",\"age\",\"birth_year\",\"minutes_90s\",\"sca\",\"sca_per90\",\"sca_passes_live\",\"sca_passes_dead\",\"sca_dribbles\",\"sca_shots\",\"sca_fouled\",\"gca\",\"gca_per90\",\"gca_passes_live\",\"gca_passes_dead\",\"gca_dribbles\",\"gca_shots\",\"gca_fouled\",\"gca_defense\"]\n",
"gca2 = [\"sca\",\"sca_per90\",\"sca_passes_live\",\"sca_passes_dead\",\"sca_dribbles\",\"sca_shots\",\"sca_fouled\",\"gca\",\"gca_per90\",\"gca_passes_live\",\"gca_passes_dead\",\"gca_dribbles\",\"gca_shots\",\"gca_fouled\",\"gca_defense\"]\n",
"#defensive actions(defense)\n",
"defense = [\"player\",\"nationality\",\"position\",\"team\",\"age\",\"birth_year\",\"minutes_90s\",\"tackles\",\"tackles_won\",\"tackles_def_3rd\",\"tackles_mid_3rd\",\"tackles_att_3rd\",\"dribble_tackles\",\"dribbles_vs\",\"dribble_tackles_pct\",\"dribbled_past\",\"pressures\",\"pressure_regains\",\"pressure_regain_pct\",\"pressures_def_3rd\",\"pressures_mid_3rd\",\"pressures_att_3rd\",\"blocks\",\"blocked_shots\",\"blocked_shots_saves\",\"blocked_passes\",\"interceptions\",\"clearances\",\"errors\"]\n",
"defense2 = [\"tackles\",\"tackles_won\",\"tackles_def_3rd\",\"tackles_mid_3rd\",\"tackles_att_3rd\",\"dribble_tackles\",\"dribbles_vs\",\"dribble_tackles_pct\",\"dribbled_past\",\"pressures\",\"pressure_regains\",\"pressure_regain_pct\",\"pressures_def_3rd\",\"pressures_mid_3rd\",\"pressures_att_3rd\",\"blocks\",\"blocked_shots\",\"blocked_shots_saves\",\"blocked_passes\",\"interceptions\",\"clearances\",\"errors\"]\n",
"#possession(possession)\n",
"possession = [\"player\",\"nationality\",\"position\",\"team\",\"age\",\"birth_year\",\"minutes_90s\",\"touches\",\"touches_def_pen_area\",\"touches_def_3rd\",\"touches_mid_3rd\",\"touches_att_3rd\",\"touches_att_pen_area\",\"touches_live_ball\",\"dribbles_completed\",\"dribbles\",\"dribbles_completed_pct\",\"players_dribbled_past\",\"nutmegs\",\"carries\",\"carry_distance\",\"carry_progressive_distance\",\"progressive_carries\",\"carries_into_final_third\",\"carries_into_penalty_area\",\"pass_targets\",\"passes_received\",\"passes_received_pct\",\"miscontrols\",\"dispossessed\"]\n",
"possession2 = [\"touches\",\"touches_def_pen_area\",\"touches_def_3rd\",\"touches_mid_3rd\",\"touches_att_3rd\",\"touches_att_pen_area\",\"touches_live_ball\",\"dribbles_completed\",\"dribbles\",\"dribbles_completed_pct\",\"players_dribbled_past\",\"nutmegs\",\"carries\",\"carry_distance\",\"carry_progressive_distance\",\"progressive_carries\",\"carries_into_final_third\",\"carries_into_penalty_area\",\"pass_targets\",\"passes_received\",\"passes_received_pct\",\"miscontrols\",\"dispossessed\"]\n",
"#playingtime(playingtime)\n",
"playingtime = [\"player\",\"nationality\",\"position\",\"team\",\"age\",\"birth_year\",\"minutes_90s\",\"games\",\"minutes\",\"minutes_per_game\",\"minutes_pct\",\"games_starts\",\"minutes_per_start\",\"games_subs\",\"minutes_per_sub\",\"unused_subs\",\"points_per_match\",\"on_goals_for\",\"on_goals_against\",\"plus_minus\",\"plus_minus_per90\",\"plus_minus_wowy\",\"on_xg_for\",\"on_xg_against\",\"xg_plus_minus\",\"xg_plus_minus_per90\",\"xg_plus_minus_wowy\"]\n",
"playingtime2 = [\"games\",\"minutes\",\"minutes_per_game\",\"minutes_pct\",\"games_starts\",\"minutes_per_start\",\"games_subs\",\"minutes_per_sub\",\"unused_subs\",\"points_per_match\",\"on_goals_for\",\"on_goals_against\",\"plus_minus\",\"plus_minus_per90\",\"plus_minus_wowy\",\"on_xg_for\",\"on_xg_against\",\"xg_plus_minus\",\"xg_plus_minus_per90\",\"xg_plus_minus_wowy\"]\n",
"#miscallaneous(misc)\n",
"misc = [\"player\",\"nationality\",\"position\",\"team\",\"age\",\"birth_year\",\"minutes_90s\",\"cards_yellow\",\"cards_red\",\"cards_yellow_red\",\"fouls\",\"fouled\",\"offsides\",\"crosses\",\"interceptions\",\"tackles_won\",\"pens_won\",\"pens_conceded\",\"own_goals\",\"ball_recoveries\",\"aerials_won\",\"aerials_lost\",\"aerials_won_pct\"]\n",
"misc2 = [\"cards_yellow\",\"cards_red\",\"cards_yellow_red\",\"fouls\",\"fouled\",\"offsides\",\"crosses\",\"interceptions\",\"tackles_won\",\"pens_won\",\"pens_conceded\",\"own_goals\",\"ball_recoveries\",\"aerials_won\",\"aerials_lost\",\"aerials_won_pct\"]\n",
"\n",
"def get_tables(url,text):\n",
" headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}\n",
"\n",
" res = requests.get(url, headers = headers)\n",
" ## The next two lines get around the issue with comments breaking the parsing.\n",
" comm = re.compile(\"<!--|-->\")\n",
" soup = BeautifulSoup(comm.sub(\"\",res.text),'lxml')\n",
" all_tables = soup.findAll(\"tbody\")\n",
" \n",
" team_table = all_tables[0]\n",
" team_vs_table = all_tables[1]\n",
" player_table = all_tables[2]\n",
" if text == 'for':\n",
" return player_table, team_table\n",
" if text == 'vs':\n",
" return player_table, team_vs_table\n",
"\n",
"def get_frame(features, player_table):\n",
" pre_df_player = dict()\n",
" features_wanted_player = features\n",
" rows_player = player_table.find_all('tr')\n",
" for row in rows_player:\n",
" if(row.find('th',{\"scope\":\"row\"}) != None):\n",
" \n",
" for f in features_wanted_player:\n",
" cell = row.find(\"td\",{\"data-stat\": f})\n",
" if(cell == None):\n",
" continue\n",
" a = cell.text.strip().encode()\n",
" text=a.decode(\"utf-8\")\n",
" if(text == ''):\n",
" text = '0'\n",
" if((f!='player')&(f!='nationality')&(f!='position')&(f!='squad')&(f!='age')&(f!='birth_year')&(f!='team')):\n",
" text = float(text.replace(',','')) \n",
" if f in pre_df_player:\n",
" pre_df_player[f].append(text)\n",
" else:\n",
" pre_df_player[f] = [text]\n",
" df_player = pd.DataFrame.from_dict(pre_df_player)\n",
" return df_player\n",
"\n",
"def get_frame_team(features, team_table):\n",
" pre_df_squad = dict()\n",
" #Note: features does not contain squad name, it requires special treatment\n",
" features_wanted_squad = features\n",
" rows_squad = team_table.find_all('tr')\n",
" for row in rows_squad:\n",
" if(row.find('th',{\"scope\":\"row\"}) != None):\n",
" name = row.find('th',{\"data-stat\":\"team\"}).text.strip().encode().decode(\"utf-8\")\n",
" if 'team' in pre_df_squad:\n",
" pre_df_squad['team'].append(name)\n",
" else:\n",
" pre_df_squad['team'] = [name]\n",
" for f in features_wanted_squad:\n",
" cell = row.find(\"td\",{\"data-stat\": f})\n",
" if(cell == None):\n",
" continue\n",
" a = cell.text.strip().encode()\n",
" text=a.decode(\"utf-8\")\n",
" if(text == ''):\n",
" text = '0'\n",
" if((f!='player')&(f!='nationality')&(f!='position')&(f!='squad')&(f!='age')&(f!='birth_year')&(f!='team')):\n",
" text = float(text.replace(',',''))\n",
" if f in pre_df_squad:\n",
" pre_df_squad[f].append(text)\n",
" else:\n",
" pre_df_squad[f] = [text]\n",
" df_squad = pd.DataFrame.from_dict(pre_df_squad)\n",
" return df_squad\n",
"\n",
"def get_frame_team_2(features, team_table):\n",
" pre_df_squad = dict()\n",
" #Note: features does not contain squad name, it requires special treatment\n",
" features_wanted_squad = features\n",
" rows_squad = team_table.find_all('tr')\n",
" for row in rows_squad:\n",
" if(row.find('th',{\"scope\":\"row\"}) != None):\n",
" name = row.find('th',{\"data-stat\":\"squad\"}).text.strip().encode().decode(\"utf-8\")\n",
" if 'squad' in pre_df_squad:\n",
" pre_df_squad['squad'].append(name)\n",
" else:\n",
" pre_df_squad['squad'] = [name]\n",
" for f in features_wanted_squad:\n",
" cell = row.find(\"td\",{\"data-stat\": f})\n",
" a = cell.text.strip().encode()\n",
" text=a.decode(\"utf-8\")\n",
" if(text == ''):\n",
" text = '0'\n",
" if((f!='player')&(f!='nationality')&(f!='position')&(f!='squad')&(f!='age')&(f!='birth_year')&(f!='team')):\n",
" text = float(text.replace(',',''))\n",
" print(f)\n",
" if f in pre_df_squad:\n",
" pre_df_squad[f].append(text)\n",
" else:\n",
" pre_df_squad[f] = [text]\n",
" df_squad = pd.DataFrame.from_dict(pre_df_squad)\n",
" return df_squad\n",
"\n",
"def frame_for_category(category,top,end,features):\n",
" url = (top + category + end)\n",
" player_table, team_table = get_tables(url,'for')\n",
" df_player = get_frame(features, player_table)\n",
" return df_player\n",
"\n",
"def frame_for_category_team(category,top,end,features,text):\n",
" url = (top + category + end)\n",
" player_table, team_table = get_tables(url,text)\n",
" df_team = get_frame_team(features, team_table)\n",
" return df_team\n",
"\n",
"\n",
"\n",
"\n",
"#Function to get the player data for outfield player, includes all categories - standard stats, shooting\n",
"#passing, passing types, goal and shot creation, defensive actions, possession, and miscallaneous\n",
"def get_outfield_data(top, end):\n",
" df1 = frame_for_category('stats',top,end,stats)\n",
" df2 = frame_for_category('shooting',top,end,shooting2)\n",
" df3 = frame_for_category('passing',top,end,passing2)\n",
" df4 = frame_for_category('passing_types',top,end,passing_types2)\n",
" df5 = frame_for_category('gca',top,end,gca2)\n",
" df6 = frame_for_category('defense',top,end,defense2)\n",
" df7 = frame_for_category('possession',top,end,possession2)\n",
" df8 = frame_for_category('misc',top,end,misc2)\n",
" df = pd.concat([df1, df2, df3, df4, df5, df6, df7, df8], axis=1)\n",
" df = df.loc[:,~df.columns.duplicated()]\n",
" return df\n",
"\n",
"\n",
"#Function to get keeping and advance goalkeeping data\n",
"def get_keeper_data(top,end):\n",
" df1 = frame_for_category('keepers',top,end,keepers)\n",
" df2 = frame_for_category('keepersadv',top,end,keepersadv2)\n",
" df = pd.concat([df1, df2], axis=1)\n",
" df = df.loc[:,~df.columns.duplicated()]\n",
" return df\n",
"\n",
"\n",
"\n",
"#Function to get team-wise data accross all categories as mentioned above\n",
"def get_team_data(top,end,text):\n",
" df1 = frame_for_category_team('stats',top,end,stats3,text)\n",
" df2 = frame_for_category_team('keepers',top,end,keepers3,text)\n",
" df3 = frame_for_category_team('keepersadv',top,end,keepersadv2,text)\n",
" df4 = frame_for_category_team('shooting',top,end,shooting3,text)\n",
" df5 = frame_for_category_team('passing',top,end,passing2,text)\n",
" df6 = frame_for_category_team('passing_types',top,end,passing_types2,text)\n",
" df7 = frame_for_category_team('gca',top,end,gca2,text)\n",
" df8 = frame_for_category_team('defense',top,end,defense2,text)\n",
" df9 = frame_for_category_team('possession',top,end,possession2,text)\n",
" df10 = frame_for_category_team('misc',top,end,misc2,text)\n",
" df = pd.concat([df1, df2, df3, df4, df5, df6, df7, df8, df9, df10], axis=1)\n",
" df = df.loc[:,~df.columns.duplicated()]\n",
" return df"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "69f254cf",
"metadata": {},
"outputs": [],
"source": [
"import time\n",
"\n",
"leagues = ['Serie-A', 'Serie-B']\n",
"leagues_id = ['11', '18']\n",
"seasons = ['2018-2019', '2019-2020', '2020-2021', '2021-2022', '2022-2023']\n",
"\n",
"for i in range( len(leagues) ):\n",
" for j in range( len(seasons) ):\n",
" top = 'https://fbref.com/en/comps/' + leagues_id[i] + '/' + seasons[j] + '/'\n",
" end = '/' + seasons[j] + '-' + leagues[i] + '-Stats'\n",
" \n",
" file = 'fbref_data/' + leagues[i] + '_' + seasons[j] + '_'\n",
" \n",
" get_outfield_data(top, end).to_csv(file + 'outfield.csv', index = False)\n",
" get_team_data(top, end, 'for').to_csv(file + 'team.csv', index = False)\n",
" get_team_data(top, end, 'vs').to_csv(file + 'teamvs.csv', index = False)\n",
" \n",
" time.sleep(30)\n"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "125223ae",
"metadata": {},
"outputs": [],
"source": [
"leagues = ['La-Liga', 'Premier-League', 'Ligue-1']\n",
"leagues_id = ['12', '9', '13']\n",
"seasons = ['2018-2019', '2019-2020', '2020-2021', '2021-2022', '2022-2023']\n",
"\n",
"for i in range( len(leagues) ):\n",
" for j in range( len(seasons) ):\n",
" top = 'https://fbref.com/en/comps/' + leagues_id[i] + '/' + seasons[j] + '/'\n",
" end = '/' + seasons[j] + '-' + leagues[i] + '-Stats'\n",
" \n",
" file = 'fbref_data/' + leagues[i] + '_' + seasons[j] + '_'\n",
" \n",
" get_outfield_data(top, end).to_csv(file + 'outfield.csv', index = False)\n",
" get_team_data(top, end, 'for').to_csv(file + 'team.csv', index = False)\n",
" get_team_data(top, end, 'vs').to_csv(file + 'teamvs.csv', index = False)\n",
" \n",
" time.sleep(30)\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "e1b2085d",
"metadata": {},
"outputs": [],
"source": [
"leagues = ['Bundesliga', 'Eredivisie']\n",
"leagues_id = ['20', '23']\n",
"seasons = ['2018-2019', '2019-2020', '2020-2021', '2021-2022', '2022-2023']\n",
"\n",
"for i in range( len(leagues) ):\n",
" for j in range( len(seasons) ):\n",
" top = 'https://fbref.com/en/comps/' + leagues_id[i] + '/' + seasons[j] + '/'\n",
" end = '/' + seasons[j] + '-' + leagues[i] + '-Stats'\n",
" \n",
" file = 'fbref_data/' + leagues[i] + '_' + seasons[j] + '_'\n",
" \n",
" get_outfield_data(top, end).to_csv(file + 'outfield.csv', index = False)\n",
" get_team_data(top, end, 'for').to_csv(file + 'team.csv', index = False)\n",
" get_team_data(top, end, 'vs').to_csv(file + 'teamvs.csv', index = False)\n",
" \n",
" time.sleep(30)\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "d4682806",
"metadata": {},
"outputs": [],
"source": [
"leagues = ['Primera-Division']\n",
"leagues_id = ['21']\n",
"seasons = ['2022-2023']\n",
"\n",
"for i in range( len(leagues) ):\n",
" for j in range( len(seasons) ):\n",
" top = 'https://fbref.com/en/comps/' + leagues_id[i] + '/' + seasons[j] + '/'\n",
" end = '/' + seasons[j] + '-' + leagues[i] + '-Stats'\n",
" \n",
" file = 'fbref_data/' + leagues[i] + '_' + seasons[j] + '_'\n",
" \n",
" get_outfield_data(top, end).to_csv(file + 'outfield.csv', index = False)\n",
" get_team_data(top, end, 'for').to_csv(file + 'team.csv', index = False)\n",
" get_team_data(top, end, 'vs').to_csv(file + 'teamvs.csv', index = False)\n",
" \n",
" time.sleep(30)\n",
"\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.13"
}
},
"nbformat": 4,
"nbformat_minor": 5
}