From 19de56dc5c693f4ac66ea81c981493f27d2656b9 Mon Sep 17 00:00:00 2001 From: JoeM PC Date: Tue, 23 Apr 2024 15:10:46 +0100 Subject: [PATCH 1/8] added functionality such as getting match results by event, team rankings for event, and match stats --- main.py | 123 ++++ requirements.txt | 1 - test.ipynb | 1750 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 1873 insertions(+), 1 deletion(-) create mode 100644 test.ipynb diff --git a/main.py b/main.py index bb8042f..1ba20c2 100644 --- a/main.py +++ b/main.py @@ -6,6 +6,7 @@ from python_utils import converters import time import zoneinfo import tzlocal +import random HLTV_COOKIE_TIMEZONE = "Europe/Copenhagen" HLTV_ZONEINFO=zoneinfo.ZoneInfo(HLTV_COOKIE_TIMEZONE) @@ -56,6 +57,31 @@ def get_parsed_page(url, delay=0.5): return BeautifulSoup(requests.get(url, headers=headers, cookies=cookies).text, "lxml") +def get_parsed_page_matches(url, delay=0.5, max_trys = 100): + # This fixes a blocked error when trying to get game results page + headers = { + "referer": "https://www.hltv.org/matches", ## Have changed referer + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" + } + + cookies = { + "hltvTimeZone": HLTV_COOKIE_TIMEZONE + } + + time.sleep(delay) + req = requests.get(url, headers=headers, cookies=cookies) + + try_number = 1 + while req.status_code == 403: + time.sleep(delay) + req = requests.get(url, headers=headers, cookies=cookies) + try_number += 1 + if try_number == max_trys: + break + + results = BeautifulSoup(req.text, "lxml") + return results + def top5teams(): home = get_parsed_page("https://hltv.org/") teams = [] @@ -442,6 +468,103 @@ def get_match_countdown(match_id): return _generate_countdown(date, time) +def get_results_by_event(event_id): + + ## event id given as integer + + results = get_parsed_page("https://www.hltv.org/results?event=" + str(event_id)) + + results_list = [] + + pastresults = results.find_all("div", {"class": "results-holder"}) + + for result in pastresults: + resultDiv = result.find_all("div", {"class": "result-con"}) + + for res in resultDiv: + resultObj = {} + + resultObj['url'] = "https://hltv.org" + res.find("a", {"class": "a-reset"}).get("href") + + resultObj['match-id'] = converters.to_int(res.find("a", {"class": "a-reset"}).get("href").split("/")[-2]) + + if (res.parent.find("span", {"class": "standard-headline"})): + dateText = res.parent.find("span", {"class": "standard-headline"}).text.replace("Results for ", "").replace("th", "").replace("rd","").replace("st","").replace("nd","") + + dateArr = dateText.split() + + dateTextFromArrPadded = _padIfNeeded(dateArr[2]) + "-" + _padIfNeeded(_monthNameToNumber(dateArr[0])) + "-" + _padIfNeeded(dateArr[1]) + dateFromHLTV = datetime.datetime.strptime(dateTextFromArrPadded,'%Y-%m-%d').replace(tzinfo=HLTV_ZONEINFO) + dateFromHLTV = dateFromHLTV.astimezone(LOCAL_ZONEINFO) + + resultObj['date'] = dateFromHLTV.strftime('%Y-%m-%d') + else: + dt = datetime.date.today() + resultObj['date'] = str(dt.day) + '/' + str(dt.month) + '/' + str(dt.year) + + if (res.find("td", {"class": "placeholder-text-cell"})): + resultObj['event'] = res.find("td", {"class": "placeholder-text-cell"}).text + elif (res.find("td", {"class": "event"})): + resultObj['event'] = res.find("td", {"class": "event"}).text + else: + resultObj['event'] = None + + if (res.find_all("td", {"class": "team-cell"})): + resultObj['team1'] = res.find_all("td", {"class": "team-cell"})[0].text.lstrip().rstrip() + resultObj['team1score'] = converters.to_int(res.find("td", {"class": "result-score"}).find_all("span")[0].text.lstrip().rstrip()) + resultObj['team1-id'] = _findTeamId(res.find_all("td", {"class": "team-cell"})[0].text.lstrip().rstrip()) + resultObj['team2'] = res.find_all("td", {"class": "team-cell"})[1].text.lstrip().rstrip() + resultObj['team2-id'] = _findTeamId(res.find_all("td", {"class": "team-cell"})[1].text.lstrip().rstrip()) + resultObj['team2score'] = converters.to_int(res.find("td", {"class": "result-score"}).find_all("span")[1].text.lstrip().rstrip()) + else: + resultObj['team1'] = None + resultObj['team1-id'] = None + resultObj['team1score'] = None + resultObj['team2'] = None + resultObj['team2-id'] = None + resultObj['team2score'] = None + + results_list.append(resultObj) + + return results_list + +def get_event_team_rankings(event_id): + + url = 'https://www.hltv.org/events/'+ str(event_id) +'/page' + + results = get_parsed_page_matches(url) + ranking = [r.text.strip('#') for r in results.find_all('div', attrs={'class': 'event-world-rank'})] + teams = [r.text for r in results.find_all('div', attrs={'class': 'text'})] + + team_id_map = {} + for i, team in enumerate(teams): + if i< len(ranking): ## Sometimes teams do not have ranking (displayed last) + team_id_map[team] = ranking[i] + else: + team_id_map[team] = None + + return team_id_map + +def get_match_stats(match_id): + + match_stats = {} + + url = 'https://www.hltv.org/matches/' + str(match_id) + '/page' + + results = get_parsed_page_matches(url) + + match_stats['match-id'] = match_id + match_stats['match_type'] = results.find('div', attrs={'class': 'padding preformatted-text'}).text.strip().split('\n')[2] + + player_stats = results.find_all('tr', attrs={'class': ''}) + for i, player in enumerate(player_stats[0:10]): + + match_stats[f'player{i}_id'] = player.find('a', attrs = {'class': 'flagAlign no-maps-indicator-offset'}).get('href').split('/')[2] + match_stats[f'player{i}_rating'] = player.find('td', attrs = {'class': "rating text-center"}).text + return match_stats + + + if __name__ == "__main__": import pprint pp = pprint.PrettyPrinter() diff --git a/requirements.txt b/requirements.txt index b0d4aec..508dad1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,5 @@ beautifulsoup4==4.11.1 bs4==0.0.1 -lxml==4.9.1 python-utils==2.0.0 requests==2.31.0 six==1.10.0 diff --git a/test.ipynb b/test.ipynb new file mode 100644 index 0000000..5eff2be --- /dev/null +++ b/test.ipynb @@ -0,0 +1,1750 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import main as hltv\n", + "import pandas as pd\n", + "import requests\n", + "from bs4 import BeautifulSoup" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
urlmatch-iddateeventteam1team1scoreteam1-idteam2team2-idteam2score
0https://hltv.org/matches/2370931/mouz-vs-faze-...23709312024-04-13NoneMOUZ0NaNFaZeNaN2
1https://hltv.org/matches/2370930/astralis-vs-f...23709302024-04-12NoneAstralis1NaNFaZeNaN2
2https://hltv.org/matches/2370929/mouz-vs-g2-ie...23709292024-04-12NoneMOUZ2NaNG2NaN1
3https://hltv.org/matches/2370928/liquid-vs-faz...23709282024-04-11NoneLiquid1NaNFaZeNaN2
4https://hltv.org/matches/2370927/virtuspro-vs-...23709272024-04-11NoneVirtus.pro05378.0G25995.02
5https://hltv.org/matches/2370917/g2-vs-heroic-...23709172024-04-09NoneG225995.0HEROIC7175.00
6https://hltv.org/matches/2370926/faze-vs-flyqu...23709262024-04-09NoneFaZe26667.0FlyQuest12774.00
7https://hltv.org/matches/2370918/liquid-vs-mou...23709182024-04-09NoneLiquid05973.0MOUZ4494.02
8https://hltv.org/matches/2370925/virtuspro-vs-...23709252024-04-09NoneVirtus.pro05378.0Astralis6665.02
9https://hltv.org/matches/2370923/flyquest-vs-n...23709232024-04-09NoneFlyQuest212774.0Nemiga7969.00
10https://hltv.org/matches/2370924/cloud9-vs-faz...23709242024-04-09NoneCloud905752.0FaZe6667.02
11https://hltv.org/matches/2370915/heroic-vs-fur...23709152024-04-08NoneHEROIC27175.0FURIA8297.01
12https://hltv.org/matches/2370916/g2-vs-lynn-vi...23709162024-04-08NoneG225995.0Lynn Vision8840.00
13https://hltv.org/matches/2370919/astralis-vs-f...23709192024-04-08NoneAstralis26665.0FaZe6667.00
14https://hltv.org/matches/2370920/steel-helmet-...23709202024-04-08NoneSteel Helmet011273.0Nemiga7969.02
15https://hltv.org/matches/2370921/flyquest-vs-v...23709212024-04-08NoneFlyQuest112774.0Virtus.pro5378.02
16https://hltv.org/matches/2370922/cloud9-vs-wil...23709222024-04-08NoneCloud925752.0Wildcard12257.00
17https://hltv.org/matches/2370913/furia-vs-mouz...23709132024-04-07NoneFURIA18297.0MOUZ4494.02
18https://hltv.org/matches/2370914/lynn-vision-v...23709142024-04-07NoneLynn Vision28840.0TYLOO4863.00
19https://hltv.org/matches/2370911/g2-vs-liquid-...23709112024-04-07NoneG215995.0Liquid5973.02
20https://hltv.org/matches/2370912/9z-vs-heroic-...23709122024-04-07None9z09996.0HEROIC7175.02
21https://hltv.org/matches/2370909/faze-vs-nemig...23709092024-04-07NoneFaZe136667.0Nemiga7969.08
22https://hltv.org/matches/2370910/steel-helmet-...23709102024-04-07NoneSteel Helmet211273.0Astralis6665.013
23https://hltv.org/matches/2370908/wildcard-vs-v...23709082024-04-07NoneWildcard112257.0Virtus.pro5378.013
24https://hltv.org/matches/2370907/cloud9-vs-fly...23709072024-04-07NoneCloud965752.0FlyQuest12774.013
25https://hltv.org/matches/2370906/tyloo-vs-mouz...23709062024-04-07NoneTYLOO114863.0MOUZ4494.013
26https://hltv.org/matches/2370905/furia-vs-lynn...23709052024-04-07NoneFURIA138297.0Lynn Vision8840.09
27https://hltv.org/matches/2370903/g2-vs-9z-iem-...23709032024-04-07NoneG2135995.09z9996.010
28https://hltv.org/matches/2370904/liquid-vs-her...23709042024-04-07NoneLiquid135973.0HEROIC7175.08
\n", + "
" + ], + "text/plain": [ + " url match-id date \\\n", + "0 https://hltv.org/matches/2370931/mouz-vs-faze-... 2370931 2024-04-13 \n", + "1 https://hltv.org/matches/2370930/astralis-vs-f... 2370930 2024-04-12 \n", + "2 https://hltv.org/matches/2370929/mouz-vs-g2-ie... 2370929 2024-04-12 \n", + "3 https://hltv.org/matches/2370928/liquid-vs-faz... 2370928 2024-04-11 \n", + "4 https://hltv.org/matches/2370927/virtuspro-vs-... 2370927 2024-04-11 \n", + "5 https://hltv.org/matches/2370917/g2-vs-heroic-... 2370917 2024-04-09 \n", + "6 https://hltv.org/matches/2370926/faze-vs-flyqu... 2370926 2024-04-09 \n", + "7 https://hltv.org/matches/2370918/liquid-vs-mou... 2370918 2024-04-09 \n", + "8 https://hltv.org/matches/2370925/virtuspro-vs-... 2370925 2024-04-09 \n", + "9 https://hltv.org/matches/2370923/flyquest-vs-n... 2370923 2024-04-09 \n", + "10 https://hltv.org/matches/2370924/cloud9-vs-faz... 2370924 2024-04-09 \n", + "11 https://hltv.org/matches/2370915/heroic-vs-fur... 2370915 2024-04-08 \n", + "12 https://hltv.org/matches/2370916/g2-vs-lynn-vi... 2370916 2024-04-08 \n", + "13 https://hltv.org/matches/2370919/astralis-vs-f... 2370919 2024-04-08 \n", + "14 https://hltv.org/matches/2370920/steel-helmet-... 2370920 2024-04-08 \n", + "15 https://hltv.org/matches/2370921/flyquest-vs-v... 2370921 2024-04-08 \n", + "16 https://hltv.org/matches/2370922/cloud9-vs-wil... 2370922 2024-04-08 \n", + "17 https://hltv.org/matches/2370913/furia-vs-mouz... 2370913 2024-04-07 \n", + "18 https://hltv.org/matches/2370914/lynn-vision-v... 2370914 2024-04-07 \n", + "19 https://hltv.org/matches/2370911/g2-vs-liquid-... 2370911 2024-04-07 \n", + "20 https://hltv.org/matches/2370912/9z-vs-heroic-... 2370912 2024-04-07 \n", + "21 https://hltv.org/matches/2370909/faze-vs-nemig... 2370909 2024-04-07 \n", + "22 https://hltv.org/matches/2370910/steel-helmet-... 2370910 2024-04-07 \n", + "23 https://hltv.org/matches/2370908/wildcard-vs-v... 2370908 2024-04-07 \n", + "24 https://hltv.org/matches/2370907/cloud9-vs-fly... 2370907 2024-04-07 \n", + "25 https://hltv.org/matches/2370906/tyloo-vs-mouz... 2370906 2024-04-07 \n", + "26 https://hltv.org/matches/2370905/furia-vs-lynn... 2370905 2024-04-07 \n", + "27 https://hltv.org/matches/2370903/g2-vs-9z-iem-... 2370903 2024-04-07 \n", + "28 https://hltv.org/matches/2370904/liquid-vs-her... 2370904 2024-04-07 \n", + "\n", + " event team1 team1score team1-id team2 team2-id \\\n", + "0 None MOUZ 0 NaN FaZe NaN \n", + "1 None Astralis 1 NaN FaZe NaN \n", + "2 None MOUZ 2 NaN G2 NaN \n", + "3 None Liquid 1 NaN FaZe NaN \n", + "4 None Virtus.pro 0 5378.0 G2 5995.0 \n", + "5 None G2 2 5995.0 HEROIC 7175.0 \n", + "6 None FaZe 2 6667.0 FlyQuest 12774.0 \n", + "7 None Liquid 0 5973.0 MOUZ 4494.0 \n", + "8 None Virtus.pro 0 5378.0 Astralis 6665.0 \n", + "9 None FlyQuest 2 12774.0 Nemiga 7969.0 \n", + "10 None Cloud9 0 5752.0 FaZe 6667.0 \n", + "11 None HEROIC 2 7175.0 FURIA 8297.0 \n", + "12 None G2 2 5995.0 Lynn Vision 8840.0 \n", + "13 None Astralis 2 6665.0 FaZe 6667.0 \n", + "14 None Steel Helmet 0 11273.0 Nemiga 7969.0 \n", + "15 None FlyQuest 1 12774.0 Virtus.pro 5378.0 \n", + "16 None Cloud9 2 5752.0 Wildcard 12257.0 \n", + "17 None FURIA 1 8297.0 MOUZ 4494.0 \n", + "18 None Lynn Vision 2 8840.0 TYLOO 4863.0 \n", + "19 None G2 1 5995.0 Liquid 5973.0 \n", + "20 None 9z 0 9996.0 HEROIC 7175.0 \n", + "21 None FaZe 13 6667.0 Nemiga 7969.0 \n", + "22 None Steel Helmet 2 11273.0 Astralis 6665.0 \n", + "23 None Wildcard 1 12257.0 Virtus.pro 5378.0 \n", + "24 None Cloud9 6 5752.0 FlyQuest 12774.0 \n", + "25 None TYLOO 11 4863.0 MOUZ 4494.0 \n", + "26 None FURIA 13 8297.0 Lynn Vision 8840.0 \n", + "27 None G2 13 5995.0 9z 9996.0 \n", + "28 None Liquid 13 5973.0 HEROIC 7175.0 \n", + "\n", + " team2score \n", + "0 2 \n", + "1 2 \n", + "2 1 \n", + "3 2 \n", + "4 2 \n", + "5 0 \n", + "6 0 \n", + "7 2 \n", + "8 2 \n", + "9 0 \n", + "10 2 \n", + "11 1 \n", + "12 0 \n", + "13 0 \n", + "14 2 \n", + "15 2 \n", + "16 0 \n", + "17 2 \n", + "18 0 \n", + "19 2 \n", + "20 2 \n", + "21 8 \n", + "22 13 \n", + "23 13 \n", + "24 13 \n", + "25 13 \n", + "26 9 \n", + "27 10 \n", + "28 8 " + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "event_id = 7437\n", + "data = hltv.get_results_by_event(event_id)\n", + "\n", + "df = pd.DataFrame(data)\n", + "\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "match_ids = df['match-id']\n", + "match_stats = []\n", + "for match_id in match_ids:\n", + " match_stats.append(hltv.get_match_stats(match_id))" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "df2 = pd.DataFrame(match_stats)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
match-idmatch_typeplayer0_idplayer0_ratingplayer1_idplayer1_ratingplayer2_idplayer2_ratingplayer3_idplayer3_rating...player5_idplayer5_ratingplayer6_idplayer6_ratingplayer7_idplayer7_ratingplayer8_idplayer8_ratingplayer9_idplayer9_rating
02370931* Grand final188501.08180721.02136660.90203120.82...180721.47188501.29203121.00168200.75136660.47
12370930* Semi-final167171.04109941.02179561.00203040.95...109941.16179561.1475921.13167171.10203041.04
22370929* Semi-final203121.28188501.22180721.13136661.00...203121.30188501.12180721.06136660.97168200.54
32370928* Quarter-final79641.1585201.07139150.99103940.97...79641.07186760.9985200.89139150.77103940.67
42370927* Quarter-final201011.22127321.05166120.89137760.78...201011.50127321.14137760.7487890.70166120.62
52370917* Group A lower bracket final. Winner advances...192301.4737411.3696181.2239721.05...37411.38192301.3696181.2939721.18100960.99
62370926* Group B lower bracket final. Winner advances...99601.7381831.32180531.18118161.13...99601.604291.23118161.18180531.1781831.02
72370918* Group A upper bracket final. Winner advances...85201.12186761.03103941.01139150.80...85201.35103941.26186760.97139150.7579640.66
82370925* Group B upper bracket final. Winner advances...127321.19137760.84166120.7987890.67...127321.32137760.76166120.7487890.56201010.51
92370923* Group B lower bracket semi-final111401.4391151.27173841.10111390.90...111401.26173841.14111390.9991150.96105880.70
102370924* Group B lower bracket semi-final165551.00118400.92169470.9285280.91...165551.40118401.0685280.93169470.9089180.83
112370915* Group A lower bracket semi-final94361.17196771.12120181.05136021.03...94361.39196771.29136021.05141481.00120180.97
122370916* Group A lower bracket semi-final192301.5537411.4939721.4096181.11...192301.8337411.5596181.2939721.09100960.88
132370919* Group B upper bracket semi-final. Winner adv...109941.5275921.42203041.35179561.12...109941.66179561.66203041.5575921.52167171.05
142370920* Group B lower bracket round115740.8251870.8070260.72129580.62...51871.04115740.76129580.7570260.52145610.40
152370921* Group B upper bracket semi-final. Winner adv...173841.13111400.97105880.92111390.83...173841.10111401.05105881.00111390.9291150.77
162370922* Group B lower bracket round 185281.74169471.4489181.44118401.38...85281.91118401.79169471.6389181.40165551.26
172370913* Group A upper bracket semi-final. Winner adv...20231.16105661.11125211.03125530.93...125531.37125211.3220231.31105661.26156311.13
182370914* Group A lower bracket round 1207021.55229221.32202541.23165511.11...207021.65229221.22165511.22202541.04187441.02
192370911* Group A upper bracket semi-final. Winner adv...192301.30100960.8937410.8896180.85...192301.2939721.0796181.04100961.0337410.95
202370912* Group A lower bracket round 1212391.16147361.02226130.91206070.83...212391.54206071.00226130.97147360.86120920.60
212370909* Group B upper bracket quarter-final180531.54118161.5481831.2999601.22...180531.3881831.24118161.1799601.014290.64
222370910* Group B upper bracket quarter-final51870.87129580.75145610.6470260.32...51872.35129580.75145610.4670260.08115740.01
232370908* Group B upper bracket quarter-final85070.5687110.51191280.46113320.36...191280.39132300.3287110.2085070.01113320.00
242370907* Group B upper bracket quarter-final89181.0785280.91169470.77165550.73...89180.6885280.65118400.28165550.20169470.09
252370906* Group A upper bracket quarter-final208951.29196451.2689500.92240360.74...196451.45208951.3489500.95240360.9586000.62
262370905* Group A upper bracket quarter-final156311.40125211.25125531.0820231.05...156311.5420231.42125531.28105660.95125210.87
272370903* Group A upper bracket quarter-final37411.6396181.5039721.01192300.93...37411.6396181.63192301.16100960.6739720.57
282370904* Group A upper bracket quarter-final103941.6079641.39186761.2185201.17...103942.2479641.81186761.6585201.06139150.62
\n", + "

29 rows × 22 columns

\n", + "
" + ], + "text/plain": [ + " match-id match_type player0_id \\\n", + "0 2370931 * Grand final 18850 \n", + "1 2370930 * Semi-final 16717 \n", + "2 2370929 * Semi-final 20312 \n", + "3 2370928 * Quarter-final 7964 \n", + "4 2370927 * Quarter-final 20101 \n", + "5 2370917 * Group A lower bracket final. Winner advances... 19230 \n", + "6 2370926 * Group B lower bracket final. Winner advances... 9960 \n", + "7 2370918 * Group A upper bracket final. Winner advances... 8520 \n", + "8 2370925 * Group B upper bracket final. Winner advances... 12732 \n", + "9 2370923 * Group B lower bracket semi-final 11140 \n", + "10 2370924 * Group B lower bracket semi-final 16555 \n", + "11 2370915 * Group A lower bracket semi-final 9436 \n", + "12 2370916 * Group A lower bracket semi-final 19230 \n", + "13 2370919 * Group B upper bracket semi-final. Winner adv... 10994 \n", + "14 2370920 * Group B lower bracket round 11574 \n", + "15 2370921 * Group B upper bracket semi-final. Winner adv... 17384 \n", + "16 2370922 * Group B lower bracket round 1 8528 \n", + "17 2370913 * Group A upper bracket semi-final. Winner adv... 2023 \n", + "18 2370914 * Group A lower bracket round 1 20702 \n", + "19 2370911 * Group A upper bracket semi-final. Winner adv... 19230 \n", + "20 2370912 * Group A lower bracket round 1 21239 \n", + "21 2370909 * Group B upper bracket quarter-final 18053 \n", + "22 2370910 * Group B upper bracket quarter-final 5187 \n", + "23 2370908 * Group B upper bracket quarter-final 8507 \n", + "24 2370907 * Group B upper bracket quarter-final 8918 \n", + "25 2370906 * Group A upper bracket quarter-final 20895 \n", + "26 2370905 * Group A upper bracket quarter-final 15631 \n", + "27 2370903 * Group A upper bracket quarter-final 3741 \n", + "28 2370904 * Group A upper bracket quarter-final 10394 \n", + "\n", + " player0_rating player1_id player1_rating player2_id player2_rating \\\n", + "0 1.08 18072 1.02 13666 0.90 \n", + "1 1.04 10994 1.02 17956 1.00 \n", + "2 1.28 18850 1.22 18072 1.13 \n", + "3 1.15 8520 1.07 13915 0.99 \n", + "4 1.22 12732 1.05 16612 0.89 \n", + "5 1.47 3741 1.36 9618 1.22 \n", + "6 1.73 8183 1.32 18053 1.18 \n", + "7 1.12 18676 1.03 10394 1.01 \n", + "8 1.19 13776 0.84 16612 0.79 \n", + "9 1.43 9115 1.27 17384 1.10 \n", + "10 1.00 11840 0.92 16947 0.92 \n", + "11 1.17 19677 1.12 12018 1.05 \n", + "12 1.55 3741 1.49 3972 1.40 \n", + "13 1.52 7592 1.42 20304 1.35 \n", + "14 0.82 5187 0.80 7026 0.72 \n", + "15 1.13 11140 0.97 10588 0.92 \n", + "16 1.74 16947 1.44 8918 1.44 \n", + "17 1.16 10566 1.11 12521 1.03 \n", + "18 1.55 22922 1.32 20254 1.23 \n", + "19 1.30 10096 0.89 3741 0.88 \n", + "20 1.16 14736 1.02 22613 0.91 \n", + "21 1.54 11816 1.54 8183 1.29 \n", + "22 0.87 12958 0.75 14561 0.64 \n", + "23 0.56 8711 0.51 19128 0.46 \n", + "24 1.07 8528 0.91 16947 0.77 \n", + "25 1.29 19645 1.26 8950 0.92 \n", + "26 1.40 12521 1.25 12553 1.08 \n", + "27 1.63 9618 1.50 3972 1.01 \n", + "28 1.60 7964 1.39 18676 1.21 \n", + "\n", + " player3_id player3_rating ... player5_id player5_rating player6_id \\\n", + "0 20312 0.82 ... 18072 1.47 18850 \n", + "1 20304 0.95 ... 10994 1.16 17956 \n", + "2 13666 1.00 ... 20312 1.30 18850 \n", + "3 10394 0.97 ... 7964 1.07 18676 \n", + "4 13776 0.78 ... 20101 1.50 12732 \n", + "5 3972 1.05 ... 3741 1.38 19230 \n", + "6 11816 1.13 ... 9960 1.60 429 \n", + "7 13915 0.80 ... 8520 1.35 10394 \n", + "8 8789 0.67 ... 12732 1.32 13776 \n", + "9 11139 0.90 ... 11140 1.26 17384 \n", + "10 8528 0.91 ... 16555 1.40 11840 \n", + "11 13602 1.03 ... 9436 1.39 19677 \n", + "12 9618 1.11 ... 19230 1.83 3741 \n", + "13 17956 1.12 ... 10994 1.66 17956 \n", + "14 12958 0.62 ... 5187 1.04 11574 \n", + "15 11139 0.83 ... 17384 1.10 11140 \n", + "16 11840 1.38 ... 8528 1.91 11840 \n", + "17 12553 0.93 ... 12553 1.37 12521 \n", + "18 16551 1.11 ... 20702 1.65 22922 \n", + "19 9618 0.85 ... 19230 1.29 3972 \n", + "20 20607 0.83 ... 21239 1.54 20607 \n", + "21 9960 1.22 ... 18053 1.38 8183 \n", + "22 7026 0.32 ... 5187 2.35 12958 \n", + "23 11332 0.36 ... 19128 0.39 13230 \n", + "24 16555 0.73 ... 8918 0.68 8528 \n", + "25 24036 0.74 ... 19645 1.45 20895 \n", + "26 2023 1.05 ... 15631 1.54 2023 \n", + "27 19230 0.93 ... 3741 1.63 9618 \n", + "28 8520 1.17 ... 10394 2.24 7964 \n", + "\n", + " player6_rating player7_id player7_rating player8_id player8_rating \\\n", + "0 1.29 20312 1.00 16820 0.75 \n", + "1 1.14 7592 1.13 16717 1.10 \n", + "2 1.12 18072 1.06 13666 0.97 \n", + "3 0.99 8520 0.89 13915 0.77 \n", + "4 1.14 13776 0.74 8789 0.70 \n", + "5 1.36 9618 1.29 3972 1.18 \n", + "6 1.23 11816 1.18 18053 1.17 \n", + "7 1.26 18676 0.97 13915 0.75 \n", + "8 0.76 16612 0.74 8789 0.56 \n", + "9 1.14 11139 0.99 9115 0.96 \n", + "10 1.06 8528 0.93 16947 0.90 \n", + "11 1.29 13602 1.05 14148 1.00 \n", + "12 1.55 9618 1.29 3972 1.09 \n", + "13 1.66 20304 1.55 7592 1.52 \n", + "14 0.76 12958 0.75 7026 0.52 \n", + "15 1.05 10588 1.00 11139 0.92 \n", + "16 1.79 16947 1.63 8918 1.40 \n", + "17 1.32 2023 1.31 10566 1.26 \n", + "18 1.22 16551 1.22 20254 1.04 \n", + "19 1.07 9618 1.04 10096 1.03 \n", + "20 1.00 22613 0.97 14736 0.86 \n", + "21 1.24 11816 1.17 9960 1.01 \n", + "22 0.75 14561 0.46 7026 0.08 \n", + "23 0.32 8711 0.20 8507 0.01 \n", + "24 0.65 11840 0.28 16555 0.20 \n", + "25 1.34 8950 0.95 24036 0.95 \n", + "26 1.42 12553 1.28 10566 0.95 \n", + "27 1.63 19230 1.16 10096 0.67 \n", + "28 1.81 18676 1.65 8520 1.06 \n", + "\n", + " player9_id player9_rating \n", + "0 13666 0.47 \n", + "1 20304 1.04 \n", + "2 16820 0.54 \n", + "3 10394 0.67 \n", + "4 16612 0.62 \n", + "5 10096 0.99 \n", + "6 8183 1.02 \n", + "7 7964 0.66 \n", + "8 20101 0.51 \n", + "9 10588 0.70 \n", + "10 8918 0.83 \n", + "11 12018 0.97 \n", + "12 10096 0.88 \n", + "13 16717 1.05 \n", + "14 14561 0.40 \n", + "15 9115 0.77 \n", + "16 16555 1.26 \n", + "17 15631 1.13 \n", + "18 18744 1.02 \n", + "19 3741 0.95 \n", + "20 12092 0.60 \n", + "21 429 0.64 \n", + "22 11574 0.01 \n", + "23 11332 0.00 \n", + "24 16947 0.09 \n", + "25 8600 0.62 \n", + "26 12521 0.87 \n", + "27 3972 0.57 \n", + "28 13915 0.62 \n", + "\n", + "[29 rows x 22 columns]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df2" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'FaZe': '1', 'G2': '5', 'MOUZ': '6', 'Cloud9': '7', 'Virtus.pro': '9', 'HEROIC': '11', 'FURIA': '15', 'Astralis': '25', 'Lynn Vision': '34', 'Liquid': '37', 'FlyQuest': '41', 'Nemiga': '46', 'Wildcard': '49', '9z': '52', 'TYLOO': '132', 'Steel Helmet': None}\n" + ] + } + ], + "source": [ + "event_team_rankings = hltv.get_event_team_rankings(event_id)\n", + "\n", + "print(event_team_rankings)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.merge(df, df2, on='match-id', how = 'inner')" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
urlmatch-iddateeventteam1team1scoreteam1-idteam2team2-idteam2score...player5_idplayer5_ratingplayer6_idplayer6_ratingplayer7_idplayer7_ratingplayer8_idplayer8_ratingplayer9_idplayer9_rating
0https://hltv.org/matches/2370931/mouz-vs-faze-...23709312024-04-13NoneMOUZ0NaNFaZeNaN2...180721.47188501.29203121.00168200.75136660.47
1https://hltv.org/matches/2370930/astralis-vs-f...23709302024-04-12NoneAstralis1NaNFaZeNaN2...109941.16179561.1475921.13167171.10203041.04
2https://hltv.org/matches/2370929/mouz-vs-g2-ie...23709292024-04-12NoneMOUZ2NaNG2NaN1...203121.30188501.12180721.06136660.97168200.54
3https://hltv.org/matches/2370928/liquid-vs-faz...23709282024-04-11NoneLiquid1NaNFaZeNaN2...79641.07186760.9985200.89139150.77103940.67
4https://hltv.org/matches/2370927/virtuspro-vs-...23709272024-04-11NoneVirtus.pro05378.0G25995.02...201011.50127321.14137760.7487890.70166120.62
\n", + "

5 rows × 31 columns

\n", + "
" + ], + "text/plain": [ + " url match-id date \\\n", + "0 https://hltv.org/matches/2370931/mouz-vs-faze-... 2370931 2024-04-13 \n", + "1 https://hltv.org/matches/2370930/astralis-vs-f... 2370930 2024-04-12 \n", + "2 https://hltv.org/matches/2370929/mouz-vs-g2-ie... 2370929 2024-04-12 \n", + "3 https://hltv.org/matches/2370928/liquid-vs-faz... 2370928 2024-04-11 \n", + "4 https://hltv.org/matches/2370927/virtuspro-vs-... 2370927 2024-04-11 \n", + "\n", + " event team1 team1score team1-id team2 team2-id team2score ... \\\n", + "0 None MOUZ 0 NaN FaZe NaN 2 ... \n", + "1 None Astralis 1 NaN FaZe NaN 2 ... \n", + "2 None MOUZ 2 NaN G2 NaN 1 ... \n", + "3 None Liquid 1 NaN FaZe NaN 2 ... \n", + "4 None Virtus.pro 0 5378.0 G2 5995.0 2 ... \n", + "\n", + " player5_id player5_rating player6_id player6_rating player7_id \\\n", + "0 18072 1.47 18850 1.29 20312 \n", + "1 10994 1.16 17956 1.14 7592 \n", + "2 20312 1.30 18850 1.12 18072 \n", + "3 7964 1.07 18676 0.99 8520 \n", + "4 20101 1.50 12732 1.14 13776 \n", + "\n", + " player7_rating player8_id player8_rating player9_id player9_rating \n", + "0 1.00 16820 0.75 13666 0.47 \n", + "1 1.13 16717 1.10 20304 1.04 \n", + "2 1.06 13666 0.97 16820 0.54 \n", + "3 0.89 13915 0.77 10394 0.67 \n", + "4 0.74 8789 0.70 16612 0.62 \n", + "\n", + "[5 rows x 31 columns]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.head()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "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.11.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 3242687d98a1cd4358a2f47658e9b0132f43c42c Mon Sep 17 00:00:00 2001 From: JoeM PC Date: Tue, 23 Apr 2024 15:23:48 +0100 Subject: [PATCH 2/8] update --- main.py | 1 - test.ipynb | 1750 ---------------------------------------------------- 2 files changed, 1751 deletions(-) delete mode 100644 test.ipynb diff --git a/main.py b/main.py index 1ba20c2..9defd1e 100644 --- a/main.py +++ b/main.py @@ -6,7 +6,6 @@ from python_utils import converters import time import zoneinfo import tzlocal -import random HLTV_COOKIE_TIMEZONE = "Europe/Copenhagen" HLTV_ZONEINFO=zoneinfo.ZoneInfo(HLTV_COOKIE_TIMEZONE) diff --git a/test.ipynb b/test.ipynb deleted file mode 100644 index 5eff2be..0000000 --- a/test.ipynb +++ /dev/null @@ -1,1750 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import main as hltv\n", - "import pandas as pd\n", - "import requests\n", - "from bs4 import BeautifulSoup" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
urlmatch-iddateeventteam1team1scoreteam1-idteam2team2-idteam2score
0https://hltv.org/matches/2370931/mouz-vs-faze-...23709312024-04-13NoneMOUZ0NaNFaZeNaN2
1https://hltv.org/matches/2370930/astralis-vs-f...23709302024-04-12NoneAstralis1NaNFaZeNaN2
2https://hltv.org/matches/2370929/mouz-vs-g2-ie...23709292024-04-12NoneMOUZ2NaNG2NaN1
3https://hltv.org/matches/2370928/liquid-vs-faz...23709282024-04-11NoneLiquid1NaNFaZeNaN2
4https://hltv.org/matches/2370927/virtuspro-vs-...23709272024-04-11NoneVirtus.pro05378.0G25995.02
5https://hltv.org/matches/2370917/g2-vs-heroic-...23709172024-04-09NoneG225995.0HEROIC7175.00
6https://hltv.org/matches/2370926/faze-vs-flyqu...23709262024-04-09NoneFaZe26667.0FlyQuest12774.00
7https://hltv.org/matches/2370918/liquid-vs-mou...23709182024-04-09NoneLiquid05973.0MOUZ4494.02
8https://hltv.org/matches/2370925/virtuspro-vs-...23709252024-04-09NoneVirtus.pro05378.0Astralis6665.02
9https://hltv.org/matches/2370923/flyquest-vs-n...23709232024-04-09NoneFlyQuest212774.0Nemiga7969.00
10https://hltv.org/matches/2370924/cloud9-vs-faz...23709242024-04-09NoneCloud905752.0FaZe6667.02
11https://hltv.org/matches/2370915/heroic-vs-fur...23709152024-04-08NoneHEROIC27175.0FURIA8297.01
12https://hltv.org/matches/2370916/g2-vs-lynn-vi...23709162024-04-08NoneG225995.0Lynn Vision8840.00
13https://hltv.org/matches/2370919/astralis-vs-f...23709192024-04-08NoneAstralis26665.0FaZe6667.00
14https://hltv.org/matches/2370920/steel-helmet-...23709202024-04-08NoneSteel Helmet011273.0Nemiga7969.02
15https://hltv.org/matches/2370921/flyquest-vs-v...23709212024-04-08NoneFlyQuest112774.0Virtus.pro5378.02
16https://hltv.org/matches/2370922/cloud9-vs-wil...23709222024-04-08NoneCloud925752.0Wildcard12257.00
17https://hltv.org/matches/2370913/furia-vs-mouz...23709132024-04-07NoneFURIA18297.0MOUZ4494.02
18https://hltv.org/matches/2370914/lynn-vision-v...23709142024-04-07NoneLynn Vision28840.0TYLOO4863.00
19https://hltv.org/matches/2370911/g2-vs-liquid-...23709112024-04-07NoneG215995.0Liquid5973.02
20https://hltv.org/matches/2370912/9z-vs-heroic-...23709122024-04-07None9z09996.0HEROIC7175.02
21https://hltv.org/matches/2370909/faze-vs-nemig...23709092024-04-07NoneFaZe136667.0Nemiga7969.08
22https://hltv.org/matches/2370910/steel-helmet-...23709102024-04-07NoneSteel Helmet211273.0Astralis6665.013
23https://hltv.org/matches/2370908/wildcard-vs-v...23709082024-04-07NoneWildcard112257.0Virtus.pro5378.013
24https://hltv.org/matches/2370907/cloud9-vs-fly...23709072024-04-07NoneCloud965752.0FlyQuest12774.013
25https://hltv.org/matches/2370906/tyloo-vs-mouz...23709062024-04-07NoneTYLOO114863.0MOUZ4494.013
26https://hltv.org/matches/2370905/furia-vs-lynn...23709052024-04-07NoneFURIA138297.0Lynn Vision8840.09
27https://hltv.org/matches/2370903/g2-vs-9z-iem-...23709032024-04-07NoneG2135995.09z9996.010
28https://hltv.org/matches/2370904/liquid-vs-her...23709042024-04-07NoneLiquid135973.0HEROIC7175.08
\n", - "
" - ], - "text/plain": [ - " url match-id date \\\n", - "0 https://hltv.org/matches/2370931/mouz-vs-faze-... 2370931 2024-04-13 \n", - "1 https://hltv.org/matches/2370930/astralis-vs-f... 2370930 2024-04-12 \n", - "2 https://hltv.org/matches/2370929/mouz-vs-g2-ie... 2370929 2024-04-12 \n", - "3 https://hltv.org/matches/2370928/liquid-vs-faz... 2370928 2024-04-11 \n", - "4 https://hltv.org/matches/2370927/virtuspro-vs-... 2370927 2024-04-11 \n", - "5 https://hltv.org/matches/2370917/g2-vs-heroic-... 2370917 2024-04-09 \n", - "6 https://hltv.org/matches/2370926/faze-vs-flyqu... 2370926 2024-04-09 \n", - "7 https://hltv.org/matches/2370918/liquid-vs-mou... 2370918 2024-04-09 \n", - "8 https://hltv.org/matches/2370925/virtuspro-vs-... 2370925 2024-04-09 \n", - "9 https://hltv.org/matches/2370923/flyquest-vs-n... 2370923 2024-04-09 \n", - "10 https://hltv.org/matches/2370924/cloud9-vs-faz... 2370924 2024-04-09 \n", - "11 https://hltv.org/matches/2370915/heroic-vs-fur... 2370915 2024-04-08 \n", - "12 https://hltv.org/matches/2370916/g2-vs-lynn-vi... 2370916 2024-04-08 \n", - "13 https://hltv.org/matches/2370919/astralis-vs-f... 2370919 2024-04-08 \n", - "14 https://hltv.org/matches/2370920/steel-helmet-... 2370920 2024-04-08 \n", - "15 https://hltv.org/matches/2370921/flyquest-vs-v... 2370921 2024-04-08 \n", - "16 https://hltv.org/matches/2370922/cloud9-vs-wil... 2370922 2024-04-08 \n", - "17 https://hltv.org/matches/2370913/furia-vs-mouz... 2370913 2024-04-07 \n", - "18 https://hltv.org/matches/2370914/lynn-vision-v... 2370914 2024-04-07 \n", - "19 https://hltv.org/matches/2370911/g2-vs-liquid-... 2370911 2024-04-07 \n", - "20 https://hltv.org/matches/2370912/9z-vs-heroic-... 2370912 2024-04-07 \n", - "21 https://hltv.org/matches/2370909/faze-vs-nemig... 2370909 2024-04-07 \n", - "22 https://hltv.org/matches/2370910/steel-helmet-... 2370910 2024-04-07 \n", - "23 https://hltv.org/matches/2370908/wildcard-vs-v... 2370908 2024-04-07 \n", - "24 https://hltv.org/matches/2370907/cloud9-vs-fly... 2370907 2024-04-07 \n", - "25 https://hltv.org/matches/2370906/tyloo-vs-mouz... 2370906 2024-04-07 \n", - "26 https://hltv.org/matches/2370905/furia-vs-lynn... 2370905 2024-04-07 \n", - "27 https://hltv.org/matches/2370903/g2-vs-9z-iem-... 2370903 2024-04-07 \n", - "28 https://hltv.org/matches/2370904/liquid-vs-her... 2370904 2024-04-07 \n", - "\n", - " event team1 team1score team1-id team2 team2-id \\\n", - "0 None MOUZ 0 NaN FaZe NaN \n", - "1 None Astralis 1 NaN FaZe NaN \n", - "2 None MOUZ 2 NaN G2 NaN \n", - "3 None Liquid 1 NaN FaZe NaN \n", - "4 None Virtus.pro 0 5378.0 G2 5995.0 \n", - "5 None G2 2 5995.0 HEROIC 7175.0 \n", - "6 None FaZe 2 6667.0 FlyQuest 12774.0 \n", - "7 None Liquid 0 5973.0 MOUZ 4494.0 \n", - "8 None Virtus.pro 0 5378.0 Astralis 6665.0 \n", - "9 None FlyQuest 2 12774.0 Nemiga 7969.0 \n", - "10 None Cloud9 0 5752.0 FaZe 6667.0 \n", - "11 None HEROIC 2 7175.0 FURIA 8297.0 \n", - "12 None G2 2 5995.0 Lynn Vision 8840.0 \n", - "13 None Astralis 2 6665.0 FaZe 6667.0 \n", - "14 None Steel Helmet 0 11273.0 Nemiga 7969.0 \n", - "15 None FlyQuest 1 12774.0 Virtus.pro 5378.0 \n", - "16 None Cloud9 2 5752.0 Wildcard 12257.0 \n", - "17 None FURIA 1 8297.0 MOUZ 4494.0 \n", - "18 None Lynn Vision 2 8840.0 TYLOO 4863.0 \n", - "19 None G2 1 5995.0 Liquid 5973.0 \n", - "20 None 9z 0 9996.0 HEROIC 7175.0 \n", - "21 None FaZe 13 6667.0 Nemiga 7969.0 \n", - "22 None Steel Helmet 2 11273.0 Astralis 6665.0 \n", - "23 None Wildcard 1 12257.0 Virtus.pro 5378.0 \n", - "24 None Cloud9 6 5752.0 FlyQuest 12774.0 \n", - "25 None TYLOO 11 4863.0 MOUZ 4494.0 \n", - "26 None FURIA 13 8297.0 Lynn Vision 8840.0 \n", - "27 None G2 13 5995.0 9z 9996.0 \n", - "28 None Liquid 13 5973.0 HEROIC 7175.0 \n", - "\n", - " team2score \n", - "0 2 \n", - "1 2 \n", - "2 1 \n", - "3 2 \n", - "4 2 \n", - "5 0 \n", - "6 0 \n", - "7 2 \n", - "8 2 \n", - "9 0 \n", - "10 2 \n", - "11 1 \n", - "12 0 \n", - "13 0 \n", - "14 2 \n", - "15 2 \n", - "16 0 \n", - "17 2 \n", - "18 0 \n", - "19 2 \n", - "20 2 \n", - "21 8 \n", - "22 13 \n", - "23 13 \n", - "24 13 \n", - "25 13 \n", - "26 9 \n", - "27 10 \n", - "28 8 " - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "event_id = 7437\n", - "data = hltv.get_results_by_event(event_id)\n", - "\n", - "df = pd.DataFrame(data)\n", - "\n", - "df" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "match_ids = df['match-id']\n", - "match_stats = []\n", - "for match_id in match_ids:\n", - " match_stats.append(hltv.get_match_stats(match_id))" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "df2 = pd.DataFrame(match_stats)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
match-idmatch_typeplayer0_idplayer0_ratingplayer1_idplayer1_ratingplayer2_idplayer2_ratingplayer3_idplayer3_rating...player5_idplayer5_ratingplayer6_idplayer6_ratingplayer7_idplayer7_ratingplayer8_idplayer8_ratingplayer9_idplayer9_rating
02370931* Grand final188501.08180721.02136660.90203120.82...180721.47188501.29203121.00168200.75136660.47
12370930* Semi-final167171.04109941.02179561.00203040.95...109941.16179561.1475921.13167171.10203041.04
22370929* Semi-final203121.28188501.22180721.13136661.00...203121.30188501.12180721.06136660.97168200.54
32370928* Quarter-final79641.1585201.07139150.99103940.97...79641.07186760.9985200.89139150.77103940.67
42370927* Quarter-final201011.22127321.05166120.89137760.78...201011.50127321.14137760.7487890.70166120.62
52370917* Group A lower bracket final. Winner advances...192301.4737411.3696181.2239721.05...37411.38192301.3696181.2939721.18100960.99
62370926* Group B lower bracket final. Winner advances...99601.7381831.32180531.18118161.13...99601.604291.23118161.18180531.1781831.02
72370918* Group A upper bracket final. Winner advances...85201.12186761.03103941.01139150.80...85201.35103941.26186760.97139150.7579640.66
82370925* Group B upper bracket final. Winner advances...127321.19137760.84166120.7987890.67...127321.32137760.76166120.7487890.56201010.51
92370923* Group B lower bracket semi-final111401.4391151.27173841.10111390.90...111401.26173841.14111390.9991150.96105880.70
102370924* Group B lower bracket semi-final165551.00118400.92169470.9285280.91...165551.40118401.0685280.93169470.9089180.83
112370915* Group A lower bracket semi-final94361.17196771.12120181.05136021.03...94361.39196771.29136021.05141481.00120180.97
122370916* Group A lower bracket semi-final192301.5537411.4939721.4096181.11...192301.8337411.5596181.2939721.09100960.88
132370919* Group B upper bracket semi-final. Winner adv...109941.5275921.42203041.35179561.12...109941.66179561.66203041.5575921.52167171.05
142370920* Group B lower bracket round115740.8251870.8070260.72129580.62...51871.04115740.76129580.7570260.52145610.40
152370921* Group B upper bracket semi-final. Winner adv...173841.13111400.97105880.92111390.83...173841.10111401.05105881.00111390.9291150.77
162370922* Group B lower bracket round 185281.74169471.4489181.44118401.38...85281.91118401.79169471.6389181.40165551.26
172370913* Group A upper bracket semi-final. Winner adv...20231.16105661.11125211.03125530.93...125531.37125211.3220231.31105661.26156311.13
182370914* Group A lower bracket round 1207021.55229221.32202541.23165511.11...207021.65229221.22165511.22202541.04187441.02
192370911* Group A upper bracket semi-final. Winner adv...192301.30100960.8937410.8896180.85...192301.2939721.0796181.04100961.0337410.95
202370912* Group A lower bracket round 1212391.16147361.02226130.91206070.83...212391.54206071.00226130.97147360.86120920.60
212370909* Group B upper bracket quarter-final180531.54118161.5481831.2999601.22...180531.3881831.24118161.1799601.014290.64
222370910* Group B upper bracket quarter-final51870.87129580.75145610.6470260.32...51872.35129580.75145610.4670260.08115740.01
232370908* Group B upper bracket quarter-final85070.5687110.51191280.46113320.36...191280.39132300.3287110.2085070.01113320.00
242370907* Group B upper bracket quarter-final89181.0785280.91169470.77165550.73...89180.6885280.65118400.28165550.20169470.09
252370906* Group A upper bracket quarter-final208951.29196451.2689500.92240360.74...196451.45208951.3489500.95240360.9586000.62
262370905* Group A upper bracket quarter-final156311.40125211.25125531.0820231.05...156311.5420231.42125531.28105660.95125210.87
272370903* Group A upper bracket quarter-final37411.6396181.5039721.01192300.93...37411.6396181.63192301.16100960.6739720.57
282370904* Group A upper bracket quarter-final103941.6079641.39186761.2185201.17...103942.2479641.81186761.6585201.06139150.62
\n", - "

29 rows × 22 columns

\n", - "
" - ], - "text/plain": [ - " match-id match_type player0_id \\\n", - "0 2370931 * Grand final 18850 \n", - "1 2370930 * Semi-final 16717 \n", - "2 2370929 * Semi-final 20312 \n", - "3 2370928 * Quarter-final 7964 \n", - "4 2370927 * Quarter-final 20101 \n", - "5 2370917 * Group A lower bracket final. Winner advances... 19230 \n", - "6 2370926 * Group B lower bracket final. Winner advances... 9960 \n", - "7 2370918 * Group A upper bracket final. Winner advances... 8520 \n", - "8 2370925 * Group B upper bracket final. Winner advances... 12732 \n", - "9 2370923 * Group B lower bracket semi-final 11140 \n", - "10 2370924 * Group B lower bracket semi-final 16555 \n", - "11 2370915 * Group A lower bracket semi-final 9436 \n", - "12 2370916 * Group A lower bracket semi-final 19230 \n", - "13 2370919 * Group B upper bracket semi-final. Winner adv... 10994 \n", - "14 2370920 * Group B lower bracket round 11574 \n", - "15 2370921 * Group B upper bracket semi-final. Winner adv... 17384 \n", - "16 2370922 * Group B lower bracket round 1 8528 \n", - "17 2370913 * Group A upper bracket semi-final. Winner adv... 2023 \n", - "18 2370914 * Group A lower bracket round 1 20702 \n", - "19 2370911 * Group A upper bracket semi-final. Winner adv... 19230 \n", - "20 2370912 * Group A lower bracket round 1 21239 \n", - "21 2370909 * Group B upper bracket quarter-final 18053 \n", - "22 2370910 * Group B upper bracket quarter-final 5187 \n", - "23 2370908 * Group B upper bracket quarter-final 8507 \n", - "24 2370907 * Group B upper bracket quarter-final 8918 \n", - "25 2370906 * Group A upper bracket quarter-final 20895 \n", - "26 2370905 * Group A upper bracket quarter-final 15631 \n", - "27 2370903 * Group A upper bracket quarter-final 3741 \n", - "28 2370904 * Group A upper bracket quarter-final 10394 \n", - "\n", - " player0_rating player1_id player1_rating player2_id player2_rating \\\n", - "0 1.08 18072 1.02 13666 0.90 \n", - "1 1.04 10994 1.02 17956 1.00 \n", - "2 1.28 18850 1.22 18072 1.13 \n", - "3 1.15 8520 1.07 13915 0.99 \n", - "4 1.22 12732 1.05 16612 0.89 \n", - "5 1.47 3741 1.36 9618 1.22 \n", - "6 1.73 8183 1.32 18053 1.18 \n", - "7 1.12 18676 1.03 10394 1.01 \n", - "8 1.19 13776 0.84 16612 0.79 \n", - "9 1.43 9115 1.27 17384 1.10 \n", - "10 1.00 11840 0.92 16947 0.92 \n", - "11 1.17 19677 1.12 12018 1.05 \n", - "12 1.55 3741 1.49 3972 1.40 \n", - "13 1.52 7592 1.42 20304 1.35 \n", - "14 0.82 5187 0.80 7026 0.72 \n", - "15 1.13 11140 0.97 10588 0.92 \n", - "16 1.74 16947 1.44 8918 1.44 \n", - "17 1.16 10566 1.11 12521 1.03 \n", - "18 1.55 22922 1.32 20254 1.23 \n", - "19 1.30 10096 0.89 3741 0.88 \n", - "20 1.16 14736 1.02 22613 0.91 \n", - "21 1.54 11816 1.54 8183 1.29 \n", - "22 0.87 12958 0.75 14561 0.64 \n", - "23 0.56 8711 0.51 19128 0.46 \n", - "24 1.07 8528 0.91 16947 0.77 \n", - "25 1.29 19645 1.26 8950 0.92 \n", - "26 1.40 12521 1.25 12553 1.08 \n", - "27 1.63 9618 1.50 3972 1.01 \n", - "28 1.60 7964 1.39 18676 1.21 \n", - "\n", - " player3_id player3_rating ... player5_id player5_rating player6_id \\\n", - "0 20312 0.82 ... 18072 1.47 18850 \n", - "1 20304 0.95 ... 10994 1.16 17956 \n", - "2 13666 1.00 ... 20312 1.30 18850 \n", - "3 10394 0.97 ... 7964 1.07 18676 \n", - "4 13776 0.78 ... 20101 1.50 12732 \n", - "5 3972 1.05 ... 3741 1.38 19230 \n", - "6 11816 1.13 ... 9960 1.60 429 \n", - "7 13915 0.80 ... 8520 1.35 10394 \n", - "8 8789 0.67 ... 12732 1.32 13776 \n", - "9 11139 0.90 ... 11140 1.26 17384 \n", - "10 8528 0.91 ... 16555 1.40 11840 \n", - "11 13602 1.03 ... 9436 1.39 19677 \n", - "12 9618 1.11 ... 19230 1.83 3741 \n", - "13 17956 1.12 ... 10994 1.66 17956 \n", - "14 12958 0.62 ... 5187 1.04 11574 \n", - "15 11139 0.83 ... 17384 1.10 11140 \n", - "16 11840 1.38 ... 8528 1.91 11840 \n", - "17 12553 0.93 ... 12553 1.37 12521 \n", - "18 16551 1.11 ... 20702 1.65 22922 \n", - "19 9618 0.85 ... 19230 1.29 3972 \n", - "20 20607 0.83 ... 21239 1.54 20607 \n", - "21 9960 1.22 ... 18053 1.38 8183 \n", - "22 7026 0.32 ... 5187 2.35 12958 \n", - "23 11332 0.36 ... 19128 0.39 13230 \n", - "24 16555 0.73 ... 8918 0.68 8528 \n", - "25 24036 0.74 ... 19645 1.45 20895 \n", - "26 2023 1.05 ... 15631 1.54 2023 \n", - "27 19230 0.93 ... 3741 1.63 9618 \n", - "28 8520 1.17 ... 10394 2.24 7964 \n", - "\n", - " player6_rating player7_id player7_rating player8_id player8_rating \\\n", - "0 1.29 20312 1.00 16820 0.75 \n", - "1 1.14 7592 1.13 16717 1.10 \n", - "2 1.12 18072 1.06 13666 0.97 \n", - "3 0.99 8520 0.89 13915 0.77 \n", - "4 1.14 13776 0.74 8789 0.70 \n", - "5 1.36 9618 1.29 3972 1.18 \n", - "6 1.23 11816 1.18 18053 1.17 \n", - "7 1.26 18676 0.97 13915 0.75 \n", - "8 0.76 16612 0.74 8789 0.56 \n", - "9 1.14 11139 0.99 9115 0.96 \n", - "10 1.06 8528 0.93 16947 0.90 \n", - "11 1.29 13602 1.05 14148 1.00 \n", - "12 1.55 9618 1.29 3972 1.09 \n", - "13 1.66 20304 1.55 7592 1.52 \n", - "14 0.76 12958 0.75 7026 0.52 \n", - "15 1.05 10588 1.00 11139 0.92 \n", - "16 1.79 16947 1.63 8918 1.40 \n", - "17 1.32 2023 1.31 10566 1.26 \n", - "18 1.22 16551 1.22 20254 1.04 \n", - "19 1.07 9618 1.04 10096 1.03 \n", - "20 1.00 22613 0.97 14736 0.86 \n", - "21 1.24 11816 1.17 9960 1.01 \n", - "22 0.75 14561 0.46 7026 0.08 \n", - "23 0.32 8711 0.20 8507 0.01 \n", - "24 0.65 11840 0.28 16555 0.20 \n", - "25 1.34 8950 0.95 24036 0.95 \n", - "26 1.42 12553 1.28 10566 0.95 \n", - "27 1.63 19230 1.16 10096 0.67 \n", - "28 1.81 18676 1.65 8520 1.06 \n", - "\n", - " player9_id player9_rating \n", - "0 13666 0.47 \n", - "1 20304 1.04 \n", - "2 16820 0.54 \n", - "3 10394 0.67 \n", - "4 16612 0.62 \n", - "5 10096 0.99 \n", - "6 8183 1.02 \n", - "7 7964 0.66 \n", - "8 20101 0.51 \n", - "9 10588 0.70 \n", - "10 8918 0.83 \n", - "11 12018 0.97 \n", - "12 10096 0.88 \n", - "13 16717 1.05 \n", - "14 14561 0.40 \n", - "15 9115 0.77 \n", - "16 16555 1.26 \n", - "17 15631 1.13 \n", - "18 18744 1.02 \n", - "19 3741 0.95 \n", - "20 12092 0.60 \n", - "21 429 0.64 \n", - "22 11574 0.01 \n", - "23 11332 0.00 \n", - "24 16947 0.09 \n", - "25 8600 0.62 \n", - "26 12521 0.87 \n", - "27 3972 0.57 \n", - "28 13915 0.62 \n", - "\n", - "[29 rows x 22 columns]" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df2" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'FaZe': '1', 'G2': '5', 'MOUZ': '6', 'Cloud9': '7', 'Virtus.pro': '9', 'HEROIC': '11', 'FURIA': '15', 'Astralis': '25', 'Lynn Vision': '34', 'Liquid': '37', 'FlyQuest': '41', 'Nemiga': '46', 'Wildcard': '49', '9z': '52', 'TYLOO': '132', 'Steel Helmet': None}\n" - ] - } - ], - "source": [ - "event_team_rankings = hltv.get_event_team_rankings(event_id)\n", - "\n", - "print(event_team_rankings)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "df = pd.merge(df, df2, on='match-id', how = 'inner')" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
urlmatch-iddateeventteam1team1scoreteam1-idteam2team2-idteam2score...player5_idplayer5_ratingplayer6_idplayer6_ratingplayer7_idplayer7_ratingplayer8_idplayer8_ratingplayer9_idplayer9_rating
0https://hltv.org/matches/2370931/mouz-vs-faze-...23709312024-04-13NoneMOUZ0NaNFaZeNaN2...180721.47188501.29203121.00168200.75136660.47
1https://hltv.org/matches/2370930/astralis-vs-f...23709302024-04-12NoneAstralis1NaNFaZeNaN2...109941.16179561.1475921.13167171.10203041.04
2https://hltv.org/matches/2370929/mouz-vs-g2-ie...23709292024-04-12NoneMOUZ2NaNG2NaN1...203121.30188501.12180721.06136660.97168200.54
3https://hltv.org/matches/2370928/liquid-vs-faz...23709282024-04-11NoneLiquid1NaNFaZeNaN2...79641.07186760.9985200.89139150.77103940.67
4https://hltv.org/matches/2370927/virtuspro-vs-...23709272024-04-11NoneVirtus.pro05378.0G25995.02...201011.50127321.14137760.7487890.70166120.62
\n", - "

5 rows × 31 columns

\n", - "
" - ], - "text/plain": [ - " url match-id date \\\n", - "0 https://hltv.org/matches/2370931/mouz-vs-faze-... 2370931 2024-04-13 \n", - "1 https://hltv.org/matches/2370930/astralis-vs-f... 2370930 2024-04-12 \n", - "2 https://hltv.org/matches/2370929/mouz-vs-g2-ie... 2370929 2024-04-12 \n", - "3 https://hltv.org/matches/2370928/liquid-vs-faz... 2370928 2024-04-11 \n", - "4 https://hltv.org/matches/2370927/virtuspro-vs-... 2370927 2024-04-11 \n", - "\n", - " event team1 team1score team1-id team2 team2-id team2score ... \\\n", - "0 None MOUZ 0 NaN FaZe NaN 2 ... \n", - "1 None Astralis 1 NaN FaZe NaN 2 ... \n", - "2 None MOUZ 2 NaN G2 NaN 1 ... \n", - "3 None Liquid 1 NaN FaZe NaN 2 ... \n", - "4 None Virtus.pro 0 5378.0 G2 5995.0 2 ... \n", - "\n", - " player5_id player5_rating player6_id player6_rating player7_id \\\n", - "0 18072 1.47 18850 1.29 20312 \n", - "1 10994 1.16 17956 1.14 7592 \n", - "2 20312 1.30 18850 1.12 18072 \n", - "3 7964 1.07 18676 0.99 8520 \n", - "4 20101 1.50 12732 1.14 13776 \n", - "\n", - " player7_rating player8_id player8_rating player9_id player9_rating \n", - "0 1.00 16820 0.75 13666 0.47 \n", - "1 1.13 16717 1.10 20304 1.04 \n", - "2 1.06 13666 0.97 16820 0.54 \n", - "3 0.89 13915 0.77 10394 0.67 \n", - "4 0.74 8789 0.70 16612 0.62 \n", - "\n", - "[5 rows x 31 columns]" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.head()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": ".venv", - "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.11.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} From 3daf90de9db60f9d357d53230eae45db2df25bd0 Mon Sep 17 00:00:00 2001 From: JoeM PC Date: Wed, 24 Apr 2024 11:56:47 +0100 Subject: [PATCH 3/8] Fixed issues with NaN for team id and added extra player stats for get_match_stats --- main.py | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/main.py b/main.py index 9defd1e..f55922e 100644 --- a/main.py +++ b/main.py @@ -41,7 +41,7 @@ def _monthNameToNumber(monthName: str): monthName = "August" return datetime.datetime.strptime(monthName, '%B').month -def get_parsed_page(url, delay=0.5): +def get_parsed_page(url, delay=0.5, max_trys = 100): # This fixes a blocked by cloudflare error i've encountered headers = { "referer": "https://www.hltv.org/stats", @@ -53,8 +53,18 @@ def get_parsed_page(url, delay=0.5): } time.sleep(delay) + req = requests.get(url, headers=headers, cookies=cookies) - return BeautifulSoup(requests.get(url, headers=headers, cookies=cookies).text, "lxml") + try_number = 1 + while req.status_code == 403: ## 'blocked' error code + time.sleep(delay) + req = requests.get(url, headers=headers, cookies=cookies) + try_number += 1 + if try_number == max_trys: + break + + results = BeautifulSoup(req.text, "lxml") + return results def get_parsed_page_matches(url, delay=0.5, max_trys = 100): # This fixes a blocked error when trying to get game results page @@ -71,7 +81,7 @@ def get_parsed_page_matches(url, delay=0.5, max_trys = 100): req = requests.get(url, headers=headers, cookies=cookies) try_number = 1 - while req.status_code == 403: + while req.status_code == 403: ##'blocked' error code time.sleep(delay) req = requests.get(url, headers=headers, cookies=cookies) try_number += 1 @@ -553,13 +563,16 @@ def get_match_stats(match_id): results = get_parsed_page_matches(url) match_stats['match-id'] = match_id - match_stats['match_type'] = results.find('div', attrs={'class': 'padding preformatted-text'}).text.strip().split('\n')[2] + match_stats['match_type'] = results.find('div', attrs={'class': 'padding preformatted-text'}).text.strip().split('\n')[0] + match_stats['match_stage'] = results.find('div', attrs={'class': 'padding preformatted-text'}).text.strip().split('\n')[2] player_stats = results.find_all('tr', attrs={'class': ''}) for i, player in enumerate(player_stats[0:10]): match_stats[f'player{i}_id'] = player.find('a', attrs = {'class': 'flagAlign no-maps-indicator-offset'}).get('href').split('/')[2] match_stats[f'player{i}_rating'] = player.find('td', attrs = {'class': "rating text-center"}).text + match_stats[f'player{i}_kast'] = player.find('td', attrs = {'class': "kast text-center"}).text + match_stats[f'player{i}_adr'] = player.find('td', attrs = {'class': "adr text-center"}).text return match_stats From 3f2651b5c50a259c90a9a87a0081cf9bf74a7793 Mon Sep 17 00:00:00 2001 From: JoeM PC Date: Thu, 25 Apr 2024 11:49:43 +0100 Subject: [PATCH 4/8] added function to get player past results for a match --- main.py | 49 +++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 43 insertions(+), 6 deletions(-) diff --git a/main.py b/main.py index f55922e..9490adc 100644 --- a/main.py +++ b/main.py @@ -15,7 +15,7 @@ LOCAL_ZONEINFO = zoneinfo.ZoneInfo(LOCAL_TIMEZONE_NAME) TEAM_MAP_FOR_RESULTS = [] def _get_all_teams(): if not TEAM_MAP_FOR_RESULTS: - teams = get_parsed_page("https://www.hltv.org/stats/teams?minMapCount=0") + teams = get_parsed_page("https://www.hltv.org/stats/teams?minMapCount=0", verbose=False) for team in teams.find_all("td", {"class": ["teamCol-teams-overview"], }): team = {'id': converters.to_int(team.find("a")["href"].split("/")[-2]), 'name': team.find("a").text, 'url': "https://hltv.org" + team.find("a")["href"]} TEAM_MAP_FOR_RESULTS.append(team) @@ -41,7 +41,7 @@ def _monthNameToNumber(monthName: str): monthName = "August" return datetime.datetime.strptime(monthName, '%B').month -def get_parsed_page(url, delay=0.5, max_trys = 100): +def get_parsed_page(url, delay=0.5, max_trys = 100, verbose = True): # This fixes a blocked by cloudflare error i've encountered headers = { "referer": "https://www.hltv.org/stats", @@ -61,12 +61,14 @@ def get_parsed_page(url, delay=0.5, max_trys = 100): req = requests.get(url, headers=headers, cookies=cookies) try_number += 1 if try_number == max_trys: + if verbose: print(f'Failed to parse after {max_trys} trys') break - + if (req.status_code == 200) and verbose: print(f'Parsed page successfully after {try_number} trys') + results = BeautifulSoup(req.text, "lxml") return results -def get_parsed_page_matches(url, delay=0.5, max_trys = 100): +def get_parsed_page_matches(url, delay=0.5, max_trys = 100, verbose = True): # This fixes a blocked error when trying to get game results page headers = { "referer": "https://www.hltv.org/matches", ## Have changed referer @@ -86,8 +88,9 @@ def get_parsed_page_matches(url, delay=0.5, max_trys = 100): req = requests.get(url, headers=headers, cookies=cookies) try_number += 1 if try_number == max_trys: + if verbose: print(f'Failed to parse after {max_trys} trys') break - + if (req.status_code == 200) and verbose: print(f'Parsed page successfully after {try_number} trys') results = BeautifulSoup(req.text, "lxml") return results @@ -554,7 +557,7 @@ def get_event_team_rankings(event_id): return team_id_map -def get_match_stats(match_id): +def get_match_result_stats(match_id): match_stats = {} @@ -573,8 +576,42 @@ def get_match_stats(match_id): match_stats[f'player{i}_rating'] = player.find('td', attrs = {'class': "rating text-center"}).text match_stats[f'player{i}_kast'] = player.find('td', attrs = {'class': "kast text-center"}).text match_stats[f'player{i}_adr'] = player.find('td', attrs = {'class': "adr text-center"}).text + return match_stats +def get_past_player_stats_for_match(match_id): + + match_stats = {} + + url = 'https://www.hltv.org/matches/' + str(match_id) + '/page' + + results = get_parsed_page_matches(url) + + match_stats['match-id'] = match_id + + ## Want to get previous player stats when the match started, we get the previous 3 months + match_date = eval(results.find('script', attrs={'type': 'application/ld+json'}).text)['startDate'].split('T')[0] + y,m,d = match_date.split('-') + m = (int(m) - 3) % 12 + match_date_sub_3_months = '-'.join([y, str(m).zfill(2), d]) + + team_ids = [T['url'].split('/')[-2] for T in eval(results.find('script', attrs={'type': 'application/ld+json'}).text)['competitor']] + + for i, team_id in enumerate(team_ids): + url = 'https://www.hltv.org/stats/teams/players/'+ team_id +'/page?startDate='+match_date_sub_3_months+'&endDate='+match_date + team_page = get_parsed_page_matches(url) + player_stats = team_page.find_all('tr')[1:6] + for j, player in enumerate(player_stats): + if player.find('a'): ## Deals with teams using standin only have 4 roster players + match_stats[f'player{5*i+j}_id'] = player.find('a').get('href').split('/')[3] + match_stats[f'player{5*i+j}_rating'] = player.find_all('td')[-1].text + match_stats[f'player{5*i+j}_kd'] = player.find('td', attrs = {'class': "statsDetail"}).text + else: + match_stats[f'player{5*i+j}_id'] = None + match_stats[f'player{5*i+j}_rating'] = None + match_stats[f'player{5*i+j}_kd'] = None + + return match_stats if __name__ == "__main__": From 8c561f454df3ce3fa2c05a4935303f1aa2f36e93 Mon Sep 17 00:00:00 2001 From: JoeM PC Date: Thu, 25 Apr 2024 14:51:31 +0100 Subject: [PATCH 5/8] fixed bugs with new functions --- main.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/main.py b/main.py index 9490adc..9f2f64b 100644 --- a/main.py +++ b/main.py @@ -593,7 +593,9 @@ def get_past_player_stats_for_match(match_id): match_date = eval(results.find('script', attrs={'type': 'application/ld+json'}).text)['startDate'].split('T')[0] y,m,d = match_date.split('-') m = (int(m) - 3) % 12 - match_date_sub_3_months = '-'.join([y, str(m).zfill(2), d]) + if m>9: ## 3 months prior is in previous year + y = int(y)-1 + match_date_sub_3_months = '-'.join([str(y), str(m).zfill(2), d]) team_ids = [T['url'].split('/')[-2] for T in eval(results.find('script', attrs={'type': 'application/ld+json'}).text)['competitor']] From 6c9117211d7d478efb258dba6e54a4e245730310 Mon Sep 17 00:00:00 2001 From: JoeM PC Date: Thu, 25 Apr 2024 14:51:56 +0100 Subject: [PATCH 6/8] bug fix --- main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.py b/main.py index 9f2f64b..e2947d9 100644 --- a/main.py +++ b/main.py @@ -607,7 +607,7 @@ def get_past_player_stats_for_match(match_id): if player.find('a'): ## Deals with teams using standin only have 4 roster players match_stats[f'player{5*i+j}_id'] = player.find('a').get('href').split('/')[3] match_stats[f'player{5*i+j}_rating'] = player.find_all('td')[-1].text - match_stats[f'player{5*i+j}_kd'] = player.find('td', attrs = {'class': "statsDetail"}).text + match_stats[f'player{5*i+j}_kd'] = player.find_all('td', attrs = {'class': "statsDetail"})[-1].text else: match_stats[f'player{5*i+j}_id'] = None match_stats[f'player{5*i+j}_rating'] = None From 612291c88317d00cf6775be3b566e058e10b6bc6 Mon Sep 17 00:00:00 2001 From: JoeM PC Date: Thu, 25 Apr 2024 17:36:36 +0100 Subject: [PATCH 7/8] bug fixes --- main.py | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/main.py b/main.py index e2947d9..2734e5f 100644 --- a/main.py +++ b/main.py @@ -567,16 +567,8 @@ def get_match_result_stats(match_id): match_stats['match-id'] = match_id match_stats['match_type'] = results.find('div', attrs={'class': 'padding preformatted-text'}).text.strip().split('\n')[0] - match_stats['match_stage'] = results.find('div', attrs={'class': 'padding preformatted-text'}).text.strip().split('\n')[2] - - player_stats = results.find_all('tr', attrs={'class': ''}) - for i, player in enumerate(player_stats[0:10]): - - match_stats[f'player{i}_id'] = player.find('a', attrs = {'class': 'flagAlign no-maps-indicator-offset'}).get('href').split('/')[2] - match_stats[f'player{i}_rating'] = player.find('td', attrs = {'class': "rating text-center"}).text - match_stats[f'player{i}_kast'] = player.find('td', attrs = {'class': "kast text-center"}).text - match_stats[f'player{i}_adr'] = player.find('td', attrs = {'class': "adr text-center"}).text - + match_stats['match_stage'] = results.find('div', attrs={'class': 'padding preformatted-text'}).text.strip().split('\n')[2 + ] return match_stats def get_past_player_stats_for_match(match_id): From 9bfac9126c01f0e2a2dcf54483c3c080fa54f8e7 Mon Sep 17 00:00:00 2001 From: JoeM PC Date: Mon, 29 Apr 2024 19:06:24 +0100 Subject: [PATCH 8/8] Updated code, added extra info to get_match_result_stats --- main.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/main.py b/main.py index 2734e5f..fdf4b7d 100644 --- a/main.py +++ b/main.py @@ -68,7 +68,7 @@ def get_parsed_page(url, delay=0.5, max_trys = 100, verbose = True): results = BeautifulSoup(req.text, "lxml") return results -def get_parsed_page_matches(url, delay=0.5, max_trys = 100, verbose = True): +def get_parsed_page_matches(url, delay=1, max_trys = 100, verbose = True): # This fixes a blocked error when trying to get game results page headers = { "referer": "https://www.hltv.org/matches", ## Have changed referer @@ -567,8 +567,11 @@ def get_match_result_stats(match_id): match_stats['match-id'] = match_id match_stats['match_type'] = results.find('div', attrs={'class': 'padding preformatted-text'}).text.strip().split('\n')[0] - match_stats['match_stage'] = results.find('div', attrs={'class': 'padding preformatted-text'}).text.strip().split('\n')[2 - ] + match_stats['match_stage'] = results.find('div', attrs={'class': 'padding preformatted-text'}).text.strip().split('\n')[2] + rank_list = results.find_all('div', attrs={'class': 'teamRanking'}) + match_stats['team1_Ranking'] = rank_list[0].find('a').contents[1].strip('#') + match_stats['team2_Ranking'] = rank_list[1].find('a').contents[1].strip('#') + return match_stats def get_past_player_stats_for_match(match_id):