La Coupe du monde 2022 commence et quel meilleur moyen d’apprendre la Data Science et Python que de résoudre un projet réel. Pour cela, nous devons commencer une étape de Web Scraping des matchs de football des coupes du monde ?
En effet, nous ne pouvons pas commencer un projet sans données, donc, dans ce guide, nous allons utiliser Python et Beautiful Soup pour extraire les données de toutes les coupes du monde jouées jusqu’à présent (1930-2018) et le tableau de la coupe du monde 2022.
Ce guide fait partie d’une série d’articles dans lesquels je tente de prédire le vainqueur de la Coupe du monde 2022 à l’aide de Python.
Installation des bibliothèques
Dans ce tutoriel, nous utiliserons bs4 pour explorer les sites Web, lxml pour analyser les documents HTML et requests pour envoyer des requêtes au site Web cible.
Voici la commande que tu dois exécuter dans le terminal pour installer ces bibliothèques.
pip install bs4 pip install lxml pip install requests
En plus des bibliothèques précédentes, nous allons installer pandas pour mieux gérer les données que nous allons extraire.
pip install pandas
Maintenant, commençons à coder !
Partie 1 : Récupérer les données d’une Coupe du Monde
Dans ce tutoriel, nous allons récupérer les données de toutes les coupes du monde disputées jusqu’à présent. Cela dit, pour rendre ce guide convivial, nous commencerons par extraire les données d’une seule coupe du monde – Brésil 2014.
Dans la deuxième partie, nous utiliserons le code écrit dans la première partie pour extraire les données de toutes les coupes du monde.
Importation des bibliothèques
Commençons par importer les bibliothèques que nous avons installées auparavant.
import pandas as pd from bs4 import BeautifulSoup import requests
Notez que nous n’avons pas besoin d’importer lxml puisqu’il s’agit seulement d’une dépendance dont bs4 a besoin pour fonctionner correctement.
Création d’une soup
Pour extraire des données avec Beautiful Soup, nous devons créer une soupe. Cette soupe utilise le parseur lxml que nous avons installé auparavant et aussi le contenu HTML qui sera analysé.
Pour obtenir le contenu HTML d’un site web, nous devons envoyer une requête au site web et ensuite obtenir le texte de la réponse.
web = 'https://en.wikipedia.org/wiki/2014_FIFA_World_Cup' response = requests.get(web) content = response.text soup = BeautifulSoup(content, 'lxml')
Extraction de tous les matchs de la Coupe du monde
Il est maintenant temps de scraper des matchs de football sur le web. Pour ce faire, nous devons identifier un modèle qui nous permette de récupérer non seulement un mais tous les matchs de la compétition.
Pour trouver facilement un modèle, nous devons d’abord inspecter le site Web en faisant un clic droit et en sélectionnant « Inspecter ». Ensuite, les outils de développement s’affichent. Tu peux naviguer dans le HTML en utilisant le bouton ci-dessous :
Voici un modèle que j’ai trouvé après avoir exploré le site Web.
Comme tu peux le voir, chaque match joué se trouve dans une ligne représentée par le nœud HTML surligné en bleu ci-dessus.
Maintenant, pour extraire tous les matchs de notre soup, nous devons utiliser la méthode .find_all. Cette méthode a besoin de 2 entrées : le nom du tag et le nom de la classe.
matches = soup.find_all('div', class_='footballbox')
J’ai stocké toutes les lignes dans une liste que j’ai appelée matches.
Extraction des équipes à domicile et à l’extérieur et des données relatives au score de chaque match.
Maintenant que nous avons tous les matches dans notre liste de matches, nous devons la parcourir en boucle pour extraire des informations spécifiques.
Dans ce cas, nous allons extraire les données relatives à l’équipe locale/extérieure et au score. Nous allons ensuite les stocker dans des listes vides, afin de pouvoir les placer plus tard dans une table.
Pour obtenir les données sur l’équipe locale, nous devons d’abord l’inspecter, puis copier le nom de l’étiquette et le nom de la classe. Il en va de même pour le score et l’équipe adverse.
Enfin, nous obtenons le texte d’un élément en utilisant .get_text.
home = [] score = [] away = [] for match in matches: home.append(match.find('th', class_='fhome').get_text()) score.append(match.find('th', class_='fscore').get_text()) away.append(match.find('th', class_='faway').get_text())
Stockage de nos données dans un DataFrame et exportation des données vers un fichier CSV
Les DataFrames sont utiles pour gérer les données en Python. Nous allons créer un DataFrame à partir des listes des matchs à domicile, des scores et des matchs à l’extérieur. En plus de cela, nous allons créer une colonne nommée « year » qui contiendra l’année de la coupe du monde (2014 pour ce cas particulier).
dict_football = {'home': home, 'score': score, 'away': away} df_football = pd.DataFrame(dict_football) df_football['year'] = 2014
Enfin, nous exportons le DataFramevers un fichier CSV.
df_fifa.to_csv("fifa_worldcup_historical_data.csv", index=False)
Partie 2 : Récupérer les données de TOUTES les Coupes du Monde
Maintenant que nous savons comment gratter une coupe du monde, il est temps de les gratter toutes ! Pour ce faire, nous devons d’abord trouver un modèle dans les liens.
Regardons les liens des coupes du monde 2014, 2018 et 2022.
https://en.wikipedia.org/wiki/2014_FIFA_World_Cup https://en.wikipedia.org/wiki/2018_FIFA_World_Cup https://en.wikipedia.org/wiki/2022_FIFA_World_Cup
As-tu remarqué le schéma ? Les liens sont identiques, sauf pour l’année où une coupe du monde a eu lieu.
Nous pouvons réécrire notre variable web pour prendre en compte ce modèle :
web = f'https://en.wikipedia.org/wiki/{year}_FIFA_World_Cup'
Et maintenant nous pouvons placer notre code dans une fonction qui prend en entrée l’année.
import pandas as pd from bs4 import BeautifulSoup import requests def get_matches(year): web = f'https://en.wikipedia.org/wiki/{year}_FIFA_World_Cup' response = requests.get(web) content = response.text soup = BeautifulSoup(content, 'lxml') matches = soup.find_all('div', class_='footballbox') home = [] score = [] away = [] for match in matches: home.append(match.find('th', class_='fhome').get_text()) score.append(match.find('th', class_='fscore').get_text()) away.append(match.find('th', class_='faway').get_text()) dict_football = {'home': home, 'score': score, 'away': away} df_football = pd.DataFrame(dict_football) df_football['year'] = year return df_football
Il est maintenant temps d’obtenir des données historiques de 1930 à 2018 en utilisant notre fonction get_matches.
years = [1930, 1934, 1938, 1950, 1954, 1958, 1962, 1966, 1970, 1974, 1978, 1982, 1986, 1990, 1994, 1998, 2002, 2006, 2010, 2014, 2018] # résultats : données historiques fifa = [get_matches(year) for year in years] df_fifa = pd.concat(fifa, ignore_index=True) df_fifa.to_csv("fifa_worldcup_historical_data.csv", index=False)
Nous pouvons également obtenir le calendrier de la prochaine (ou déjà passée en fonction du moment où tu lis cet article) Coupe du monde Qatar 2022.
df_fixture = get_matches(2022) df_fixture.to_csv('fifa_worldcup_fixture.csv', index=False)
Voilà, c’est fait ! Tu devrais maintenant avoir 2 fichiers CSV sur ton ordinateur. L’un contient les données historiques et l’autre les données de rencontres sportives.
Remarque : le premier fichier contient des données manquantes en raison d’incohérences dans le site Web de Wikipedia (cela a tendance à se produire dans les projets réels). On peut utiliser Selenium pour récupérer ces données manquantes.
Pour rappel, tu peux consulter le Web Scraping avec Pandas, qui est la version la plus facile d’extraire des données sur le web.