def __init__(self): self.team_abbreviation_parser = TeamAbbreviationParser(abbreviations_to_teams=TEAM_ABBREVIATIONS_TO_TEAM) self.location_abbreviation_parser = LocationAbbreviationParser( abbreviations_to_locations=LOCATION_ABBREVIATIONS_TO_POSITION, ) self.outcome_abbreviation_parser = OutcomeAbbreviationParser( abbreviations_to_outcomes=OUTCOME_ABBREVIATIONS_TO_OUTCOME, ) self.outcome_parser = PlayerBoxScoreOutcomeParser(outcome_abbreviation_parser=self.outcome_abbreviation_parser) self.position_abbreviation_parser = PositionAbbreviationParser( abbreviations_to_positions=POSITION_ABBREVIATIONS_TO_POSITION, ) self.seconds_played_parser = SecondsPlayedParser() self.player_box_scores_parser = PlayerBoxScoresParser( team_abbreviation_parser=self.team_abbreviation_parser, location_abbreviation_parser=self.location_abbreviation_parser, outcome_abbreviation_parser=self.outcome_abbreviation_parser, seconds_played_parser=self.seconds_played_parser ) self.player_season_box_scores_parser = PlayerSeasonBoxScoresParser( team_abbreviation_parser=self.team_abbreviation_parser, location_abbreviation_parser=self.location_abbreviation_parser, outcome_parser=self.outcome_parser, seconds_played_parser=self.seconds_played_parser ) self.player_season_totals_parser = PlayerSeasonTotalsParser( position_abbreviation_parser=self.position_abbreviation_parser, team_abbreviation_parser=self.team_abbreviation_parser, )
def player_box_scores(day, month, year): url = '{BASE_URL}/friv/dailyleaders.cgi?month={month}&day={day}&year={year}'.format( BASE_URL=BASE_URL, day=day, month=month, year=year ) response = requests.get(url=url, allow_redirects=False) response.raise_for_status() if response.status_code == requests.codes.ok: page = DailyLeadersPage(html=html.fromstring(response.content)) box_score_parser = PlayerBoxScoresParser( team_abbreviation_parser=TeamAbbreviationParser( abbreviations_to_teams=TEAM_ABBREVIATIONS_TO_TEAM ), location_abbreviation_parser=LocationAbbreviationParser( abbreviations_to_locations=LOCATION_ABBREVIATIONS_TO_POSITION ), outcome_abbreviation_parser=OutcomeAbbreviationParser( abbreviations_to_outcomes=OUTCOME_ABBREVIATIONS_TO_OUTCOME ), seconds_played_parser=SecondsPlayedParser(), ) return box_score_parser.parse(page.daily_leaders) raise InvalidDate(day=day, month=month, year=year)
def setUp(self): self.november_01_2006_daily_leaders = requests.get( 'https://www.basketball-reference.com/friv/dailyleaders.fcgi?month=11&day=1&year=2006' ).text self.december_18_2015_daily_leaders = requests.get( 'https://www.basketball-reference.com/friv/dailyleaders.fcgi?month=12&day=18&year=2015' ).text self.november_03_2003_daily_leaders = requests.get( 'https://www.basketball-reference.com/friv/dailyleaders.fcgi?month=11&day=03&year=2003' ).text self.december_12_2017_daily_leaders = requests.get( 'https://www.basketball-reference.com/friv/dailyleaders.fcgi?month=12&day=12&year=2017' ).text self.january_29_2017_daily_leaders = requests.get( 'https://www.basketball-reference.com/friv/dailyleaders.fcgi?month=1&day=29&year=2017' ).text self.team_abbreviation_parser = TeamAbbreviationParser( abbreviations_to_teams=TEAM_ABBREVIATIONS_TO_TEAM) self.location_abbreviation_parser = LocationAbbreviationParser( abbreviations_to_locations=LOCATION_ABBREVIATIONS_TO_POSITION) self.outcome_abbreviation_parser = OutcomeAbbreviationParser( abbreviations_to_outcomes=OUTCOME_ABBREVIATIONS_TO_OUTCOME) self.seconds_played_parser = SecondsPlayedParser() self.player_box_scores_parser = PlayerBoxScoresParser( team_abbreviation_parser=self.team_abbreviation_parser, location_abbreviation_parser=self.location_abbreviation_parser, outcome_abbreviation_parser=self.outcome_abbreviation_parser, seconds_played_parser=self.seconds_played_parser, )
def __init__(self): self.team_abbreviation_parser = TeamAbbreviationParser( abbreviations_to_teams=TEAM_ABBREVIATIONS_TO_TEAM) self.league_abbreviation_parser = LeagueAbbreviationParser( abbreviations_to_league=LEAGUE_ABBREVIATIONS_TO_LEAGUE) self.location_abbreviation_parser = LocationAbbreviationParser( abbreviations_to_locations=LOCATION_ABBREVIATIONS_TO_POSITION, ) self.outcome_abbreviation_parser = OutcomeAbbreviationParser( abbreviations_to_outcomes=OUTCOME_ABBREVIATIONS_TO_OUTCOME, ) self.outcome_parser = PlayerBoxScoreOutcomeParser( outcome_abbreviation_parser=self.outcome_abbreviation_parser) self.period_details_parser = PeriodDetailsParser( regulation_periods_count=4) self.period_timestamp_parser = PeriodTimestampParser( timestamp_format=ParserService.PLAY_BY_PLAY_TIMESTAMP_FORMAT) self.position_abbreviation_parser = PositionAbbreviationParser( abbreviations_to_positions=POSITION_ABBREVIATIONS_TO_POSITION, ) self.seconds_played_parser = SecondsPlayedParser() self.scores_parser = ScoresParser( scores_regex=ParserService.PLAY_BY_PLAY_SCORES_REGEX) self.search_result_name_parser = SearchResultNameParser() self.search_result_location_parser = ResourceLocationParser( resource_location_regex=ParserService. SEARCH_RESULT_RESOURCE_LOCATION_REGEX) self.team_name_parser = TeamNameParser( team_names_to_teams=TEAM_NAME_TO_TEAM) self.play_by_plays_parser = PlayByPlaysParser( period_details_parser=self.period_details_parser, period_timestamp_parser=self.period_timestamp_parser, scores_parser=self.scores_parser, ) self.player_box_scores_parser = PlayerBoxScoresParser( team_abbreviation_parser=self.team_abbreviation_parser, location_abbreviation_parser=self.location_abbreviation_parser, outcome_abbreviation_parser=self.outcome_abbreviation_parser, seconds_played_parser=self.seconds_played_parser) self.player_data_parser = PlayerDataParser( search_result_location_parser=self.search_result_location_parser, league_abbreviation_parser=self.league_abbreviation_parser, ) self.player_season_box_scores_parser = PlayerSeasonBoxScoresParser( team_abbreviation_parser=self.team_abbreviation_parser, location_abbreviation_parser=self.location_abbreviation_parser, outcome_parser=self.outcome_parser, seconds_played_parser=self.seconds_played_parser) self.player_season_totals_parser = PlayerSeasonTotalsParser( position_abbreviation_parser=self.position_abbreviation_parser, team_abbreviation_parser=self.team_abbreviation_parser, ) self.player_advanced_season_totals_parser = PlayerAdvancedSeasonTotalsParser( team_abbreviation_parser=self.team_abbreviation_parser, position_abbreviation_parser=self.position_abbreviation_parser, ) self.scheduled_start_time_parser = ScheduledStartTimeParser() self.scheduled_games_parser = ScheduledGamesParser( start_time_parser=self.scheduled_start_time_parser, team_name_parser=self.team_name_parser, ) self.search_results_parser = SearchResultsParser( search_result_name_parser=self.search_result_name_parser, search_result_location_parser=self.search_result_location_parser, league_abbreviation_parser=self.league_abbreviation_parser, ) self.team_totals_parser = TeamTotalsParser( team_abbreviation_parser=self.team_abbreviation_parser) self.division_name_parser = DivisionNameParser(divisions=Division) self.team_standings_parser = TeamStandingsParser(teams=Team) self.conference_division_standings_parser = ConferenceDivisionStandingsParser( division_name_parser=self.division_name_parser, team_standings_parser=self.team_standings_parser, divisions_to_conferences=DIVISIONS_TO_CONFERENCES, )
class ParserService: PLAY_BY_PLAY_TIMESTAMP_FORMAT = "%M:%S.%f" PLAY_BY_PLAY_SCORES_REGEX = "(?P<away_team_score>[0-9]+)-(?P<home_team_score>[0-9]+)" SEARCH_RESULT_RESOURCE_LOCATION_REGEX = '(https?:\/\/www\.basketball-reference\.com\/)?(?P<resource_type>.+?(?=\/)).*\/(?P<resource_identifier>.+).html' def __init__(self): self.team_abbreviation_parser = TeamAbbreviationParser( abbreviations_to_teams=TEAM_ABBREVIATIONS_TO_TEAM) self.league_abbreviation_parser = LeagueAbbreviationParser( abbreviations_to_league=LEAGUE_ABBREVIATIONS_TO_LEAGUE) self.location_abbreviation_parser = LocationAbbreviationParser( abbreviations_to_locations=LOCATION_ABBREVIATIONS_TO_POSITION, ) self.outcome_abbreviation_parser = OutcomeAbbreviationParser( abbreviations_to_outcomes=OUTCOME_ABBREVIATIONS_TO_OUTCOME, ) self.outcome_parser = PlayerBoxScoreOutcomeParser( outcome_abbreviation_parser=self.outcome_abbreviation_parser) self.period_details_parser = PeriodDetailsParser( regulation_periods_count=4) self.period_timestamp_parser = PeriodTimestampParser( timestamp_format=ParserService.PLAY_BY_PLAY_TIMESTAMP_FORMAT) self.position_abbreviation_parser = PositionAbbreviationParser( abbreviations_to_positions=POSITION_ABBREVIATIONS_TO_POSITION, ) self.seconds_played_parser = SecondsPlayedParser() self.scores_parser = ScoresParser( scores_regex=ParserService.PLAY_BY_PLAY_SCORES_REGEX) self.search_result_name_parser = SearchResultNameParser() self.search_result_location_parser = ResourceLocationParser( resource_location_regex=ParserService. SEARCH_RESULT_RESOURCE_LOCATION_REGEX) self.team_name_parser = TeamNameParser( team_names_to_teams=TEAM_NAME_TO_TEAM) self.play_by_plays_parser = PlayByPlaysParser( period_details_parser=self.period_details_parser, period_timestamp_parser=self.period_timestamp_parser, scores_parser=self.scores_parser, ) self.player_box_scores_parser = PlayerBoxScoresParser( team_abbreviation_parser=self.team_abbreviation_parser, location_abbreviation_parser=self.location_abbreviation_parser, outcome_abbreviation_parser=self.outcome_abbreviation_parser, seconds_played_parser=self.seconds_played_parser) self.player_data_parser = PlayerDataParser( search_result_location_parser=self.search_result_location_parser, league_abbreviation_parser=self.league_abbreviation_parser, ) self.player_season_box_scores_parser = PlayerSeasonBoxScoresParser( team_abbreviation_parser=self.team_abbreviation_parser, location_abbreviation_parser=self.location_abbreviation_parser, outcome_parser=self.outcome_parser, seconds_played_parser=self.seconds_played_parser) self.player_season_totals_parser = PlayerSeasonTotalsParser( position_abbreviation_parser=self.position_abbreviation_parser, team_abbreviation_parser=self.team_abbreviation_parser, ) self.player_advanced_season_totals_parser = PlayerAdvancedSeasonTotalsParser( team_abbreviation_parser=self.team_abbreviation_parser, position_abbreviation_parser=self.position_abbreviation_parser, ) self.scheduled_start_time_parser = ScheduledStartTimeParser() self.scheduled_games_parser = ScheduledGamesParser( start_time_parser=self.scheduled_start_time_parser, team_name_parser=self.team_name_parser, ) self.search_results_parser = SearchResultsParser( search_result_name_parser=self.search_result_name_parser, search_result_location_parser=self.search_result_location_parser, league_abbreviation_parser=self.league_abbreviation_parser, ) self.team_totals_parser = TeamTotalsParser( team_abbreviation_parser=self.team_abbreviation_parser) self.division_name_parser = DivisionNameParser(divisions=Division) self.team_standings_parser = TeamStandingsParser(teams=Team) self.conference_division_standings_parser = ConferenceDivisionStandingsParser( division_name_parser=self.division_name_parser, team_standings_parser=self.team_standings_parser, divisions_to_conferences=DIVISIONS_TO_CONFERENCES, ) def parse_division_standings(self, standings): return self.conference_division_standings_parser.parse( division_standings=standings) def parse_play_by_plays(self, play_by_plays, away_team_name, home_team_name): return self.play_by_plays_parser.parse( play_by_plays=play_by_plays, away_team=self.team_name_parser.parse_team_name( team_name=away_team_name), home_team=self.team_name_parser.parse_team_name( team_name=home_team_name), ) def parse_player_box_scores(self, box_scores): return self.player_box_scores_parser.parse(box_scores=box_scores) def parse_player_season_box_scores(self, box_scores): return self.player_season_box_scores_parser.parse( box_scores=box_scores) def parse_player_advanced_season_totals_parser(self, totals): return self.player_advanced_season_totals_parser.parse(totals=totals) def parse_player_season_totals(self, totals): return self.player_season_totals_parser.parse(totals=totals) def parse_scheduled_games(self, games): return self.scheduled_games_parser.parse_games(games) def parse_team_totals(self, first_team_totals, second_team_totals): return self.team_totals_parser.parse( first_team_totals=first_team_totals, second_team_totals=second_team_totals) def parse_player_search_results(self, nba_aba_baa_players): return self.search_results_parser.parse( nba_aba_baa_players=nba_aba_baa_players) def parse_player_data(self, player): return self.player_data_parser.parse(player=player)
class TestPlayerBoxScores(TestCase): def setUp(self): self.november_01_2006_daily_leaders = requests.get( 'https://www.basketball-reference.com/friv/dailyleaders.fcgi?month=11&day=1&year=2006' ).text self.december_18_2015_daily_leaders = requests.get( 'https://www.basketball-reference.com/friv/dailyleaders.fcgi?month=12&day=18&year=2015' ).text self.november_03_2003_daily_leaders = requests.get( 'https://www.basketball-reference.com/friv/dailyleaders.fcgi?month=11&day=03&year=2003' ).text self.december_12_2017_daily_leaders = requests.get( 'https://www.basketball-reference.com/friv/dailyleaders.fcgi?month=12&day=12&year=2017' ).text self.january_29_2017_daily_leaders = requests.get( 'https://www.basketball-reference.com/friv/dailyleaders.fcgi?month=1&day=29&year=2017' ).text self.team_abbreviation_parser = TeamAbbreviationParser( abbreviations_to_teams=TEAM_ABBREVIATIONS_TO_TEAM) self.location_abbreviation_parser = LocationAbbreviationParser( abbreviations_to_locations=LOCATION_ABBREVIATIONS_TO_POSITION) self.outcome_abbreviation_parser = OutcomeAbbreviationParser( abbreviations_to_outcomes=OUTCOME_ABBREVIATIONS_TO_OUTCOME) self.seconds_played_parser = SecondsPlayedParser() self.player_box_scores_parser = PlayerBoxScoresParser( team_abbreviation_parser=self.team_abbreviation_parser, location_abbreviation_parser=self.location_abbreviation_parser, outcome_abbreviation_parser=self.outcome_abbreviation_parser, seconds_played_parser=self.seconds_played_parser, ) def test_box_scores_for_12_18_2015(self): page = DailyLeadersPage( html=html.fromstring(self.december_18_2015_daily_leaders)) parsed_box_score = self.player_box_scores_parser.parse( page.daily_leaders) self.assertEqual(len(parsed_box_score), 250) def test_box_scores_for_12_12_2017(self): page = DailyLeadersPage( html=html.fromstring(self.december_12_2017_daily_leaders)) parsed_box_score = self.player_box_scores_parser.parse( page.daily_leaders) self.assertEqual(len(parsed_box_score), 149) def test_parses_blank_value_for_andrew_bogut_on_12_12_2017(self): page = DailyLeadersPage( html=html.fromstring(self.december_12_2017_daily_leaders)) parsed_box_score = self.player_box_scores_parser.parse( page.daily_leaders) andrew_bogut = parsed_box_score[128] self.assertEqual(andrew_bogut["made_three_point_field_goals"], 0) self.assertEqual(andrew_bogut["attempted_three_point_field_goals"], 0) # Test for minutes played greater than or equal to 60 minutes def test_box_scores_for_01_01_2017(self): page = DailyLeadersPage( html=html.fromstring(self.january_29_2017_daily_leaders)) parsed_box_score = self.player_box_scores_parser.parse( page.daily_leaders) self.assertEqual(len(parsed_box_score), 170) first_box_score = parsed_box_score[0] self.assertEqual(first_box_score["slug"], "millspa01") self.assertEqual(first_box_score["name"], "Paul Millsap") self.assertEqual(first_box_score["team"], Team.ATLANTA_HAWKS) self.assertEqual(first_box_score["opponent"], Team.NEW_YORK_KNICKS) self.assertEqual(first_box_score["outcome"], Outcome.WIN) self.assertEqual(first_box_score["seconds_played"], 3607) self.assertEqual(first_box_score["made_field_goals"], 13) self.assertEqual(first_box_score["attempted_field_goals"], 29) self.assertEqual(first_box_score["made_three_point_field_goals"], 3) self.assertEqual(first_box_score["attempted_three_point_field_goals"], 8) self.assertEqual(first_box_score["made_free_throws"], 8) self.assertEqual(first_box_score["attempted_free_throws"], 10) self.assertEqual(first_box_score["offensive_rebounds"], 8) self.assertEqual(first_box_score["defensive_rebounds"], 11) self.assertEqual(first_box_score["assists"], 7) self.assertEqual(first_box_score["steals"], 1) self.assertEqual(first_box_score["blocks"], 0) self.assertEqual(first_box_score["turnovers"], 3) self.assertEqual(first_box_score["personal_fouls"], 4) self.assertEqual(first_box_score["game_score"], 31.3) def test_parses_new_orleans_hornets_for_box_scores_for_11_03_2003(self): page = DailyLeadersPage( html=html.fromstring(self.november_03_2003_daily_leaders)) parsed_box_score = self.player_box_scores_parser.parse( page.daily_leaders) self.assertEqual(len(parsed_box_score), 145) pj_brown = parsed_box_score[51] self.assertEqual(pj_brown["slug"], "brownpj01") self.assertEqual(pj_brown["name"], "P.J. Brown") self.assertEqual(pj_brown["team"], Team.NEW_ORLEANS_HORNETS) def test_parses_new_orleans_oklahoma_city_hornets_for_box_scores_for_11_01_2006( self): page = DailyLeadersPage( html=html.fromstring(self.november_01_2006_daily_leaders)) parsed_box_score = self.player_box_scores_parser.parse( page.daily_leaders) self.assertEqual(len(parsed_box_score), 272) chris_paul = parsed_box_score[10] self.assertEqual(chris_paul["slug"], "paulch01") self.assertEqual(chris_paul["name"], "Chris Paul") self.assertEqual(chris_paul["team"], Team.NEW_ORLEANS_OKLAHOMA_CITY_HORNETS)