Commit 6a3537ea authored by ben.eastwood's avatar ben.eastwood

First commit

parents
B# Final-Project B# Final-Project
# Built using https://towardsdatascience.com/naive-bayes-classifier-how-to-successfully-use-it-in-python-ecf76a995069
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.preprocessing import OrdinalEncoder
from sklearn.naive_bayes import CategoricalNB
import seaborn as sns; sns.set()
import matplotlib.pyplot as plt
import plotly.express as px
import plotly.graph_objects as go
def mfunc(X, y, typ):
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
model = typ
clf = model.fit(X_train, y_train)
pred_labels = model.predict(X_test)
print('Classes: ', clf.classes_)
if str(typ) == 'GaussianNB()':
print('Class Priors: ', clf.class_prior_)
else:
print('Class Log Priors: ', clf.class_log_prior_)
print('--------------------------------------------------------')
score = model.score(X_test, y_test)
print('Accuracy Score: ', score)
print('--------------------------------------------------------')
print(classification_report(y_test, pred_labels))
return X_train, X_test, y_train, y_test, clf, pred_labels
df = pd.read_csv('data.csv')
df.info()
# 'Map' 'Winner' 'Team1StartingSide' 'Team2StartingSide' 'AverageACSTeam1' 'AverageACSTeam2' 'AverageKillsTeam1' 'AverageKillsTeam2' 'TotalFKTeam1' 'TotalFKTeam2'
# 'TotalFDTeam1' 'TotalFDTeam2' 'TotalKillsTeam1' 'TotalKillsTeam2' 'TotalDeathsTeam1' 'TotalDeathsTeam2' 'TotalFKFDTeam1' 'TotalFKFDTeam2' 'EntryFKFDTeam1' 'EntryFKFDTeam2'
# 'HsPercentageTeam1' 'HsPercentageTeam2'
X = df[['Map', 'Team1StartingSide']]
y = df['Winner'].values
# Encode categorical variables
enc = OrdinalEncoder()
X = enc.fit_transform(X)
frames = [df]
data = pd.concat(frames, axis=1)
#print(df.groupby(['Map', 'Team1StartingSide']).count())
#sns.scatterplot(x="HsPercentageTeam1", y="HsPercentageTeam2", hue='Winner', data=data, palette="tab10")
#sns.displot(x='Team1StartingSide', hue='Winner', col='Map', row='Winner', data=data, rug=True, palette="tab10")
plt.show()
X_train, X_test, y_train, y_test, clf, pred_labels = mfunc(X, y, CategoricalNB())
\ No newline at end of file
import csv
def ClearCsv():
f = open('data.csv', 'w+')
f.close()
def ParseCsv():
file = open('match.csv', 'r')
data = list(csv.reader(file))
file.close()
header = ['Map', 'Winner',
'Team1StartingSide', 'Team2StartingSide',
'AverageACSTeam1', 'AverageACSTeam2',
'AverageKillsTeam1', 'AverageKillsTeam2',
'TotalFKTeam1', 'TotalFKTeam2',
'TotalFDTeam1', 'TotalFDTeam2',
'TotalKillsTeam1', 'TotalKillsTeam2',
'TotalDeathsTeam1', 'TotalDeathsTeam2',
'TotalFKFDTeam1', 'TotalFKFDTeam2',
'EntryFKFDTeam1', 'EntryFKFDTeam2',
'HsPercentageTeam1', 'HsPercentageTeam2']
with open('data.csv', 'a', newline='') as f:
writer = csv.writer(f)
writer.writerow(header)
i=0
while i<len(data):
x=data[i]
if(x[0] == '-'):
map = data[i+1][0]
if(map != '/'):
i += 1
team1score = data[i][2]
team2score = data[i][4]
if(int(team1score) > int(team2score)):
winner = 1
elif(int(team1score) < int(team2score)):
winner = -1
else:
winner = 0
team1side = data[i][5]
team2side = data[i][6]
team1acs = []
team1fk = []
team1fd = []
team1kills = []
team1deaths = []
team1fkfd = []
team1entryfkfd = []
team1headshotpercentage = []
team2acs = []
team2fk = []
team2fd = []
team2kills = []
team2deaths = []
team2fkfd = []
team2entryfkfd = []
team2headshotpercentage = []
y=0
while(y != 5):
try:
i += 1
team1acs.append(data[i][4])
team1fk.append(data[i][12])
team1fd.append(data[i][13])
team1kills.append(data[i][5])
team1deaths.append(data[i][6])
team1fkfd.append(data[i][14])
team1headshotpercentage.append(data[i][11])
if(data[i][2] == 'jett' or 'neon' or 'raze'):
team1entryfkfd.append(data[i][14])
y += 1
except:
y += 1
while(y != 10):
i += 1
team2acs.append(data[i][4])
team2fk.append(data[i][12])
team2fd.append(data[i][13])
team2kills.append(data[i][5])
team2deaths.append(data[i][6])
team2fkfd.append(data[i][14])
team2headshotpercentage.append(data[i][11])
if(data[i][2] == 'jett' or 'neon' or 'raze'):
team2entryfkfd.append(data[i][14])
y += 1
team1AverageAcs, team1AverageKills, team1TotalFk, team1TotalFd, team1TotalKills, team1TotalDeaths, team1TotalFkFd, team1AverageHS = 0, 0, 0, 0, 0, 0, 0, 0
team2AverageAcs, team2AverageKills, team2TotalFk, team2TotalFd, team2TotalKills, team2TotalDeaths, team2TotalFkFd, team2AverageHS = 0, 0, 0, 0, 0, 0, 0, 0
team1AverageEntryFkFd, team2AverageEntryFkFd, iteration1, iteration2 = 0, 0, 0, 0
for duelist in team1entryfkfd:
try:
team1AverageEntryFkFd += int(duelist)
iteration1 += 1
except:
team1AverageEntryFkFd = 0
for duelist in team2entryfkfd:
try:
team2AverageEntryFkFd += int(duelist)
iteration2 += 1
except:
team2AverageEntryFkFd = 0
try:
team1AverageEntryFkFd = team1AverageEntryFkFd/iteration1
team2AverageEntryFkFd = team2AverageEntryFkFd/iteration2
except:
print("0 duelist comp")
try:
y=0
while(y != 5):
team1AverageAcs += int(team1acs[y])
team1AverageKills += int(team1kills[y])
team1AverageHS += int(team1headshotpercentage[y])
team1TotalFk += int(team1fk[y])
team1TotalFd += int(team1fd[y])
team1TotalKills += int(team1kills[y])
team1TotalDeaths += int(team1deaths[y])
team1TotalFkFd += int(team1fkfd[y])
team2AverageAcs += int(team2acs[y])
team2AverageKills += int(team2kills[y])
team2AverageHS += int(team2headshotpercentage[y])
team2TotalFk += int(team2fk[y])
team2TotalFd += int(team2fd[y])
team2TotalKills += int(team2kills[y])
team2TotalDeaths += int(team2deaths[y])
team2TotalFkFd += int(team2fkfd[y])
y += 1
team1AverageAcs = team1AverageAcs/5
team2AverageAcs = team2AverageAcs/5
team1AverageKills = team1AverageKills/5
team2AverageKills = team2AverageKills/5
team1AverageHS = team1AverageHS/5
team2AverageHS = team2AverageHS/5
row = [map, winner, team1side, team2side, team1AverageAcs, team2AverageAcs, team1AverageKills, team2AverageKills, team1TotalFk, team2TotalFk,
team1TotalFd, team2TotalFd, team1TotalKills, team2TotalKills, team1TotalDeaths, team2TotalDeaths, team1TotalFkFd, team2TotalFkFd, team1AverageEntryFkFd, team2AverageEntryFkFd,
team1AverageHS, team2AverageHS]
with open('data.csv', 'a', newline='') as f:
writer = csv.writer(f)
writer.writerow(row)
except:
pass
else:
i += 1
else:
i += 1
ClearCsv()
ParseCsv()
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
https://www.vlr.gg/event/1015
https://www.vlr.gg/event/1111
https://www.vlr.gg/event/1130
https://www.vlr.gg/event/1117
https://www.vlr.gg/event/1083
https://www.vlr.gg/event/1084
https://www.vlr.gg/event/1014
https://www.vlr.gg/event/1113
https://www.vlr.gg/event/1085
https://www.vlr.gg/event/1086
https://www.vlr.gg/event/800
https://www.vlr.gg/event/911
https://www.vlr.gg/event/984
https://www.vlr.gg/event/1063
https://www.vlr.gg/event/1013
https://www.vlr.gg/event/998
https://www.vlr.gg/event/988
https://www.vlr.gg/event/983
https://www.vlr.gg/event/996
https://www.vlr.gg/event/1012
https://www.vlr.gg/event/882
https://www.vlr.gg/event/991
https://www.vlr.gg/event/972
https://www.vlr.gg/event/977
https://www.vlr.gg/event/965
https://www.vlr.gg/event/963
https://www.vlr.gg/event/960
https://www.vlr.gg/event/997
https://www.vlr.gg/event/926
https://www.vlr.gg/event/955
https://www.vlr.gg/event/885
https://www.vlr.gg/event/948
https://www.vlr.gg/event/829
https://www.vlr.gg/event/925
https://www.vlr.gg/event/799
https://www.vlr.gg/event/854
https://www.vlr.gg/event/853
https://www.vlr.gg/event/850
https://www.vlr.gg/event/884
https://www.vlr.gg/event/845
https://www.vlr.gg/event/852
https://www.vlr.gg/event/844
https://www.vlr.gg/event/842
https://www.vlr.gg/event/841
https://www.vlr.gg/event/840
https://www.vlr.gg/event/883
https://www.vlr.gg/event/851
https://www.vlr.gg/event/823
https://www.vlr.gg/event/858
https://www.vlr.gg/event/879
https://www.vlr.gg/event/830
https://www.vlr.gg/event/812
https://www.vlr.gg/event/796
https://www.vlr.gg/event/797
https://www.vlr.gg/event/795
https://www.vlr.gg/event/792
https://www.vlr.gg/event/793
https://www.vlr.gg/event/794
import csv
import matchStatsFunction as f
import urlGetFunction as u
import time
import csvParse as c
print("Operation Started")
startTime = time.time()
eventUrls = []
f.ClearCsv()
u.ClearUrls()
c.ClearCsv()
u.GetEvents('https://www.vlr.gg/vct-2022')
file = open('eventUrl.csv', 'r')
data = list(csv.reader(file))
file.close()
i=0
while i<len(data):
x = data[i]
z = x[0]
eventUrls.append(z)
i += 1
u.GetUrls(eventUrls)
file = open('urls.csv', 'r')
data = list(csv.reader(file))
file.close()
print("Match Stats Gathering Started")
i=0
while i<len(data):
x = data[i]
z = x[0]
f.GetMatchStats(z)
i += 1
print("Parsing Data")
c.ParseCsv()
endTime = time.time()
finalTime = endTime - startTime
finalTimeStr = str(finalTime)
print("Operation Successful")
print("Operation took " + finalTimeStr + " to complete.")
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
import requests
from bs4 import BeautifulSoup
import re
import csv
def CleanString(string):
return re.sub(r'[^a-zA-Z0-9 -]', '', ' '.join(string.split()).strip())
def ClearCsv():
f = open('match.csv', 'w+')
f.close()
def GetMatchStats(url):
urlCodes = url.split('/')
matchCode = urlCodes[3]
keepGoing = 1
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
#Get BoX (eg. Bo3, Bo5)
boXDiv = soup.find('div', {'class': 'match-header-vs-note'})
boXDiv = boXDiv.findNext('div', {'class': 'match-header-vs-note'})
boXData = CleanString(boXDiv.text).split(" ")
boXText = boXData[0]
#Total Match Stats
#Get Map
mapText = 'All Maps'
#Get Team Names
teamNameDiv = soup.find('div', {'class': 'wf-title-med'})
teamNameData = CleanString(teamNameDiv.text)
team1NameText = teamNameData
teamNameDiv = teamNameDiv.findNext('div', {'class': 'wf-title-med'})
teamNameData = CleanString(teamNameDiv.text)
team2NameText = teamNameData
#Get Map Scores
teamScoreDiv = soup.find('div', {'class': 'js-spoiler'})
teamScoreData = CleanString(teamScoreDiv.text).split(" ")
team1ScoreText = teamScoreData[0]
team2ScoreText = teamScoreData[2]
teamScoreTotal = [mapText, team1NameText, team1ScoreText, team2NameText, team2ScoreText, matchCode, boXText]
with open('match.csv', 'a', newline='') as f:
writer = csv.writer(f)
writer.writerow(teamScoreTotal)
try:
#Overall Stats
table = soup.find('div', {'class': 'vm-stats-game'})
table = table.findNext('div', {'class': 'vm-stats-game'})
rows = table.find_all('tr')
for row in rows:
cells = row.find_all('td')
if len(cells) >= 3:
playerteam = CleanString(cells[0].text).split(" ")
player, team = playerteam[0], playerteam[1]
if(player == 'gob' and team == 'b'): # Fix for a player with a space in the name
player = 'gob-b'
team = playerteam[2]
agents = []
for img in row.find_all('img', alt=True):
agents.append(CleanString(img['alt']))
ratings = CleanString(cells[2].text).split(" ")
ratingOverall = ratings[0]
acs = CleanString(cells[3].text).split(" ")
acsOverall = acs[0]
kills = CleanString(cells[4].text).split(" ")
killsOverall = kills[0]
deaths = CleanString(cells[5].text).split(" ")
deathsOverall = deaths[1]
assists = CleanString(cells[6].text).split(" ")
assistsOverall = assists[0]
kdDifference = CleanString(cells[7].text).split(" ")
kdDifferenceOverall = kdDifference[0]
kast = CleanString(cells[8].text).split(" ")
kastOverall = kast[0]
adr = CleanString(cells[9].text).split(" ")
adrOverall= adr[0]
hs = CleanString(cells[10].text).split(" ")
hsOverall = hs[0]
fk = CleanString(cells[11].text).split(" ")
fkOverall = fk[0]
fd = CleanString(cells[12].text).split(" ")
fdOverall = fd[0]
fkDifference = CleanString(cells[13].text).split(" ")
fkDifferenceOverall = fkDifference[0]
data = [player, team, agents, ratingOverall, acsOverall, killsOverall, deathsOverall, assistsOverall, kdDifferenceOverall, kastOverall, adrOverall, hsOverall, fkOverall, fdOverall, fkDifferenceOverall]
with open('match.csv', 'a', newline='') as f:
writer = csv.writer(f)
writer.writerow(data)
with open('match.csv', 'a', newline='') as f:
writer = csv.writer(f)
writer.writerow('-')
except:
#In case of forfeit get header to see which team won
headerDiv = soup.find('div', {'class': 'match-header-vs-note'})
headerData = CleanString(headerDiv.text)
headerText = headerData
with open('match.csv', 'a', newline='') as f:
writer = csv.writer(f)
writer.writerow([headerText])
keepGoing = 0
#Map 1 Stats
if(keepGoing):
try:
#Get Map
mapDiv = soup.find('div', {'class': 'map'})
mapData = CleanString(mapDiv.text).split(" ")
mapText = mapData[0]
#Get Map Score
teamScoreDiv = soup.find('div', {'class': 'score'})
teamScoreData = CleanString(teamScoreDiv.text).split(" ")
team1ScoreText = teamScoreData[0]
teamScoreDiv = teamScoreDiv.findNext('div', {'class': 'score'})
teamScoreData = CleanString(teamScoreDiv.text).split(" ")
team2ScoreText = teamScoreData[0]
# Get if Team1 is on Attack or Defence in first half
roundsDiv = soup.find('div', {'class': 'vlr-rounds'})
sideDiv = roundsDiv.find('div', {'class': 'vlr-rounds-row-col'})
sideDiv = sideDiv.findNext('div', {'class': 'vlr-rounds-row-col'})
team2 = False
for div in sideDiv:
if("rnd-sq mod-win mod-ct" in str(div)):
if(team2):
sideText = 'T'
else:
sideText = 'CT'
elif("rnd-sq mod-win mod-t" in str(div)):
if(team2):
sideText = 'CT'
else:
sideText = 'T'
elif("rnd-sq" in str(div)):
team2 = True
team1StartingSide = sideText
if(team1StartingSide == 'CT'):
team2StartingSide = 'T'
elif(team1StartingSide == 'T'):
team2StartingSide = 'CT'
else:
team2StartingSide = 'NA'
teamScoreMap = [mapText, team1NameText, team1ScoreText, team2NameText, team2ScoreText, team1StartingSide, team2StartingSide]
with open('match.csv', 'a', newline='') as f:
writer = csv.writer(f)
writer.writerow(teamScoreMap)
#Stats
table = soup.find('div', {'class': 'vm-stats-game'})
rows = table.find_all('tr')
for row in rows:
cells = row.find_all('td')
if len(cells) >= 3:
playerteam = CleanString(cells[0].text).split(" ")
player, team = playerteam[0], playerteam[1]
if(player == 'gob' and team == 'b'):
player = 'gob-b'
team = playerteam[2]
for img in row.find_all('img', alt=True):
agent = CleanString(img['alt'])
ratings = CleanString(cells[2].text).split(" ")
ratingOverall = ratings[0]
acs = CleanString(cells[3].text).split(" ")
acsOverall = acs[0]
kills = CleanString(cells[4].text).split(" ")
killsOverall = kills[0]
deaths = CleanString(cells[5].text).split(" ")
deathsOverall = deaths[1]
assists = CleanString(cells[6].text).split(" ")
assistsOverall = assists[0]
kdDifference = CleanString(cells[7].text).split(" ")
kdDifferenceOverall = kdDifference[0]
kast = CleanString(cells[8].text).split(" ")
kastOverall = kast[0]
adr = CleanString(cells[9].text).split(" ")
adrOverall = adr[0]
hs = CleanString(cells[10].text).split(" ")
hsOverall = hs[0]
fk = CleanString(cells[11].text).split(" ")
fkOverall = fk[0]
fd = CleanString(cells[12].text).split(" ")
fdOverall = fd[0]
fkDifference = CleanString(cells[13].text).split(" ")
fkDifferenceOverall = fkDifference[0]
data = [player, team, agent, ratingOverall, acsOverall, killsOverall, deathsOverall, assistsOverall, kdDifferenceOverall, kastOverall, adrOverall, hsOverall, fkOverall, fdOverall, fkDifferenceOverall]
with open('match.csv', 'a', newline='') as f:
writer = csv.writer(f)
writer.writerow(data)
with open('match.csv', 'a', newline='') as f:
writer = csv.writer(f)
writer.writerow('-')
except:
keepGoing = 0
#Map 2 Stats
if(keepGoing):
try:
#Get Map
mapDiv = mapDiv.findNext('div', {'class': 'map'})
mapData = CleanString(mapDiv.text).split(" ")
mapText = mapData[0]
#Get Map Score
teamScoreDiv = teamScoreDiv.findNext('div', {'class': 'score'})
teamScoreData = CleanString(teamScoreDiv.text).split(" ")
team1ScoreText = teamScoreData[0]
teamScoreDiv = teamScoreDiv.findNext('div', {'class': 'score'})
teamScoreData = CleanString(teamScoreDiv.text).split(" ")
team2ScoreText = teamScoreData[0]
# Get if Team1 is on Attack or Defence in first half
roundsDiv = roundsDiv.findNext('div', {'class': 'vlr-rounds'})
sideDiv = roundsDiv.find('div', {'class': 'vlr-rounds-row-col'})
sideDiv = sideDiv.findNext('div', {'class': 'vlr-rounds-row-col'})
team2 = False
for div in sideDiv:
if("rnd-sq mod-win mod-ct" in str(div)):
if(team2):
sideText = 'T'
else:
sideText = 'CT'
elif("rnd-sq mod-win mod-t" in str(div)):
if(team2):
sideText = 'CT'
else:
sideText = 'T'
elif("rnd-sq" in str(div)):
team2 = True
team1StartingSide = sideText
if(team1StartingSide == 'CT'):
team2StartingSide = 'T'
elif(team1StartingSide == 'T'):
team2StartingSide = 'CT'
else:
team2StartingSide = 'NA'
teamScoreMap = [mapText, team1NameText, team1ScoreText, team2NameText, team2ScoreText, team1StartingSide, team2StartingSide]
with open('match.csv', 'a', newline='') as f:
writer = csv.writer(f)
writer.writerow(teamScoreMap)
#Stats
table = table.findNext('div', {'class': 'vm-stats-game'})
table = table.findNext('div', {'class': 'vm-stats-game'})
rows = table.find_all('tr')
for row in rows:
cells = row.find_all('td')
if len(cells) >= 3:
playerteam = CleanString(cells[0].text).split(" ")
player, team = playerteam[0], playerteam[1]
if(player == 'gob' and team == 'b'):
player = 'gob-b'
team = playerteam[2]
for img in row.find_all('img', alt=True):
agent = CleanString(img['alt'])
ratings = CleanString(cells[2].text).split(" ")
ratingOverall = ratings[0]
acs = CleanString(cells[3].text).split(" ")
acsOverall = acs[0]
kills = CleanString(cells[4].text).split(" ")
killsOverall = kills[0]
deaths = CleanString(cells[5].text).split(" ")
deathsOverall = deaths[1]
assists = CleanString(cells[6].text).split(" ")
assistsOverall = assists[0]
kdDifference = CleanString(cells[7].text).split(" ")
kdDifferenceOverall = kdDifference[0]
kast = CleanString(cells[8].text).split(" ")
kastOverall = kast[0]
adr = CleanString(cells[9].text).split(" ")
adrOverall = adr[0]
hs = CleanString(cells[10].text).split(" ")
hsOverall = hs[0]
fk = CleanString(cells[11].text).split(" ")
fkOverall = fk[0]
fd = CleanString(cells[12].text).split(" ")
fdOverall = fd[0]
fkDifference = CleanString(cells[13].text).split(" ")
fkDifferenceOverall = fkDifference[0]
data = [player, team, agent, ratingOverall, acsOverall, killsOverall, deathsOverall, assistsOverall, kdDifferenceOverall, kastOverall, adrOverall, hsOverall, fkOverall, fdOverall, fkDifferenceOverall]
with open('match.csv', 'a', newline='') as f:
writer = csv.writer(f)
writer.writerow(data)
with open('match.csv', 'a', newline='') as f:
writer = csv.writer(f)
writer.writerow('-')
except:
keepGoing = 0
#Map 3 Stats
if(keepGoing):
try:
#Get Map
mapDiv = mapDiv.findNext('div', {'class': 'map'})
mapData = CleanString(mapDiv.text).split(" ")
mapText = mapData[0]
#Get Map Score
teamScoreDiv = teamScoreDiv.findNext('div', {'class': 'score'})
teamScoreData = CleanString(teamScoreDiv.text).split(" ")
team1ScoreText = teamScoreData[0]
teamScoreDiv = teamScoreDiv.findNext('div', {'class': 'score'})
teamScoreData = CleanString(teamScoreDiv.text).split(" ")
team2ScoreText = teamScoreData[0]
# Get if Team1 is on Attack or Defence in first half
roundsDiv = roundsDiv.findNext('div', {'class': 'vlr-rounds'})
sideDiv = roundsDiv.find('div', {'class': 'vlr-rounds-row-col'})
sideDiv = sideDiv.findNext('div', {'class': 'vlr-rounds-row-col'})
team2 = False
for div in sideDiv:
if("rnd-sq mod-win mod-ct" in str(div)):
if(team2):
sideText = 'T'
else:
sideText = 'CT'
elif("rnd-sq mod-win mod-t" in str(div)):
if(team2):
sideText = 'CT'
else:
sideText = 'T'
elif("rnd-sq" in str(div)):
team2 = True
team1StartingSide = sideText
if(team1StartingSide == 'CT'):
team2StartingSide = 'T'
elif(team1StartingSide == 'T'):
team2StartingSide = 'CT'
else:
team2StartingSide = 'NA'
teamScoreMap = [mapText, team1NameText, team1ScoreText, team2NameText, team2ScoreText, team1StartingSide, team2StartingSide]
with open('match.csv', 'a', newline='') as f:
writer = csv.writer(f)
writer.writerow(teamScoreMap)
#Stats
table = table.findNext('div', {'class': 'vm-stats-game'})
rows = table.find_all('tr')
for row in rows:
cells = row.find_all('td')
if len(cells) >= 3:
playerteam = CleanString(cells[0].text).split(" ")
player, team = playerteam[0], playerteam[1]
if(player == 'gob' and team == 'b'):
player = 'gob-b'
team = playerteam[2]
for img in row.find_all('img', alt=True):
agent = CleanString(img['alt'])
ratings = CleanString(cells[2].text).split(" ")
ratingOverall = ratings[0]
acs = CleanString(cells[3].text).split(" ")
acsOverall = acs[0]
kills = CleanString(cells[4].text).split(" ")
killsOverall = kills[0]
deaths = CleanString(cells[5].text).split(" ")
deathsOverall = deaths[1]
assists = CleanString(cells[6].text).split(" ")
assistsOverall = assists[0]
kdDifference = CleanString(cells[7].text).split(" ")
kdDifferenceOverall = kdDifference[0]
kast = CleanString(cells[8].text).split(" ")
kastOverall = kast[0]
adr = CleanString(cells[9].text).split(" ")
adrOverall = adr[0]
hs = CleanString(cells[10].text).split(" ")
hsOverall = hs[0]
fk = CleanString(cells[11].text).split(" ")
fkOverall = fk[0]
fd = CleanString(cells[12].text).split(" ")
fdOverall = fd[0]
fkDifference = CleanString(cells[13].text).split(" ")
fkDifferenceOverall = fkDifference[0]
data = [player, team, agent, ratingOverall, acsOverall, killsOverall, deathsOverall, assistsOverall, kdDifferenceOverall, kastOverall, adrOverall, hsOverall, fkOverall, fdOverall, fkDifferenceOverall]
with open('match.csv', 'a', newline='') as f:
writer = csv.writer(f)
writer.writerow(data)
with open('match.csv', 'a', newline='') as f:
writer = csv.writer(f)
writer.writerow('-')
except:
keepGoing = 0
#Map 4 Stats
if(keepGoing):
try:
#Get Map
mapDiv = mapDiv.findNext('div', {'class': 'map'})
mapData = CleanString(mapDiv.text).split(" ")
mapText = mapData[0]
#Get Map Score
teamScoreDiv = teamScoreDiv.findNext('div', {'class': 'score'})
teamScoreData = CleanString(teamScoreDiv.text).split(" ")
team1ScoreText = teamScoreData[0]
teamScoreDiv = teamScoreDiv.findNext('div', {'class': 'score'})
teamScoreData = CleanString(teamScoreDiv.text).split(" ")
team2ScoreText = teamScoreData[0]
# Get if Team1 is on Attack or Defence in first half
roundsDiv = roundsDiv.findNext('div', {'class': 'vlr-rounds'})
sideDiv = roundsDiv.find('div', {'class': 'vlr-rounds-row-col'})
sideDiv = sideDiv.findNext('div', {'class': 'vlr-rounds-row-col'})
team2 = False
for div in sideDiv:
if("rnd-sq mod-win mod-ct" in str(div)):
if(team2):
sideText = 'T'
else:
sideText = 'CT'
elif("rnd-sq mod-win mod-t" in str(div)):
if(team2):
sideText = 'CT'
else:
sideText = 'T'
elif("rnd-sq" in str(div)):
team2 = True
team1StartingSide = sideText
if(team1StartingSide == 'CT'):
team2StartingSide = 'T'
elif(team1StartingSide == 'T'):
team2StartingSide = 'CT'
else:
team2StartingSide = 'NA'
teamScoreMap = [mapText, team1NameText, team1ScoreText, team2NameText, team2ScoreText, team1StartingSide, team2StartingSide]
with open('match.csv', 'a', newline='') as f:
writer = csv.writer(f)
writer.writerow(teamScoreMap)
#Stats
table = table.findNext('div', {'class': 'vm-stats-game'})
rows = table.find_all('tr')
for row in rows:
cells = row.find_all('td')
if len(cells) >= 3:
playerteam = CleanString(cells[0].text).split(" ")
player, team = playerteam[0], playerteam[1]
if(player == 'gob' and team == 'b'):
player = 'gob-b'
team = playerteam[2]
for img in row.find_all('img', alt=True):
agent = CleanString(img['alt'])
ratings = CleanString(cells[2].text).split(" ")
ratingOverall = ratings[0]
acs = CleanString(cells[3].text).split(" ")
acsOverall = acs[0]
kills = CleanString(cells[4].text).split(" ")
killsOverall = kills[0]
deaths = CleanString(cells[5].text).split(" ")
deathsOverall = deaths[1]
assists = CleanString(cells[6].text).split(" ")
assistsOverall = assists[0]
kdDifference = CleanString(cells[7].text).split(" ")
kdDifferenceOverall = kdDifference[0]
kast = CleanString(cells[8].text).split(" ")
kastOverall = kast[0]
adr = CleanString(cells[9].text).split(" ")
adrOverall = adr[0]
hs = CleanString(cells[10].text).split(" ")
hsOverall = hs[0]
fk = CleanString(cells[11].text).split(" ")
fkOverall = fk[0]
fd = CleanString(cells[12].text).split(" ")
fdOverall = fd[0]
fkDifference = CleanString(cells[13].text).split(" ")
fkDifferenceOverall = fkDifference[0]
data = [player, team, agent, ratingOverall, acsOverall, killsOverall, deathsOverall, assistsOverall, kdDifferenceOverall, kastOverall, adrOverall, hsOverall, fkOverall, fdOverall, fkDifferenceOverall]
with open('match.csv', 'a', newline='') as f:
writer = csv.writer(f)
writer.writerow(data)
with open('match.csv', 'a', newline='') as f:
writer = csv.writer(f)
writer.writerow('-')
except:
keepGoing = 0
#Map 5 Stats
if(keepGoing):
try:
#Get Map
mapDiv = mapDiv.findNext('div', {'class': 'map'})
mapData = CleanString(mapDiv.text).split(" ")
mapText = mapData[0]
#Get Map Score
teamScoreDiv = teamScoreDiv.findNext('div', {'class': 'score'})
teamScoreData = CleanString(teamScoreDiv.text).split(" ")
team1ScoreText = teamScoreData[0]
teamScoreDiv = teamScoreDiv.findNext('div', {'class': 'score'})
teamScoreData = CleanString(teamScoreDiv.text).split(" ")
team2ScoreText = teamScoreData[0]
# Get if Team1 is on Attack or Defence in first half
roundsDiv = roundsDiv.findNext('div', {'class': 'vlr-rounds'})
sideDiv = roundsDiv.find('div', {'class': 'vlr-rounds-row-col'})
sideDiv = sideDiv.findNext('div', {'class': 'vlr-rounds-row-col'})
team2 = False
for div in sideDiv:
if("rnd-sq mod-win mod-ct" in str(div)):
if(team2):
sideText = 'T'
else:
sideText = 'CT'
elif("rnd-sq mod-win mod-t" in str(div)):
if(team2):
sideText = 'CT'
else:
sideText = 'T'
elif("rnd-sq" in str(div)):
team2 = True
team1StartingSide = sideText
if(team1StartingSide == 'CT'):
team2StartingSide = 'T'
elif(team1StartingSide == 'T'):
team2StartingSide = 'CT'
else:
team2StartingSide = 'NA'
teamScoreMap = [mapText, team1NameText, team1ScoreText, team2NameText, team2ScoreText, team1StartingSide, team2StartingSide]
with open('match.csv', 'a', newline='') as f:
writer = csv.writer(f)
writer.writerow(teamScoreMap)
#Stats
table = table.findNext('div', {'class': 'vm-stats-game'})
rows = table.find_all('tr')
for row in rows:
cells = row.find_all('td')
if len(cells) >= 3:
playerteam = CleanString(cells[0].text).split(" ")
player, team = playerteam[0], playerteam[1]
if(player == 'gob' and team == 'b'):
player = 'gob-b'
team = playerteam[2]
for img in row.find_all('img', alt=True):
agent = CleanString(img['alt'])
ratings = CleanString(cells[2].text).split(" ")
ratingOverall = ratings[0]
acs = CleanString(cells[3].text).split(" ")
acsOverall = acs[0]
kills = CleanString(cells[4].text).split(" ")
killsOverall = kills[0]
deaths = CleanString(cells[5].text).split(" ")
deathsOverall = deaths[1]
assists = CleanString(cells[6].text).split(" ")
assistsOverall = assists[0]
kdDifference = CleanString(cells[7].text).split(" ")
kdDifferenceOverall = kdDifference[0]
kast = CleanString(cells[8].text).split(" ")
kastOverall = kast[0]
adr = CleanString(cells[9].text).split(" ")
adrOverall = adr[0]
hs = CleanString(cells[10].text).split(" ")
hsOverall = hs[0]
fk = CleanString(cells[11].text).split(" ")
fkOverall = fk[0]
fd = CleanString(cells[12].text).split(" ")
fdOverall = fd[0]
fkDifference = CleanString(cells[13].text).split(" ")
fkDifferenceOverall = fkDifference[0]
data = [player, team, agent, ratingOverall, acsOverall, killsOverall, deathsOverall, assistsOverall, kdDifferenceOverall, kastOverall, adrOverall, hsOverall, fkOverall, fdOverall, fkDifferenceOverall]
with open('match.csv', 'a', newline='') as f:
writer = csv.writer(f)
writer.writerow(data)
with open('match.csv', 'a', newline='') as f:
writer = csv.writer(f)
writer.writerow('-')
except:
keepGoing = 0
with open('match.csv', 'a', newline='') as f:
writer = csv.writer(f)
writer.writerow('/')
\ No newline at end of file
import requests
from bs4 import BeautifulSoup
import re
import csv
def ClearUrls():
f = open('urls.csv', 'w+')
f.close()
f = open('eventUrl.csv', 'w+')
f.close()
def GetUrls(urlToScrapeList):
for url in urlToScrapeList:
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
gameCodeList = []
#Get Urls on Page
for a in soup.find_all('a', href=True):
parsedLink = a['href'].split('/')
try:
if(parsedLink[1].isdigit()):
gameCodeList.append(parsedLink[1])
except:
pass
i = 0
while i<len(gameCodeList):
tempString = 'https://www.vlr.gg/'
tempString += gameCodeList[i]
with open('urls.csv', 'a', newline='') as f:
writer = csv.writer(f)
writer.writerow([tempString])
i += 1
def GetEvents(eventUrl):
response = requests.get(eventUrl)
soup = BeautifulSoup(response.text, 'html.parser')
eventCodeList = []
#Get Urls on Page
for a in soup.find_all('a', href=True):
parsedLink = a['href'].split('/')
try:
if(parsedLink[1] == 'event'):
eventCodeList.append(parsedLink[2])
except:
pass
i = 0
while(i < len(eventCodeList)):
tempString = 'https://www.vlr.gg/event/'
tempString += eventCodeList[i]
with open('eventUrl.csv', 'a', newline='') as f:
writer = csv.writer(f)
writer.writerow([tempString])
i += 1
\ No newline at end of file
https://www.vlr.gg/130678
https://www.vlr.gg/130679
https://www.vlr.gg/130680
https://www.vlr.gg/130681
https://www.vlr.gg/130682
https://www.vlr.gg/130683
https://www.vlr.gg/130684
https://www.vlr.gg/130685
https://www.vlr.gg/130686
https://www.vlr.gg/130687
https://www.vlr.gg/130688
https://www.vlr.gg/130689
https://www.vlr.gg/130690
https://www.vlr.gg/130691
https://www.vlr.gg/130685
https://www.vlr.gg/130691
https://www.vlr.gg/130690
https://www.vlr.gg/130684
https://www.vlr.gg/130688
https://www.vlr.gg/123859
https://www.vlr.gg/123860
https://www.vlr.gg/123861
https://www.vlr.gg/123862
https://www.vlr.gg/123863
https://www.vlr.gg/123864
https://www.vlr.gg/123865
https://www.vlr.gg/123866
https://www.vlr.gg/123867
https://www.vlr.gg/123868
https://www.vlr.gg/123869
https://www.vlr.gg/123870
https://www.vlr.gg/123871
https://www.vlr.gg/123871
https://www.vlr.gg/123865
https://www.vlr.gg/123870
https://www.vlr.gg/123868
https://www.vlr.gg/123869
https://www.vlr.gg/123322
https://www.vlr.gg/123323
https://www.vlr.gg/123324
https://www.vlr.gg/123325
https://www.vlr.gg/123326
https://www.vlr.gg/123327
https://www.vlr.gg/123328
https://www.vlr.gg/123329
https://www.vlr.gg/123330
https://www.vlr.gg/123331
https://www.vlr.gg/123332
https://www.vlr.gg/123333
https://www.vlr.gg/123334
https://www.vlr.gg/123335
https://www.vlr.gg/123329
https://www.vlr.gg/123335
https://www.vlr.gg/123334
https://www.vlr.gg/123328
https://www.vlr.gg/123333
https://www.vlr.gg/112600
https://www.vlr.gg/112601
https://www.vlr.gg/112602
https://www.vlr.gg/112603
https://www.vlr.gg/112604
https://www.vlr.gg/112605
https://www.vlr.gg/112606
https://www.vlr.gg/112607
https://www.vlr.gg/112608
https://www.vlr.gg/112609
https://www.vlr.gg/112610
https://www.vlr.gg/112611
https://www.vlr.gg/112612
https://www.vlr.gg/112613
https://www.vlr.gg/112607
https://www.vlr.gg/112613
https://www.vlr.gg/112612
https://www.vlr.gg/112606
https://www.vlr.gg/112611
https://www.vlr.gg/124195
https://www.vlr.gg/124196
https://www.vlr.gg/124197
https://www.vlr.gg/124198
https://www.vlr.gg/124199
https://www.vlr.gg/124200
https://www.vlr.gg/124201
https://www.vlr.gg/124202
https://www.vlr.gg/124203
https://www.vlr.gg/124204
https://www.vlr.gg/124205
https://www.vlr.gg/124206
https://www.vlr.gg/124207
https://www.vlr.gg/124208
https://www.vlr.gg/124202
https://www.vlr.gg/124208
https://www.vlr.gg/124207
https://www.vlr.gg/124201
https://www.vlr.gg/124206
https://www.vlr.gg/123033
https://www.vlr.gg/123034
https://www.vlr.gg/123037
https://www.vlr.gg/123035
https://www.vlr.gg/123038
https://www.vlr.gg/123036
https://www.vlr.gg/123041
https://www.vlr.gg/123042
https://www.vlr.gg/123047
https://www.vlr.gg/123050
https://www.vlr.gg/123039
https://www.vlr.gg/123040
https://www.vlr.gg/123043
https://www.vlr.gg/123044
https://www.vlr.gg/123045
https://www.vlr.gg/123046
https://www.vlr.gg/123048
https://www.vlr.gg/123049
https://www.vlr.gg/123050
https://www.vlr.gg/123049
https://www.vlr.gg/123048
https://www.vlr.gg/123047
https://www.vlr.gg/123046
https://www.vlr.gg/112320
https://www.vlr.gg/112321
https://www.vlr.gg/112322
https://www.vlr.gg/112323
https://www.vlr.gg/112324
https://www.vlr.gg/112325
https://www.vlr.gg/112326
https://www.vlr.gg/112327
https://www.vlr.gg/112328
https://www.vlr.gg/112329
https://www.vlr.gg/112330
https://www.vlr.gg/112331
https://www.vlr.gg/112332
https://www.vlr.gg/112334
https://www.vlr.gg/112327
https://www.vlr.gg/112334
https://www.vlr.gg/112332
https://www.vlr.gg/112326
https://www.vlr.gg/112330
https://www.vlr.gg/111758
https://www.vlr.gg/111759
https://www.vlr.gg/111762
https://www.vlr.gg/111765
https://www.vlr.gg/111760
https://www.vlr.gg/111761
https://www.vlr.gg/111763
https://www.vlr.gg/111764
https://www.vlr.gg/111765
https://www.vlr.gg/111764
https://www.vlr.gg/111763
https://www.vlr.gg/111762
https://www.vlr.gg/111761
https://www.vlr.gg/107065
https://www.vlr.gg/107065
https://www.vlr.gg/108002
https://www.vlr.gg/108003
https://www.vlr.gg/108004
https://www.vlr.gg/108005
https://www.vlr.gg/108006
https://www.vlr.gg/108007
https://www.vlr.gg/108005
https://www.vlr.gg/108007
https://www.vlr.gg/108004
https://www.vlr.gg/108006
https://www.vlr.gg/108003
https://www.vlr.gg/107143
https://www.vlr.gg/107144
https://www.vlr.gg/107435
https://www.vlr.gg/107436
https://www.vlr.gg/107737
https://www.vlr.gg/107743
https://www.vlr.gg/107142
https://www.vlr.gg/107141
https://www.vlr.gg/107739
https://www.vlr.gg/107740
https://www.vlr.gg/107741
https://www.vlr.gg/107742
https://www.vlr.gg/107743
https://www.vlr.gg/107742
https://www.vlr.gg/107741
https://www.vlr.gg/107737
https://www.vlr.gg/107740
https://www.vlr.gg/108234
https://www.vlr.gg/108235
https://www.vlr.gg/108236
https://www.vlr.gg/108237
https://www.vlr.gg/108238
https://www.vlr.gg/108239
https://www.vlr.gg/108240
https://www.vlr.gg/108241
https://www.vlr.gg/108242
https://www.vlr.gg/108243
https://www.vlr.gg/108239
https://www.vlr.gg/108243
https://www.vlr.gg/108238
https://www.vlr.gg/108242
https://www.vlr.gg/108241
https://www.vlr.gg/107023
https://www.vlr.gg/107024
https://www.vlr.gg/107025
https://www.vlr.gg/107026
https://www.vlr.gg/107529
https://www.vlr.gg/107525
https://www.vlr.gg/107527
https://www.vlr.gg/107528
https://www.vlr.gg/107530
https://www.vlr.gg/107526
https://www.vlr.gg/107525
https://www.vlr.gg/107526
https://www.vlr.gg/107530
https://www.vlr.gg/107529
https://www.vlr.gg/107527
https://www.vlr.gg/106910
https://www.vlr.gg/106911
https://www.vlr.gg/106912
https://www.vlr.gg/106913
https://www.vlr.gg/106914
https://www.vlr.gg/106915
https://www.vlr.gg/106920
https://www.vlr.gg/106923
https://www.vlr.gg/106916
https://www.vlr.gg/106917
https://www.vlr.gg/106918
https://www.vlr.gg/106919
https://www.vlr.gg/106921
https://www.vlr.gg/106922
https://www.vlr.gg/106923
https://www.vlr.gg/106922
https://www.vlr.gg/106921
https://www.vlr.gg/106920
https://www.vlr.gg/106919
https://www.vlr.gg/106159
https://www.vlr.gg/106160
https://www.vlr.gg/106161
https://www.vlr.gg/106162
https://www.vlr.gg/106166
https://www.vlr.gg/106167
https://www.vlr.gg/106171
https://www.vlr.gg/106173
https://www.vlr.gg/106164
https://www.vlr.gg/106165
https://www.vlr.gg/106168
https://www.vlr.gg/106169
https://www.vlr.gg/106170
https://www.vlr.gg/106172
https://www.vlr.gg/106173
https://www.vlr.gg/106172
https://www.vlr.gg/106171
https://www.vlr.gg/106170
https://www.vlr.gg/106169
https://www.vlr.gg/108010
https://www.vlr.gg/108011
https://www.vlr.gg/108012
https://www.vlr.gg/108013
https://www.vlr.gg/108014
https://www.vlr.gg/108015
https://www.vlr.gg/108016
https://www.vlr.gg/108017
https://www.vlr.gg/108018
https://www.vlr.gg/108019
https://www.vlr.gg/108015
https://www.vlr.gg/108019
https://www.vlr.gg/108018
https://www.vlr.gg/108014
https://www.vlr.gg/108017
https://www.vlr.gg/106424
https://www.vlr.gg/106425
https://www.vlr.gg/106426
https://www.vlr.gg/106426
https://www.vlr.gg/106424
https://www.vlr.gg/106425
https://www.vlr.gg/106421
https://www.vlr.gg/106422
https://www.vlr.gg/106423
https://www.vlr.gg/106423
https://www.vlr.gg/106421
https://www.vlr.gg/106422
https://www.vlr.gg/103100
https://www.vlr.gg/103101
https://www.vlr.gg/103102
https://www.vlr.gg/103103
https://www.vlr.gg/104926
https://www.vlr.gg/105267
https://www.vlr.gg/104868
https://www.vlr.gg/104869
https://www.vlr.gg/105091
https://www.vlr.gg/105269
https://www.vlr.gg/105267
https://www.vlr.gg/105269
https://www.vlr.gg/105091
https://www.vlr.gg/104926
https://www.vlr.gg/104868
https://www.vlr.gg/104969
https://www.vlr.gg/104970
https://www.vlr.gg/104973
https://www.vlr.gg/104971
https://www.vlr.gg/104972
https://www.vlr.gg/104974
https://www.vlr.gg/104974
https://www.vlr.gg/104972
https://www.vlr.gg/104971
https://www.vlr.gg/104973
https://www.vlr.gg/104970
https://www.vlr.gg/102786
https://www.vlr.gg/102787
https://www.vlr.gg/102784
https://www.vlr.gg/102785
https://www.vlr.gg/103223
https://www.vlr.gg/103226
https://www.vlr.gg/103221
https://www.vlr.gg/103222
https://www.vlr.gg/103224
https://www.vlr.gg/103225
https://www.vlr.gg/103226
https://www.vlr.gg/103225
https://www.vlr.gg/103223
https://www.vlr.gg/103224
https://www.vlr.gg/103221
https://www.vlr.gg/103233
https://www.vlr.gg/103234
https://www.vlr.gg/103235
https://www.vlr.gg/103236
https://www.vlr.gg/103999
https://www.vlr.gg/104383
https://www.vlr.gg/103628
https://www.vlr.gg/103629
https://www.vlr.gg/103998
https://www.vlr.gg/104382
https://www.vlr.gg/104383
https://www.vlr.gg/104382
https://www.vlr.gg/103998
https://www.vlr.gg/103999
https://www.vlr.gg/103628
https://www.vlr.gg/102842
https://www.vlr.gg/102843
https://www.vlr.gg/102844
https://www.vlr.gg/102845
https://www.vlr.gg/103015
https://www.vlr.gg/103018
https://www.vlr.gg/103013
https://www.vlr.gg/103014
https://www.vlr.gg/103016
https://www.vlr.gg/103017
https://www.vlr.gg/103018
https://www.vlr.gg/103017
https://www.vlr.gg/103016
https://www.vlr.gg/103015
https://www.vlr.gg/103014
https://www.vlr.gg/102849
https://www.vlr.gg/102850
https://www.vlr.gg/102853
https://www.vlr.gg/102854
https://www.vlr.gg/102856
https://www.vlr.gg/102858
https://www.vlr.gg/102851
https://www.vlr.gg/102852
https://www.vlr.gg/102855
https://www.vlr.gg/102857
https://www.vlr.gg/102858
https://www.vlr.gg/102857
https://www.vlr.gg/102855
https://www.vlr.gg/102856
https://www.vlr.gg/102852
https://www.vlr.gg/103079
https://www.vlr.gg/103080
https://www.vlr.gg/103081
https://www.vlr.gg/103082
https://www.vlr.gg/103217
https://www.vlr.gg/103220
https://www.vlr.gg/103215
https://www.vlr.gg/103216
https://www.vlr.gg/103218
https://www.vlr.gg/103219
https://www.vlr.gg/103220
https://www.vlr.gg/103219
https://www.vlr.gg/103218
https://www.vlr.gg/103217
https://www.vlr.gg/103216
https://www.vlr.gg/89237
https://www.vlr.gg/89238
https://www.vlr.gg/89239
https://www.vlr.gg/89240
https://www.vlr.gg/89241
https://www.vlr.gg/89242
https://www.vlr.gg/89243
https://www.vlr.gg/89244
https://www.vlr.gg/89245
https://www.vlr.gg/89246
https://www.vlr.gg/89242
https://www.vlr.gg/89246
https://www.vlr.gg/89245
https://www.vlr.gg/89241
https://www.vlr.gg/89243
https://www.vlr.gg/99466
https://www.vlr.gg/99467
https://www.vlr.gg/99468
https://www.vlr.gg/99469
https://www.vlr.gg/99472
https://www.vlr.gg/99473
https://www.vlr.gg/99476
https://www.vlr.gg/99479
https://www.vlr.gg/99470
https://www.vlr.gg/99471
https://www.vlr.gg/99474
https://www.vlr.gg/99475
https://www.vlr.gg/99477
https://www.vlr.gg/99478
https://www.vlr.gg/99479
https://www.vlr.gg/99478
https://www.vlr.gg/99477
https://www.vlr.gg/99476
https://www.vlr.gg/99475
https://www.vlr.gg/102091
https://www.vlr.gg/102092
https://www.vlr.gg/102094
https://www.vlr.gg/102089
https://www.vlr.gg/102090
https://www.vlr.gg/102093
https://www.vlr.gg/102094
https://www.vlr.gg/102092
https://www.vlr.gg/102091
https://www.vlr.gg/102093
https://www.vlr.gg/102090
https://www.vlr.gg/85523
https://www.vlr.gg/85526
https://www.vlr.gg/85525
https://www.vlr.gg/85524
https://www.vlr.gg/85527
https://www.vlr.gg/85528
https://www.vlr.gg/85529
https://www.vlr.gg/85530
https://www.vlr.gg/85531
https://www.vlr.gg/85532
https://www.vlr.gg/85533
https://www.vlr.gg/85534
https://www.vlr.gg/85535
https://www.vlr.gg/85536
https://www.vlr.gg/85530
https://www.vlr.gg/85536
https://www.vlr.gg/85535
https://www.vlr.gg/85529
https://www.vlr.gg/85534
https://www.vlr.gg/93275
https://www.vlr.gg/93276
https://www.vlr.gg/93294
https://www.vlr.gg/93290
https://www.vlr.gg/93290
https://www.vlr.gg/93294
https://www.vlr.gg/93275
https://www.vlr.gg/93276
https://www.vlr.gg/84504
https://www.vlr.gg/84505
https://www.vlr.gg/84506
https://www.vlr.gg/84507
https://www.vlr.gg/84508
https://www.vlr.gg/84509
https://www.vlr.gg/84510
https://www.vlr.gg/84511
https://www.vlr.gg/84512
https://www.vlr.gg/84512
https://www.vlr.gg/84511
https://www.vlr.gg/84508
https://www.vlr.gg/84510
https://www.vlr.gg/84509
https://www.vlr.gg/82602
https://www.vlr.gg/82602
https://www.vlr.gg/77808
https://www.vlr.gg/77809
https://www.vlr.gg/77810
https://www.vlr.gg/77811
https://www.vlr.gg/77812
https://www.vlr.gg/77813
https://www.vlr.gg/77814
https://www.vlr.gg/77815
https://www.vlr.gg/77816
https://www.vlr.gg/77817
https://www.vlr.gg/77813
https://www.vlr.gg/77817
https://www.vlr.gg/77812
https://www.vlr.gg/77816
https://www.vlr.gg/77815
https://www.vlr.gg/78791
https://www.vlr.gg/78792
https://www.vlr.gg/78794
https://www.vlr.gg/78797
https://www.vlr.gg/78793
https://www.vlr.gg/78796
https://www.vlr.gg/78797
https://www.vlr.gg/78796
https://www.vlr.gg/78794
https://www.vlr.gg/78793
https://www.vlr.gg/78792
https://www.vlr.gg/77785
https://www.vlr.gg/77786
https://www.vlr.gg/77787
https://www.vlr.gg/77788
https://www.vlr.gg/77789
https://www.vlr.gg/77790
https://www.vlr.gg/77791
https://www.vlr.gg/77792
https://www.vlr.gg/77793
https://www.vlr.gg/77794
https://www.vlr.gg/77795
https://www.vlr.gg/77796
https://www.vlr.gg/77797
https://www.vlr.gg/77798
https://www.vlr.gg/77792
https://www.vlr.gg/77798
https://www.vlr.gg/77797
https://www.vlr.gg/77791
https://www.vlr.gg/77796
https://www.vlr.gg/79073
https://www.vlr.gg/79074
https://www.vlr.gg/79075
https://www.vlr.gg/79076
https://www.vlr.gg/79077
https://www.vlr.gg/79078
https://www.vlr.gg/79079
https://www.vlr.gg/79080
https://www.vlr.gg/79081
https://www.vlr.gg/79082
https://www.vlr.gg/79078
https://www.vlr.gg/79082
https://www.vlr.gg/79081
https://www.vlr.gg/79077
https://www.vlr.gg/79079
https://www.vlr.gg/77527
https://www.vlr.gg/77528
https://www.vlr.gg/77529
https://www.vlr.gg/77530
https://www.vlr.gg/77531
https://www.vlr.gg/77532
https://www.vlr.gg/77533
https://www.vlr.gg/77541
https://www.vlr.gg/77534
https://www.vlr.gg/77535
https://www.vlr.gg/77537
https://www.vlr.gg/77538
https://www.vlr.gg/77539
https://www.vlr.gg/77540
https://www.vlr.gg/77541
https://www.vlr.gg/77540
https://www.vlr.gg/77539
https://www.vlr.gg/77533
https://www.vlr.gg/77538
https://www.vlr.gg/77428
https://www.vlr.gg/77429
https://www.vlr.gg/77430
https://www.vlr.gg/77431
https://www.vlr.gg/77434
https://www.vlr.gg/77437
https://www.vlr.gg/77432
https://www.vlr.gg/77433
https://www.vlr.gg/77435
https://www.vlr.gg/77436
https://www.vlr.gg/77437
https://www.vlr.gg/77436
https://www.vlr.gg/77435
https://www.vlr.gg/77434
https://www.vlr.gg/77433
https://www.vlr.gg/76231
https://www.vlr.gg/76232
https://www.vlr.gg/76233
https://www.vlr.gg/76234
https://www.vlr.gg/76235
https://www.vlr.gg/76236
https://www.vlr.gg/76237
https://www.vlr.gg/76238
https://www.vlr.gg/76240
https://www.vlr.gg/76241
https://www.vlr.gg/76242
https://www.vlr.gg/76243
https://www.vlr.gg/76244
https://www.vlr.gg/76245
https://www.vlr.gg/76238
https://www.vlr.gg/76245
https://www.vlr.gg/76244
https://www.vlr.gg/76237
https://www.vlr.gg/76243
https://www.vlr.gg/76440
https://www.vlr.gg/76439
https://www.vlr.gg/76441
https://www.vlr.gg/76441
https://www.vlr.gg/76440
https://www.vlr.gg/76439
https://www.vlr.gg/76271
https://www.vlr.gg/76272
https://www.vlr.gg/77049
https://www.vlr.gg/76273
https://www.vlr.gg/76274
https://www.vlr.gg/77122
https://www.vlr.gg/77122
https://www.vlr.gg/76274
https://www.vlr.gg/76273
https://www.vlr.gg/77049
https://www.vlr.gg/76272
https://www.vlr.gg/76437
https://www.vlr.gg/76436
https://www.vlr.gg/76438
https://www.vlr.gg/76438
https://www.vlr.gg/76437
https://www.vlr.gg/76436
https://www.vlr.gg/69957
https://www.vlr.gg/69958
https://www.vlr.gg/69959
https://www.vlr.gg/69960
https://www.vlr.gg/69961
https://www.vlr.gg/69962
https://www.vlr.gg/69964
https://www.vlr.gg/69963
https://www.vlr.gg/69964
https://www.vlr.gg/69963
https://www.vlr.gg/69962
https://www.vlr.gg/69961
https://www.vlr.gg/69960
https://www.vlr.gg/72067
https://www.vlr.gg/72068
https://www.vlr.gg/72069
https://www.vlr.gg/72070
https://www.vlr.gg/72073
https://www.vlr.gg/72076
https://www.vlr.gg/72071
https://www.vlr.gg/72072
https://www.vlr.gg/72074
https://www.vlr.gg/72075
https://www.vlr.gg/72076
https://www.vlr.gg/72075
https://www.vlr.gg/72074
https://www.vlr.gg/72073
https://www.vlr.gg/72071
https://www.vlr.gg/72359
https://www.vlr.gg/72360
https://www.vlr.gg/72361
https://www.vlr.gg/72362
https://www.vlr.gg/72363
https://www.vlr.gg/72364
https://www.vlr.gg/72362
https://www.vlr.gg/72364
https://www.vlr.gg/72361
https://www.vlr.gg/72363
https://www.vlr.gg/72360
https://www.vlr.gg/72870
https://www.vlr.gg/72871
https://www.vlr.gg/72872
https://www.vlr.gg/72873
https://www.vlr.gg/72876
https://www.vlr.gg/72877
https://www.vlr.gg/72881
https://www.vlr.gg/72883
https://www.vlr.gg/72874
https://www.vlr.gg/72875
https://www.vlr.gg/72878
https://www.vlr.gg/72879
https://www.vlr.gg/72880
https://www.vlr.gg/72882
https://www.vlr.gg/72883
https://www.vlr.gg/72882
https://www.vlr.gg/72880
https://www.vlr.gg/72881
https://www.vlr.gg/72878
https://www.vlr.gg/72968
https://www.vlr.gg/72969
https://www.vlr.gg/73923
https://www.vlr.gg/72970
https://www.vlr.gg/72971
https://www.vlr.gg/73924
https://www.vlr.gg/73924
https://www.vlr.gg/72971
https://www.vlr.gg/72970
https://www.vlr.gg/73923
https://www.vlr.gg/72969
https://www.vlr.gg/72325
https://www.vlr.gg/72324
https://www.vlr.gg/72326
https://www.vlr.gg/72327
https://www.vlr.gg/73365
https://www.vlr.gg/73366
https://www.vlr.gg/73868
https://www.vlr.gg/73870
https://www.vlr.gg/73367
https://www.vlr.gg/73368
https://www.vlr.gg/73851
https://www.vlr.gg/73849
https://www.vlr.gg/73867
https://www.vlr.gg/73869
https://www.vlr.gg/73870
https://www.vlr.gg/73869
https://www.vlr.gg/73867
https://www.vlr.gg/73868
https://www.vlr.gg/73851
https://www.vlr.gg/64811
https://www.vlr.gg/64812
https://www.vlr.gg/64813
https://www.vlr.gg/64814
https://www.vlr.gg/64815
https://www.vlr.gg/64816
https://www.vlr.gg/64817
https://www.vlr.gg/64818
https://www.vlr.gg/64819
https://www.vlr.gg/64820
https://www.vlr.gg/64821
https://www.vlr.gg/64822
https://www.vlr.gg/64823
https://www.vlr.gg/64824
https://www.vlr.gg/64818
https://www.vlr.gg/64824
https://www.vlr.gg/64823
https://www.vlr.gg/64817
https://www.vlr.gg/64822
https://www.vlr.gg/72863
https://www.vlr.gg/72864
https://www.vlr.gg/72865
https://www.vlr.gg/72865
https://www.vlr.gg/72864
https://www.vlr.gg/72863
https://www.vlr.gg/69754
https://www.vlr.gg/69755
https://www.vlr.gg/69756
https://www.vlr.gg/69757
https://www.vlr.gg/69760
https://www.vlr.gg/69761
https://www.vlr.gg/69764
https://www.vlr.gg/69767
https://www.vlr.gg/69758
https://www.vlr.gg/69759
https://www.vlr.gg/69762
https://www.vlr.gg/69763
https://www.vlr.gg/69765
https://www.vlr.gg/69766
https://www.vlr.gg/69767
https://www.vlr.gg/69766
https://www.vlr.gg/69765
https://www.vlr.gg/69764
https://www.vlr.gg/69763
https://www.vlr.gg/67695
https://www.vlr.gg/67696
https://www.vlr.gg/66778
https://www.vlr.gg/66779
https://www.vlr.gg/66780
https://www.vlr.gg/66781
https://www.vlr.gg/66782
https://www.vlr.gg/66783
https://www.vlr.gg/66784
https://www.vlr.gg/66785
https://www.vlr.gg/67400
https://www.vlr.gg/67401
https://www.vlr.gg/67402
https://www.vlr.gg/67403
https://www.vlr.gg/67575
https://www.vlr.gg/67576
https://www.vlr.gg/67697
https://www.vlr.gg/67696
https://www.vlr.gg/67695
https://www.vlr.gg/67697
https://www.vlr.gg/67576
https://www.vlr.gg/67575
https://www.vlr.gg/65230
https://www.vlr.gg/65231
https://www.vlr.gg/65232
https://www.vlr.gg/65233
https://www.vlr.gg/65234
https://www.vlr.gg/65235
https://www.vlr.gg/65236
https://www.vlr.gg/65237
https://www.vlr.gg/65238
https://www.vlr.gg/65239
https://www.vlr.gg/65240
https://www.vlr.gg/65241
https://www.vlr.gg/65242
https://www.vlr.gg/65243
https://www.vlr.gg/65244
https://www.vlr.gg/65237
https://www.vlr.gg/65243
https://www.vlr.gg/65242
https://www.vlr.gg/65244
https://www.vlr.gg/65236
https://www.vlr.gg/65297
https://www.vlr.gg/65298
https://www.vlr.gg/65299
https://www.vlr.gg/65300
https://www.vlr.gg/65301
https://www.vlr.gg/65302
https://www.vlr.gg/65303
https://www.vlr.gg/65310
https://www.vlr.gg/65304
https://www.vlr.gg/65305
https://www.vlr.gg/65306
https://www.vlr.gg/65307
https://www.vlr.gg/65308
https://www.vlr.gg/65309
https://www.vlr.gg/65689
https://www.vlr.gg/65310
https://www.vlr.gg/65309
https://www.vlr.gg/65308
https://www.vlr.gg/65689
https://www.vlr.gg/65307
https://www.vlr.gg/65282
https://www.vlr.gg/65283
https://www.vlr.gg/65284
https://www.vlr.gg/65285
https://www.vlr.gg/65286
https://www.vlr.gg/65287
https://www.vlr.gg/65288
https://www.vlr.gg/65289
https://www.vlr.gg/65290
https://www.vlr.gg/65291
https://www.vlr.gg/65292
https://www.vlr.gg/65293
https://www.vlr.gg/65294
https://www.vlr.gg/65294
https://www.vlr.gg/65288
https://www.vlr.gg/65293
https://www.vlr.gg/65291
https://www.vlr.gg/65292
https://www.vlr.gg/63616
https://www.vlr.gg/63617
https://www.vlr.gg/63618
https://www.vlr.gg/63619
https://www.vlr.gg/63620
https://www.vlr.gg/63621
https://www.vlr.gg/63622
https://www.vlr.gg/63624
https://www.vlr.gg/63625
https://www.vlr.gg/63626
https://www.vlr.gg/63627
https://www.vlr.gg/63628
https://www.vlr.gg/63629
https://www.vlr.gg/63629
https://www.vlr.gg/63622
https://www.vlr.gg/63628
https://www.vlr.gg/63626
https://www.vlr.gg/63627
https://www.vlr.gg/63641
https://www.vlr.gg/63642
https://www.vlr.gg/63643
https://www.vlr.gg/63644
https://www.vlr.gg/63645
https://www.vlr.gg/63646
https://www.vlr.gg/63647
https://www.vlr.gg/63648
https://www.vlr.gg/63649
https://www.vlr.gg/63650
https://www.vlr.gg/63651
https://www.vlr.gg/63652
https://www.vlr.gg/63653
https://www.vlr.gg/63654
https://www.vlr.gg/63690
https://www.vlr.gg/63648
https://www.vlr.gg/63654
https://www.vlr.gg/63653
https://www.vlr.gg/63690
https://www.vlr.gg/63647
https://www.vlr.gg/63579
https://www.vlr.gg/63580
https://www.vlr.gg/63581
https://www.vlr.gg/63582
https://www.vlr.gg/63583
https://www.vlr.gg/63584
https://www.vlr.gg/63585
https://www.vlr.gg/63586
https://www.vlr.gg/63587
https://www.vlr.gg/63588
https://www.vlr.gg/63589
https://www.vlr.gg/63590
https://www.vlr.gg/63591
https://www.vlr.gg/63592
https://www.vlr.gg/63688
https://www.vlr.gg/63586
https://www.vlr.gg/63592
https://www.vlr.gg/63591
https://www.vlr.gg/63688
https://www.vlr.gg/63589
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment