def get_stats(name, stat_type='PER_GAME', season=0, playoffs=False, career=False): try: suffix1 = get_player_suffix(name, False).replace('/', '%2F') for i in range(1, 6): suffix = suffix1[:-6] + str(i) + ".html" selector = stat_type.lower() if playoffs: selector = 'playoffs_'+selector r = get(f'https://widgets.sports-reference.com/wg.fcgi?css=1&site=bbr&url={suffix}&div=div_{selector}') if r.status_code==200: soup = BeautifulSoup(r.content, 'html.parser') table = soup.find('table') df = pd.read_html(str(table))[0] df.rename(columns={'Season': 'SEASON', 'Age': 'AGE', 'Tm': 'TEAM', 'Lg': 'LEAGUE', 'Pos': 'POS'}, inplace=True) career_index = df[df['SEASON']=='Career'].index[0] if career: df = df.iloc[career_index+2:, :] else: df = df.iloc[:career_index, :] df = df.reset_index().dropna(axis=1).drop('index', axis=1) if season and season >= 1949 and season <= int(date.today().year): season1 = str(season - 1) + "-" + str(season)[2:] if len(df.loc[df['SEASON']==season1].head(1)) != 0: return df.loc[df['SEASON']==season1].head(1).reset_index(drop=True) else: return df except: suffix1 = get_player_suffix(name, True).replace('/', '%2F') for i in range(1, 6): suffix = suffix1[:-6] + str(i) + ".html" selector = stat_type.lower() if playoffs: selector = 'playoffs_'+selector r = get(f'https://widgets.sports-reference.com/wg.fcgi?css=1&site=bbr&url={suffix}&div=div_{selector}') if r.status_code==200: soup = BeautifulSoup(r.content, 'html.parser') table = soup.find('table') df = pd.read_html(str(table))[0] df.rename(columns={'Season': 'SEASON', 'Age': 'AGE', 'Tm': 'TEAM', 'Lg': 'LEAGUE', 'Pos': 'POS'}, inplace=True) career_index = df[df['SEASON']=='Career'].index[0] if career: df = df.iloc[career_index+2:, :] else: df = df.iloc[:career_index, :] df = df.reset_index().dropna(axis=1).drop('index', axis=1) if season and season >= 1949 and season <= int(date.today().year): season1 = str(season - 1) + "-" + str(season)[2:] if len(df.loc[df['SEASON']==season1].head(1)) != 0: return df.loc[df['SEASON']==season1].head(1).reset_index(drop=True) else: return df return df
def get_stats(name, stat_type='PER_GAME', playoffs=False, career=False): suffix = get_player_suffix(name).replace('/', '%2F') selector = stat_type.lower() if playoffs: selector = 'playoffs_' + selector r = get( f'https://widgets.sports-reference.com/wg.fcgi?css=1&site=bbr&url={suffix}&div=div_{selector}' ) if r.status_code == 200: soup = BeautifulSoup(r.content, 'html.parser') table = soup.find('table') df = pd.read_html(str(table))[0] df.rename(columns={ 'Season': 'SEASON', 'Age': 'AGE', 'Tm': 'TEAM', 'Lg': 'LEAGUE', 'Pos': 'POS' }, inplace=True) if 'FG.1' in df.columns: df.rename(columns={'FG.1': 'FG%'}, inplace=True) if 'eFG' in df.columns: df.rename(columns={'eFG': 'eFG%'}, inplace=True) if 'FT.1' in df.columns: df.rename(columns={'FT.1': 'FT%'}, inplace=True) career_index = df[df['SEASON'] == 'Career'].index[0] if career: df = df.iloc[career_index + 2:, :] else: df = df.iloc[:career_index, :] df = df.reset_index().drop('index', axis=1) return df
def get_game_logs(name, start_date, end_date, playoffs=False): suffix = get_player_suffix(name).replace('/', '%2F').replace('.html', '') start_date_str = start_date end_date_str = end_date start_date = pd.to_datetime(start_date) end_date = pd.to_datetime(end_date) years = list(range(start_date.year, end_date.year+2)) if playoffs: selector = 'div_pgl_basic_playoffs' else: selector = 'div_pgl_basic' final_df = None for year in years: r = get(f'https://widgets.sports-reference.com/wg.fcgi?css=1&site=bbr&url={suffix}%2Fgamelog%2F{year}&div={selector}') if r.status_code==200: soup = BeautifulSoup(r.content, 'html.parser') table = soup.find('table') df = pd.read_html(str(table))[0] df.rename(columns = {'Date': 'DATE', 'Age': 'AGE', 'Tm': 'TEAM', 'Unnamed: 5': 'HOME/AWAY', 'Opp': 'OPPONENT', 'Unnamed: 7': 'RESULT', 'GmSc': 'GAME_SCORE'}, inplace=True) df['HOME/AWAY'] = df['HOME/AWAY'].apply(lambda x: 'AWAY' if x=='@' else 'HOME') df = df[df['Rk']!='Rk'] df = df.drop(['Rk', 'G'], axis=1) df = df.loc[(df['DATE'] >= start_date_str) & (df['DATE'] <= end_date_str)] active_df = pd.DataFrame(columns = list(df.columns)) for index, row in df.iterrows(): if len(row['GS'])>1: continue active_df = active_df.append(row) if final_df is None: final_df = pd.DataFrame(columns=list(active_df.columns)) final_df = final_df.append(active_df) return final_df
def get_stats(name, stat_type='PER_GAME', playoffs=False, career=False): #credit: https://github.com/vishaalagartha/basketball_reference_scraper try: from utils import get_player_suffix except: from basketball_reference_scraper.utils import get_player_suffix suffix = get_player_suffix(name).replace('/', '%2F') selector = stat_type.lower() if playoffs: selector = 'playoffs_'+selector r = get(f'https://widgets.sports-reference.com/wg.fcgi?css=1&site=bbr&url={suffix}&div=div_{selector}') if r.status_code==200: soup = BeautifulSoup(r.content, 'html.parser') table = soup.find('table') df = pd.read_html(str(table))[0] df.rename(columns={'Season': 'SEASON', 'Age': 'AGE', 'Tm': 'TEAM', 'Lg': 'LEAGUE', 'Pos': 'POS'}, inplace=True) career_index = df[df['SEASON']=='Career'].index[0] if career: df = df.iloc[career_index+2:, :] else: df = df.iloc[:career_index, :] df = df.reset_index().dropna(axis=1).drop('index', axis=1) return df
def get_game_logs(name, start_date, end_date, playoffs=False, num_games = None): """ Will get the raw gamelogs for a given player in the given date ranges Args: name (str): Name of player whose games you want start_date (str): Inclusive start date of game logs in format 'YYYY-MM-DD' end_date (str): Inclusive end date of game logs in format 'YYYY-MM-DD' playoffs (bool): Whetehr or not to include playoff games Returns: returns a dataframe with a record of games between the dates, including categories ['Rk', 'G', 'DATE', 'AGE', 'TEAM', 'HOME/AWAY', 'OPPONENT', 'RESULT', 'GS', 'MP', 'FG', 'FGA', 'FG%', '3P', '3PA', '3P%', 'FT', 'FTA', 'FT%', 'ORB', 'DRB', 'TRB', 'AST', 'STL', 'BLK', 'TOV', 'PF', 'PTS', 'GAME_SCORE', '+/-'] """ suffix = utils.get_player_suffix(name).replace('/', '%2F').replace('.html', '') start_date_str = start_date end_date_str = end_date start_date = pd.to_datetime(start_date) end_date = pd.to_datetime(end_date) years = list(range(start_date.year, end_date.year+2)) if playoffs: selector = 'div_pgl_basic_playoffs' else: selector = 'div_pgl_basic' final_df = None for year in years: url = f'https://widgets.sports-reference.com/wg.fcgi?css=1&site=bbr&url={suffix}%2Fgamelog%2F{year}&div={selector}' r = get(url) if r.status_code==200: soup = BeautifulSoup(r.content, 'html.parser') table = soup.find('table') try: df = pd.read_html(str(table))[0] except ValueError as e: continue df.rename(columns = {'Date': 'DATE', 'Age': 'AGE', 'Tm': 'TEAM', 'Unnamed: 5': 'HOME/AWAY', 'Opp': 'OPPONENT','Unnamed: 7': 'RESULT', 'GmSc': 'GAME_SCORE'}, inplace=True) df['HOME/AWAY'] = df['HOME/AWAY'].apply(lambda x: 'AWAY' if x=='@' else 'HOME') df = df[df['Rk']!='Rk'] try: df = df.drop(['Unnamed: 30'], axis=1) except Exception as e: pass df = df.loc[(df['DATE'] >= start_date_str) & (df['DATE'] <= end_date_str)] active_df = pd.DataFrame(columns = list(df.columns)) for index, row in df.iterrows(): if len(row['GS'])>1: empty_game = pd.DataFrame([[row['Rk'], row['G'], row['DATE'], row['AGE'], row['TEAM'], row['HOME/AWAY'], row['OPPONENT'], row['RESULT'], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]) empty_game.columns = list(df.columns) active_df = active_df.append(empty_game) continue active_df = active_df.append(row) if final_df is None: final_df = pd.DataFrame(columns=list(active_df.columns)) final_df = final_df.append(active_df) if num_games != None: final_df = final_df[(final_df['Rk'].astype(int) <= num_games)] return final_df
def get_game_logs(_name, year, playoffs=False, ask_matches=True): name = lookup(_name, ask_matches) suffix = get_player_suffix(name).replace('/', '%2F').replace('.html', '') if playoffs: selector = 'div_pgl_basic_playoffs' else: selector = 'div_pgl_basic' r = get(f'https://widgets.sports-reference.com/wg.fcgi?css=1&site=bbr&url={suffix}%2Fgamelog%2F{year}%2F&div={selector}') if r.status_code==200: soup = BeautifulSoup(r.content, 'html.parser') table = soup.find('table') if table: df = pd.read_html(str(table))[0] df.rename(columns = {'Date': 'DATE', 'Age': 'AGE', 'Tm': 'TEAM', 'Unnamed: 5': 'HOME/AWAY', 'Opp': 'OPPONENT', 'Unnamed: 7': 'RESULT', 'GmSc': 'GAME_SCORE'}, inplace=True) df['HOME/AWAY'] = df['HOME/AWAY'].apply(lambda x: 'AWAY' if x=='@' else 'HOME') df = df[df['Rk']!='Rk'] df = df.drop(['Rk', 'G'], axis=1) df['DATE'] = pd.to_datetime(df['DATE']) df = df[df['GS'] == '1'].reset_index(drop=True) return df
def get_player_headshot(name): suffix = get_player_suffix(name) jpg = suffix.split('/')[-1].replace('html', 'jpg') url = 'https://d2cwpp38twqe55.cloudfront.net/req/202006192/images/players/' + jpg return url