Extraction de données d'un site web

Résolu
Pierre - 21 mai 2024 à 22:31
mamiemando Messages postés 33367 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 19 novembre 2024 - 23 mai 2024 à 12:51

Bonjour,

Je souhaite créer un script python pour extraire toutes les données du site https://www.footmercato.net/ dont la position au classement du championnat des équipes (positions, nombre de points, goal average, buts marqués à domicile et à l'extérieur, buts encaissés à domicile et à l'extérieur, nombre de points à domicile et à l'extérieur) , les résultats des matchs précédents des équipes, le nombre de but du meilleur passeur et le nombre de passes du meilleur passeur décisif de chaque équipes et le classement de l'année précédente de chaque équipes qui se trouvent sur des pages différentes (voir même sur la même page mais en cliquant sur "Résultats" dans le calendrier des clubs).

J'ai beau réfléchir, impossible de trouver la solution...

Dois-je enregistrer toutes les pages de chaque donnée de tous les clubs dans le script scrapper ?

Existe-t-il un script peut faire ça automatiquement (lecture des données et scrappe) ?

J'ai entendu parler d'API mais elles sont extrêmement cher et je ne sais pas comment les utiliser.

Que me conseillez-vous ? Quelle méthode ou script puis-je utiliser s'il vous plaît ?

Merci par avance.

Cordialement
Linux / Chrome 125.0.0.0

A voir également:

2 réponses

yg_be Messages postés 23340 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 Ambassadeur 1 551
22 mai 2024 à 09:47

bonjour,

J'ignore si ce que tu comptes faire est autorisé par le site que tu prévois de visiter.

Quels sont ces API que tu mentionnes?

Lisant tes questions, je crois deviner que tu as peu d'expérience en programmation et que tu connais mal l'HTML.

Je te suggère alors, d'une part, d'apprendre à programmer en Python, et, d'autre part, d'étudier le code source HTML des pages que tu souhaites explorer.

1
mamiemando Messages postés 33367 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 19 novembre 2024 7 801
23 mai 2024 à 12:51

Bonjour,

Dois-je enregistrer toutes les pages de chaque donnée de tous les clubs dans le script scrapper ?

Uniquement les pages qui contiennent des données qui t'intéressent.

Existe-t-il un script peut faire ça automatiquement (lecture des données et scrappe) ?

Non, car la manière dont un site présente ses données est propre à lui-même.

J'ai entendu parler d'API mais elles sont extrêmement cher et je ne sais pas comment les utiliser.

Non, une API n'est pas forcément payante. C'est juste une manière d'exposer des données sous forme brut (en vue d'un traitement par un autre site/programme), ce qui évite d'avoir à disséquer une page web polluée par la mise en forme.

Que me conseillez-vous ? Quelle méthode ou script puis-je utiliser s'il vous plaît ?

Comme le dit yg_be, il faut d'abord avoir quelque bases en programmation python (installer python, écrire et lancer un programme python, etc).

Ensuite, il faut regarder comment le site est ficelé pour partir dans une bonne direction. Il est plus facile de manipuler les données provenant d'une API que celles contenues dans une page brut. Cela va définir dans les grandes lignes ce que tu seras amener à programmer.

Si on regarde le code, on voit qu'il y a une forme d'API. Par exemple, si inspecte cette page et qu'on cherche API, on voit que certaines balises contiennent un champ data-api.

<a role="button" class="table__buttonFilter " data-selectitem="1" data-filter="" data-target="#playerOverviewsTables" data-api="/player_overviews/seasons/2023/general?itemsPerPage=20&amp;enablePlayerRating=1&amp;order%5Bplayer.weight%5D=ASC">

On en déduit qu'il y a quelque chose à récupérer à l'adresse https://www.footmercato.net/player_overviews/seasons/2023/general?itemsPerPage=20&enablePlayerRating=1&order=0 et effectivement on voit alors un contenu HTML bien plus simple à parser.

Cela signifie que c'est ce genre de page simplifiées qu'on pourrait vouloir récupérer, par exemple avec le module requests. Pour extraire les données, tu peux utiliser beautifulsoup4. Et donc, tu l'auras compris, la dernière étape consiste à se familiariser avec ces modules (en cherchant des tutoriels, par exemple celui-ci, qui expliquent comment les utiliser et en regardant leur documentation).

Ensuite il peut être intéressant d'utiliser pandas, qui permettra de faciliter la manipulation des données. En outre, dans l'exemple considéré, le nom et le poste du joueur sont dans la même case. Dans le script ci-dessous, en passant par une DataFrame intermédiaire, je sépare le nom et le poste.

#!/usr/bin/env python3

import pandas as pd
import requests
from bs4 import BeautifulSoup
from pprint import pprint

URL = "https://www.footmercato.net/player_overviews/seasons/2023/general?itemsPerPage=20&enablePlayerRating=1&order=0"
r = requests.get(URL)
if r.status_code != 200:
    raise RuntimeError("Can't fetch {URL}, status {r.status_code}")
soup = BeautifulSoup(r.content, "html.parser")
table = soup.find(id="generalTable")
# print(soup.prettify())

headers = None
rows = list()
for row in table.findAll("tr"):
    ths = row.findAll("th")
    if ths:
        headers = [th.getText().strip(" \n.") for th in ths]
        print(headers)
    tds = row.findAll("td")
    if tds:
        values = [td.getText().strip(" \n.") for td in tds]
        if len(values) == len(headers):
            rows.append(values)
# pprint(headers)
# pprint(rows)

df = pd.DataFrame(data=rows, columns=headers)
df2 = df["Joueur"].str.split("\n", n=1, expand=True)
df2[1] = df2[1].str.strip()
df["Joueur"] = df2[0]
df["Poste"] = df2[1]
print(df)

Résultat :

['#', 'Moy', 'Joueur', 'Équipe', 'Sélection', 'Salaire', 'Val. der. trans', 'Fin contrat', 'Taille', 'Poids', 'Âge']
     # Moy                           Joueur          Équipe Sélection Salaire Val. der. trans Fin contrat Taille Poids   Âge           Poste
0    1   -               Bunyamin Cetinkaya       Kasımpaşa         -       -               -           -      -     -  13.2          Milieu
1    2   -             Pablo Capilla Rivera     La Gantoise         -       -               -           -      -     -  14.0       Défenseur
2    3   -                        Bas Evers     La Gantoise         -       -               -           -      -     -  14.0  Gardien de but
3    4   -                   Igor Pieprzyca         Puszcza         -       -               -           -    180     -  14.1          Milieu
4    5   -              Deniz Eren Dönmezer       Demirspor         -       -               -           -    190     -  14.2  Gardien de but
5    6   -            Borys Piotr Olszewski           Brann         -       -               -           -      -     -  14.3  Gardien de but
6    7   -                   Wesley Okoduwa   Wolverhampton         -       -               -           -      -     -  14.5       Attaquant
7    8   -  Jessi Rémy-Nzuzi Pedro Da Silva     Club Bruges         -       -               -           -      -     -  14.6       Attaquant
8    9   -                    Nick Kaulfers    Unterhaching         -       -               -           -      -     -  14.6          Milieu
9   10   -            Julian Zakrewski Hall        New York         -       -               -           -      -     -  14.7       Attaquant
10  11   -               Jędrzej Hanuszczak    Warta Poznań         -       -               -           -    176    70  14.7          Milieu
11  12   -                     Matteo Palma         Udinese         -       -               -           -    194     -  14.7       Défenseur
12  13   -                Francesco Camarda           Milan         -       -               -           -    184     -  14.7       Attaquant
13  14   -                       Igor Tyjon       Blackburn         -       -               -           -      -     -  14.7       Attaquant
14  15   -                 Hasanege Akdoğan      Ankaragücü         -       -               -           -      -     -  14.7       Attaquant
15  16   -                     Jorthy Mokio     La Gantoise         -       -               -           -      -     -  14.8       Défenseur
16  17   -            Matías Damián Acevedo          Racing         -       -               -           -    168    59  14.8          Milieu
17  18   -                   Ollie Dewsbury  Bristol Rovers         -       -               -           -      -     -  14.8          Milieu
18  19   -                  Jakub Zieliński           Legia         -       -               -           -    192     -  14.8  Gardien de but
19  20   -                    Ozan Demirbag       Demirspor         -       -               -           -    178     -  14.8       Attaquant

Bonne chance

1