[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
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()
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?
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 ?