Rejoindre le Discord →
9 octobre 2026 6 min de lecture API Scraping

Veille tendances mode Vinted : script Python pour extraire prix et marques

Pour construire un outil de veille sur Vinted, interrogez l’endpoint `/api/v1/vinted/search` avec une URL de catalogue pré-filtrée. Ce script Python extrait les champs `brand`, `price` et `size` pour structurer vos données dans un format exploitable immédiatement.

Interface d'extraction de données pour la surveillance des prix sur une marketplace de mode
GET
Méthode requise
Bearer
Authentification
8 champs
Données retournées par item

Configuration de l'environnement et authentification

La sécurisation de l'infrastructure commence par la gestion rigoureuse des identifiants et le choix des bibliothèques HTTP. Vous devez installer requests via votre environnement virtuel standard, car il offre un contrôle précis sur les en-têtes et la persistance des sessions. La clé API, générée une seule fois dans votre tableau de bord LeBonDeal, ne doit jamais être hardcodée ni commitée dans le code source. Elle s'injecte impérativement via les variables d'environnement pour éviter toute exposition accidentelle lors du déploiement ou du partage de scripts.

En pratique : Une clé perdue nécessite une révocation immédiate et la génération d'un nouveau jeton depuis l'espace client.

import os
import requests

BASE_URL = os.environ.get("LEBONDEAL_BASE_URL", "https://bot.lebondeal-bot.fr")
API_KEY = os.environ["LEBONDEAL_API_KEY"]
VINTED_ENDPOINT = "/api/v1/vinted/search"

def get_vinted_trends(url: str) -> dict:
    headers = {"Authorization": f"Bearer {API_KEY}"}
    
    try:
        response = requests.get(
            url=f"{BASE_URL}{VINTED_ENDPOINT}",
            params={"url": url},
            headers=headers,
            timeout=45
        )
        
        if response.status_code == 429:
            print("Limite de débit atteinte. Attendez avant de réessayer.")
            return None
            
        if response.status_code != 200:
            err = response.json().get('error', 'unknown')
            raise Exception(f"Erreur API ({response.status_code}): {err}")

        data = response.json()
        
        # Vérification des crédits restants
        credits_remaining = data.get("credits_remaining")
        if not credits_remaining:
             print("Attention : champ credits_missing manquant dans la réponse.")
             
        return data
        
    except requests.exceptions.Timeout:
        print("Timeout serveur (45s). Réessayez plus tard.")
        return None
    except Exception as e:
        print(f"Erreur critique : {e}")
        return None

if __name__ == "__main__":
    # Exemple d'appel avec une URL de catalogue Vinted filtrée
    catalog_url = "https://www.vinted.fr/catalog?search_text=jackie+oates&brand_id[]=123" 
    results = get_vinted_trends(catalog_url)
    
    if results:
        print(f"Annonces trouvées : {results.get('count')}")

Ce script initialise la connexion en chargeant dynamiquement les identifiants depuis le système d'exploitation. Il utilise requests pour envoyer une requête GET vers l'endpoint Vinted avec un timeout de 45 secondes, nécessaire face aux latences potentielles du scraping externe. La gestion des erreurs capture spécifiquement le code 429 (rate limiting) et les exceptions réseau, tout en validant la présence des champs critiques comme credits_remaining. Pour plus de détails sur l'intégration technique, consultez la documentation Vinted.

Construction de la requête Vinted

L'API LeBonDeal ne reconstruit pas vos filtres de recherche. Vous devez copier l'URL exacte du catalogue depuis votre navigateur après avoir appliqué les critères de veille. Cette contrainte technique découle de la complexité des requêtes internes aux marketplaces et garantit que vous récupérez exactement ce qu'un utilisateur verrait à cet instant.

Pour construire la bonne URL, suivez cette procédure :

  • Naviguez vers Vinted France ou le pays cible.
  • Appliquez vos filtres (catégorie, taille, couleur, état).
  • Copiez l'URL complète dans la barre d'adresse.

L'argument url doit être passé tel quel en paramètre GET de votre requête vers l'endpoint Vinted. Ne modifiez pas les paramètres de page ou de tri, car ils sont gérés par le crawler serveur.

En pratique : Les URL contenant des caractères spéciaux doivent être correctement encodées (URL encoding) avant d'être intégrées dans votre script Python pour éviter les erreurs 400 invalid_url.

Script complet d'extraction et nettoyage des données

Le script suivant illustre l'appel direct à l'endpoint Vinted, en respectant strictement le protocole d'authentification par bearer token. Il intègre un timeout de 45 secondes, nécessaire car les incidents temporaires peuvent prolonger la latence serveur au-delà des standards habituels.

En pratique : La clé API ne doit jamais être exposée dans le code source ni versionnée.

import os
import requests
from urllib.parse import urljoin

BASE_URL = os.environ.get("LEBONDEAL_BASE_URL", "https://bot.lebondeal-bot.fr")
API_KEY = os.environ["LEBONDEAL_API_KEY"]

def fetch_vinted_trends(url: str):
    headers = {"Authorization": f"Bearer {API_KEY}"}
    
    # Gestion des erreurs de connexion et timeout étendu (45s)
    try:
        response = requests.get(
            urljoin(BASE_URL, "/api/v1/vinted/search"),
            params={"url": url},
            headers=headers,
            timeout=45
        )
        
        # Gestion des limites de taux et erreurs serveur
        if response.status_code == 429:
            print("Erreur : limite de débit atteinte. Réessayez plus tard.")
            return None
            
        if response.status_code != 200:
            error_data = response.json()
            raise Exception(f"API Error ({response.status_code}): {error_data.get('message')}")

        data = response.json()
        
        # Nettoyage : conversion du prix "15.0 EUR" en float pour analyse
        items_raw = data.get("items", [])
        cleaned_items = []
        for item in items_raw:
            price_str = item.get("price", "")
            try:
                # Extraction simple de la valeur numérique avant l'espace et la devise
                price_val = float(price_str.split()[0])
            except (ValueError, IndexError):
                price_val = 0.0
            
            cleaned_items.append({
                "id": item.get("id"),
                "title": item.get("title"),
                "brand": item.get("brand"),
                "size": item.get("size"),
                "price_cleaned": price_val,
                "status": item.get("status")
            })

        print(f"Extraction terminée. {len(cleaned_items)} articles traités.")
        return cleaned_items

    except requests.exceptions.Timeout:
        raise Exception("Timeout : la requête a dépassé 45 secondes.")
    except requests.exceptions.RequestException as e:
        raise Exception(f"Erreur réseau : {e}")

# Exemple d'utilisation avec une URL de catalogue Vinted filtrée
if __name__ == "__main__":
    # Remplacez par votre URL de catalogue Vinted configurée dans le navigateur
    catalog_url = "https://www.vinted.fr/catalog?search_text=nic&brand_id=123" 
    try:
        results = fetch_vinted_trends(catalog_url)
        if results:
            for r in results[:5]: # Affichage des 5 premiers résultats pour vérification
                print(f"- {r['title']} | Marque: {r['brand']} | Prix: {r['price_cleaned']:.2f}€")
    except Exception as e:
        print(e)

Ce code exécute la requête GET, gère le timeout potentiellement long et transforme le prix en chaîne numérique pour l'analyse. La conversion du champ price (format "15.0 EUR") en float permet d'alimenter directement des outils de statistiques ou de visualisation sans traitement supplémentaire complexe côté client.

Analyse structurelle : marques et tailles

Les champs brand et size constituent les piliers de l'analyse structurelle sur Vinted. Contrairement au prix, qui fluctue selon la négociation ou l'état du vêtement, ces deux attributs définissent le segment de marché cible. Une veille efficace ne se limite pas à relever les coûts moyens ; elle doit identifier les ruptures d'équilibre entre l'offre (marque/taille) et la demande implicite via le prix.

Pour extraire une valeur pertinente, vous devez croiser ces données sur un échantillon statistique significatif. Un seul listing ne permet pas de dégager une tendance fiable en raison des anomalies (ventes forcées, erreurs de saisie). L'agrégation des résultats renvoyés par l'endpoint Vinted vous donne accès à la distribution réelle du marché.

Voici les points clés à surveiller lors du nettoyage :

  • Normalisation de la marque : Les vendeurs utilisent souvent des abréviations ou des fautes d'orthographe (ex. : "Zara", "ZAARA", "zara"). Appliquez une normalisation en minuscules et supprimez les espaces superflus avant l'agrégation.
  • Granularité de la taille : Le champ size peut contenir des valeurs standardisées (S, M, L) ou spécifiques ("38", "EU 42"). Si votre analyse vise une comparaison inter-catégories, mappez ces valeurs vers un code universel pour éviter les biais.
  • Corrélation prix/marque : Calculez le prix médian par marque et par taille. Une marque de niche avec peu d'offres mais des prix élevés indique souvent une demande forte non satisfaite ou un marché de collectionneurs.
En pratique : Ignorez les listings dont la taille est vide ou générique (ex. : "Taille unique") si votre algorithme repose sur le dimensionnement précis, car ces données introduisent du bruit dans vos modèles prédictifs.

Déployer votre veille sur le marché

Activez l'accès à l'API Vinted et configurez vos filtres de recherche directement depuis votre tableau de bord.

Découvrir l'API LeBonDealLire la documentation

Gestion des erreurs et limites techniques

Lorsque vous interrogez l’endpoint Vinted via notre API, une réponse HTTP 503 avec l’erreur unexpected_error peut provenir de deux causes distinctes : un échec technique persistant ou une recherche légitimement vide. Le serveur ne distingue pas ces scénarios côté client pour des raisons architecturales et de confidentialité des données sources.

Il est donc impossible de déterminer par le seul code retour si l’absence d’annonces résulte d’une absence réelle sur la plateforme ou d’un problème de connexion aux serveurs cibles. Cette indistinction technique implique une stratégie de reprise spécifique pour ne pas fausser vos statistiques de veille.

Lorsqu’une requête échoue avec ce statut, aucun crédit n’est débité (credits_charged reste à 0). Vous pouvez donc réessayer sans crainte financière immédiate, mais vous devez intégrer un mécanisme de détection robuste :

  • Vérifiez systématiquement le champ error dans la réponse JSON.
  • Si l’erreur est unexpected_error, considérez que les données sont indisponibles pour cet instant T.
  • N’utilisez pas ce code d’état comme indicateur de marché vide (zero results).
En pratique : Pour une veille fiable, associez cette vérification à un délai d’attente croissant entre les tentatives plutôt qu’à une logique conditionnelle basée sur le statut HTTP seul.

Notez également que la durée de traitement peut varier significativement. En cas de réessais internes silencieux côté serveur pour résoudre des incidents temporaires, une requête normale peut s’étendre jusqu’à 40 secondes. Il est impératif de configurer votre client HTTP avec un timeout d’au moins 45 secondes pour éviter les interruptions prématurées qui ne sont pas gérées par l’API comme des échecs complets mais comme des timeouts réseau classiques, potentiellement facturables si la requête a été traitée partiellement avant coupure.

Pour comprendre comment ces erreurs s’intègrent dans votre consommation globale et vos limites de débit spécifiques à cette source, consultez les détails techniques sur la documentation Vinted.

FAQ

Comment analyser plusieurs tailles simultanément sur Vinted ?

L'API ne filtre pas par taille dans la réponse. Vous devez récupérer les annonces via l’URL de catalogue et traiter le champ `size` côté client pour isoler les données souhaitées.

L'API retourne-t-elle toutes les pages de résultats Vinted ?

Non, cet endpoint ne renvoie que la première page des résultats disponibles sur l’URL fournie, sans paramètre de pagination supplémentaire.

Quelle durée d'attente est recommandée pour une requête API ?

Configurez un timeout client d'au moins 45 secondes pour absorber les délais liés aux tentatives silencieuses en cas d’incident serveur.

Peut-on récupérer l'historique des prix via cet endpoint ?

L’endpoint ne fournit que les données courantes des annonces visibles et n’accède pas à l’historique des variations de prix passées.

Articles liés