From 9f1ff1ef7b7c8063d2aceac4c9c17c41f4361423 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20GUEZO?= Date: Tue, 10 Feb 2026 19:01:10 +0100 Subject: [PATCH] ajout(main.py): initialise la fonction getvin --- main.py | 72 ++++++++++++++++++++++++++------------------------------- 1 file changed, 33 insertions(+), 39 deletions(-) diff --git a/main.py b/main.py index a0a06c0..7c4a9d3 100644 --- a/main.py +++ b/main.py @@ -37,62 +37,44 @@ class _ScraperData: def prix(self) -> float: """ - Retourne le prix unitaire d'une bouteille (75cl). + Retourne le prix unitaire d'une bouteille (75cl). - Le JSON contient plusieurs formats de vente dans content["items"] : - - bouteille seule : nbunit = 1 et equivbtl = 1 -> prix direct - - caisse de plusieurs bouteilles : nbunit > 1 -> on divise le prix total - - formats spéciaux (magnum etc.) : equivbtl > 1 -> même calcul + Le JSON contient plusieurs formats de vente dans content["items"] : + - bouteille seule : nbunit = 1 et equivbtl = 1 -> prix direct + - caisse de plusieurs bouteilles : nbunit > 1 -> on divise le prix total + - formats spéciaux (magnum etc.) : equivbtl > 1 -> même calcul - Formule générale : - prix_unitaire = offerPrice / (nbunit * equivbtl) + Formule générale : + prix_unitaire = offerPrice / (nbunit * equivbtl) + """ - """ + content = self._getcontent() - content = self._getcontent() - - # si content n'existe pas -> erreur if content is None: raise ValueError("Contenu introuvable") - # On récupère la liste des formats disponibles (bouteille, carton...) items = content.get("items") - # Vérification que items est bien une liste non vide if not isinstance(items, list) or len(items) == 0: raise ValueError("Aucun prix disponible (items vide)") - # -------------------------- - # CAS 1 : bouteille unitaire - # -------------------------- - # On cherche un format où nbunit=1 et equivbtl=1 ->bouteille standard 75cl for item in items: - + if not isinstance(item, dict): continue - # On récupère les attributs du format attrs = item.get("attributes", {}) - # On récupère nbunit et equivbtl nbunit = attrs.get("nbunit", {}).get("value") equivbtl = attrs.get("equivbtl", {}).get("value") - # Si c'est une bouteille unitaire if nbunit == "1" and equivbtl == "1": - p = item.get("offerPrice") - # Vérification que c'est bien un nombre if isinstance(p, (int, float)): return float(p) - # -------------------------- - # CAS 2 : caisse ou autre format - # -------------------------- - # On calcule le prix unitaire à partir du prix total for item in items: - if not isinstance(item, dict): continue @@ -102,22 +84,12 @@ class _ScraperData: nbunit = attrs.get("nbunit", {}).get("value") equivbtl = attrs.get("equivbtl", {}).get("value") - # Vérification que toutes les valeurs existent if isinstance(p, (int, float)) and nbunit and equivbtl: - - # Calcul du nombre total de bouteilles équivalentes denom = float(nbunit) * float(equivbtl) - # Évite division par zéro if denom > 0: - - # Calcul du prix unitaire prix_unitaire = float(p) / denom - - # Arrondi à 2 décimales return round(prix_unitaire, 2) - - # Si aucun prix trouvé raise ValueError("Impossible de trouver le prix unitaire.") def appellation(self) -> str | None: @@ -186,7 +158,6 @@ class _ScraperData: return f"{appellation},{parker},{robinson},{suckling},{prix}" - class Scraper: """ Scraper est une classe qui permet de gerer @@ -322,3 +293,26 @@ class Scraper: return _ScraperData(cast(dict[str, object], current_data)) + +def getvins(subdir: str, n: int) -> None: + """_summary_ + + Args: + subdir (str): _description_ + n (int): nombre de page recherché + """ + scraper: Scraper = Scraper() + for i in range(1, n+1): + j = 0 + while True: + try: + var = scraper.getjsondata(subdir=f"{subdir}?page={i}").getdata()["initialReduxState"]["categ"]["content"]["products"][j]["seoKeyword"] + print(scraper.getjsondata(var).informations()) + j+=1 + except: + break + + print(f"--- fin {i}e page ---") +# https://www.millesima.fr/bordeaux.html?page=1 + +getvins("bordeaux.html", 1)