Extraction de données d'un site web
Résolumamiemando 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
- Extraction de données d'un site web
- Site de telechargement - Accueil - Outils
- Site comme coco - Accueil - Réseaux sociaux
- Création site web - Guide
- Web office - Guide
- Site de vente en ligne particulier - Guide
2 réponses
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.
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&enablePlayerRating=1&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