[PYTHON] Pourquoi mon code ne fonctionne pas

gr6jdgh5FG6R
2024-03-05 22:19:26

Le 05 mars 2024 à 22:18:05 :

Le 05 mars 2024 à 22:17:00 :

Le 05 mars 2024 à 22:14:00 :
Suffit d'interroger l'API cachée :

from __future__ import annotations

import httpx


def main() -> int:
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:123.0) Gecko/20100101 Firefox/123.0',
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3',
'DNT': '1',
'Sec-GPC': '1',
'Connection': 'keep-alive',
'Referer': 'https://www.atptour.com/en/players/roger-federer/f324/overview',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
}

params = {'v': '1'}
response = httpx.get('https://www.atptour.com/en/-/www/players/hero/f324', params=params, headers=headers)
print(response.text)
return 0


if __name__ == '__main__':
raise SystemExit(main())

ça règle pas le problème du 403

Je n'ai pas de 403.

Petit chanceuxhttps://image.noelshack.com/fichiers/2016/30/1469541952-risitas182.png

Guilgo
2024-03-05 22:22:35

Le 05 mars 2024 à 22:14:59 :

Le 05 mars 2024 à 22:10:56 :

Le 05 mars 2024 à 22:09:48 :

Le 05 mars 2024 à 22:08:34 :

Le 05 mars 2024 à 22:08:02 :

> Le 05 mars 2024 à 22:05:00 :

>> Le 05 mars 2024 à 22:04:34 :

> >> Le 05 mars 2024 à 22:04:08 :

> > >> Le 05 mars 2024 à 22:01:35 :

> > > >rajoute un print(page.status_code) pour voir si t'as autre chose que du 200

> > >

> > > 403

> >

> > tu dois rajouter des headers

>

> Explique moi avec des mots simples je suis une tanche

Ton URL mz donne 404, sinon 403 normalement c'est Forbidden donc t'as pas l'autorisation

donc impossible de faire du web scrapping sur ce site?

Tu peux, mais en chargeant la page dans un navigateur controle avec Python (comme Selenium/Playwright). C'est bien plus lourd, mais il y a pas 36 solutions.

bon bah je vais trouver un autre site qui me fournit les mêmes données

Honnetement, Playwright est pas si difficile a utiliser.

Tu vas te heurter au meme probleme avec tous ces sites: le contenu est charge avec du JS aussi pour empecher les petits malins a scraper comme tu souhaitais le faire :hap:

mouais

j'avais un script entier pour ce que je voulais avec lxml :(

je vais essayer Playwright mais je ne suis pas patient pour apprendre

Azerban
2024-03-05 22:23:59

Alcaraz fonctionne également :

from __future__ import annotations

from pprint import pprint

import httpx


def main() -> int:
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:123.0) Gecko/20100101 Firefox/123.0',
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3',
'DNT': '1',
'Sec-GPC': '1',
'Connection': 'keep-alive',
'Referer': 'https://www.atptour.com/en/players/carlos-alcaraz/a0e2/overview',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
}
params = {'v': '1'}
response = httpx.get('https://www.atptour.com/en/-/www/players/hero/a0e2', params=params, headers=headers)
pprint(response.json())
return 0


if __name__ == '__main__':
raise SystemExit(main())

Azerban
2024-03-05 22:26:58

Tu peux trouver la liste de tous les joueurs dans la sitemap : https://www.atptour.com/sitemap.xml

Suffit de scraper les urls avec ce pattern :

http://www.atptour.com/en/players/<player_name>/<player_id>/overview

Twed
2024-03-05 22:27:48

Harry Potter il parle le fourche langue je pense :(

Guilgo
2024-03-05 22:30:31

Le 05 mars 2024 à 22:23:59 :
Alcaraz fonctionne également :

from __future__ import annotations

from pprint import pprint

import httpx


def main() -> int:
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:123.0) Gecko/20100101 Firefox/123.0',
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3',
'DNT': '1',
'Sec-GPC': '1',
'Connection': 'keep-alive',
'Referer': 'https://www.atptour.com/en/players/carlos-alcaraz/a0e2/overview',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
}
params = {'v': '1'}
response = httpx.get('https://www.atptour.com/en/-/www/players/hero/a0e2', params=params, headers=headers)
pprint(response.json())
return 0


if __name__ == '__main__':
raise SystemExit(main())

ok ça marche mais je comprends rien

c'est quoi qui est renvoyé ? un Json?

Azerban
2024-03-05 22:31:15

Oui du json (un dictionnaire python). Enfin la je fais juste un pprint, si tu veux le renvoyer faut faire :

return response.json()

chasseurdetympe
2024-03-05 22:32:13

Demande à ChatGPT

Guilgo
2024-03-05 22:33:17

Le 05 mars 2024 à 22:31:15 :
Oui du json (un dictionnaire python). Enfin la je fais juste un pprint, si tu veux le renvoyer faut faire :

return response.json()

Ok et je peux le sortir dans un autre format ?

Comment je manipule un JSON avec Python? Genre si je veux sortir les infos dans un csv ?

Prob3corps2
2024-03-05 22:33:37

utilise Replit debugger panel, de rien

Guilgo
2024-03-05 22:34:11

Le 05 mars 2024 à 22:33:37 :
utilise Replit debugger panel, de rien

c'est quoi?

Azerban
2024-03-05 22:34:17

Tu peux utiliser le module csv de python et la classe DictWriter

https://docs.python.org/3/library/csv.html#csv.DictWriter

trevormickael57
2024-03-05 22:35:18

Je te up

Prob3corps2
2024-03-05 22:36:23

Le 05 mars 2024 à 22:34:11 :

Le 05 mars 2024 à 22:33:37 :
utilise Replit debugger panel, de rien

c'est quoi?

c'est un IDE, tu peux écrire ton code dessus, et tu cliques sur Run, ou tu passes au mode Debugger, il va te dire tout ce qui ne va pas

Guilgo
2024-03-05 22:37:41

Le 05 mars 2024 à 22:34:17 :
Tu peux utiliser le module csv de python et la classe DictWriter

https://docs.python.org/3/library/csv.html#csv.DictWriter

Et ça c'est pourquoi

if __name__ == '__main__':
raise SystemExit(main())

Fin chatGPT me dit que c'est pour éviter que le code soit éxécute quand j'utilise ce code comme module

ok mais j'ai jamais utilisé ça moi, c'est obligatoire ?

Azerban
2024-03-05 22:40:27

from __future__ import annotations

import csv
from collections.abc import MutableMapping

import httpx


def flatten_dict(d: MutableMapping, parent_key: str = '', sep: str ='.') -> MutableMapping:
items = []
for k, v in d.items():
new_key = parent_key + sep + k if parent_key else k
if isinstance(v, MutableMapping):
items.extend(flatten_dict(v, new_key, sep=sep).items())
else:
items.append((new_key, v))
return dict(items)


def main() -> int:
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:123.0) Gecko/20100101 Firefox/123.0',
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3',
'DNT': '1',
'Sec-GPC': '1',
'Connection': 'keep-alive',
'Referer': 'https://www.atptour.com/en/players/carlos-alcaraz/a0e2/overview',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
}
params = {'v': '1'}
response = httpx.get('https://www.atptour.com/en/-/www/players/hero/a0e2', params=params, headers=headers)
metadata = response.json()

filename = 'alcaraz.csv'

with open(filename, 'w') as f:
flat_dct = flatten_dict(metadata)
fieldnames = list(flat_dct.keys())
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
writer.writerow(flat_dct)
print(f'Write to {filename}')

return 0


if __name__ == '__main__':
raise SystemExit(main())

Guilgo
2024-03-05 22:42:24

Et comment tu as trouvé l'API ? Je peux lire tous le contenu de tout le site avec cette API?

Azerban
2024-03-05 22:43:59

Le 05 mars 2024 à 22:42:24 :
Et comment tu as trouvé l'API ? Je peux lire tous le contenu de tout le site avec cette API?

Tout le site je ne sais pas mais obtenir les métadonnées pour chaque joueur oui tu peux. Il te faut juste le player_id qui se trouve dans l'url

Guilgo
2024-03-05 22:52:11

Le 05 mars 2024 à 22:43:59 :

Le 05 mars 2024 à 22:42:24 :
Et comment tu as trouvé l'API ? Je peux lire tous le contenu de tout le site avec cette API?

Tout le site je ne sais pas mais obtenir les métadonnées pour chaque joueur oui tu peux. Il te faut juste le player_id qui se trouve dans l'url

ok merci c'est pas mal alors. J'ai déjà la liste de toutes les URL de tous les joueurs

j'aimerai faire tout le site, je vais tester ça

Guilgo
2024-03-05 22:56:03

mais t'as fais comment pour trouver cette API pour les joueurs ? ça existe pour les matchs ?

Infos
Gestion du forum

contact@geevey.com

API disponible. Utilisez le paramètre "api" en GET, peu importe le contenu, sur une page du site.

Notes

    ⚠️ Les archives de novembre sont désormais disponibles.
Non-assumage
    Personne n'a pas assumé de topic pour le moment.