EYREIN PRODUCTS

Eyrein Products — Web Scraper & API

Python Logo Python 3.9+ Requests Logo Requests BeautifulSoup FLASK JSON PDF

Eyrein Products est un projet de scraping web qui automatise la collecte de fiches techniques et de sécurité pour les produits de nettoyage de l'entreprise Eyrein. Le projet combine scraping (BeautifulSoup/Requests), stockage (JSON), téléchargement (PDF), et exposition via API REST (Flask).

🎯 Objectifs du projet

  • Scraper la boutique Eyrein : Récupérer tous les produits de nettoyage du site
  • Extraire les métadonnées : Nom, référence (REF), URLs fiches techniques, fiches de sécurité, images
  • Structurer en JSON : Organiser par catégories avec relations produits
  • Télécharger les PDFs : Automatiser DL des fiches + images produit
  • Créer une API : Exposer données via Flask (JSON/HTML) pour site entreprise
  • Filtrer les produits utilisés : Endpoint privé (avec clé API) pour produits de l'entreprise

📐 Architecture & Structure

  • src/classes/ : OOP pour Product et Category (format_product, format_category)
  • src/functions.py : Scraping avec BeautifulSoup (get_page, get_element, get_all_pages, get_data_from_web)
  • downloading/download.py : Téléchargement PDFs + images + création ZIPs par produit
  • my_api/api.py : Flask app avec 3 endpoints (tous produits, un produit, mes produits)
  • src/CONST.py : Configuration (URLs, CSS selectors, chemins fichiers)
  • data/data.json : Base de données persistante (catégories + produits)

🕷️ Web Scraping (BeautifulSoup + Requests)

  • get_page(session, url) : Fetch HTTP + parsing BeautifulSoup
  • get_all_pages(session, url) : Détecte nombre total de pages (pagination) via selector '.pager a'
  • CSS Selectors : Cibles précises (ex: '.column.small-12.medium-6.large-4 a', '.product--title')
  • Déduplication : Set seen_products pour éviter doublons lors pagination
  • Extraction : Nom, REF (référence produit), URLs fiches tech/sécurité, image produit
  • Logging : Trace complète (succès / erreurs) en stdout + fichier
  • Session persistante : Requests.Session() pour header/cookies gérés
Fonction Python get_all_pages pour gerer la pagination du scraping
Fonction de pagination utilisee pendant le scraping pour parcourir toutes les pages produits.

📊 Modèle de données (JSON)

  • Category : { "Category Name", "Category URL", "Products": [...] }
  • Product : { "REF", "Name", "Url", "Tech Sheet" (PDF link), "Safety Sheet" (PDF link), "Image" }
  • Format : Array of categories, persisté en data/data.json
  • Hydratation : json_to_object() convertit JSON → instances Product/Category
Classe Product en Python pour structurer les donnees extraites
Modele objet Product utilise pour structurer les donnees avant export JSON.

📥 Pipeline de téléchargement (downloading/download.py)

  • construct_all_dirs() : Crée répertoire par produit utilisé (Produits-nettoyage/NomProduit/)
  • download_pdf(url, dest_path) : Stream-based PDF DL (chunks 8KB), gestion erreurs
  • Télécharge : Fiche technique PDF, fiche de sécurité PDF, image produit JPG
  • create_dirs() : Création répertoires parents récursifs
  • ZIP d'archive : Compresse fiches pour chaque produit (NomProduit_FICHES.zip)
  • Logging détaillé : Success/erreurs chaque téléchargement
Fonction Python de telechargement des fichiers PDF et gestion des erreurs
Pipeline de telechargement des fiches techniques et de securite avec gestion des erreurs.

🔌 API REST Flask

  • GET /products/format=json/ : Tous les produits en JSON formaté
  • GET /products/format=html/ : Rendu HTML avec CSS (catalogue produits)
  • GET /products/{REF}/format=json/ : Un produit par référence (JSON)
  • GET /products/{REF}/format=html/ : Fiche produit HTML (détails + liens)
  • GET /products/myproducts/key={API_KEY}/format=json/ : Produits filtrés (config USED_PRODUCTS_REF) — auth par clé
  • GET /products/myproducts/key={API_KEY}/format=html/ : Affichage HTML des produits entreprise
Route Flask GET products pour renvoyer les donnees en JSON ou HTML
Endpoint Flask de recuperation des produits avec prise en charge des formats JSON et HTML.

🔐 Sécurité & Configuration

  • API Key : Endpoint /myproducts nécessite key=MY_KEY (config USED_PRODUCTS_REF)
  • USED_PRODUCTS_REF : Liste blanche des références produits pour l'entreprise
  • Constants externalisées : CONST.py (URLs, selectors, paths) → maintenabilité
  • Exception Handling : Try/except systématique, logging errors
  • Path Abstraction : Pathlib pour chemins cross-platform

💡 Compétences démontrées

  • Web Scraping : BeautifulSoup (parsing HTML), CSS selectors, pagination
  • HTTP Requests : Sessions, stream downloads, retry logic, error handling
  • Python OOP : Classes Product/Category, méthodes de sérialisation
  • File I/O : JSON read/write (encoding UTF-8), PDF/image streaming
  • Flask REST : Routes, content negotiation (JSON/HTML), query params, auth
  • Automation : End-to-end pipeline (scrape → JSON → download → serve)
  • Logging & Debugging : Traces complètes pour troubleshooting
  • Code Organization : Séparation concerns (scraping, download, API)

🏢 Contexte réel (stage découverte)

  • Besoin entreprise : Centraliser fiches techniques/sécurité produits Eyrein
  • Automatisation : Évite collecte manuelle + mise à jour régulière
  • Distribution : API accessible (JSON/HTML) pour intégration site web
  • Traçabilité : JSON = source unique truth (versionnage Git possible)
  • Scalabilité : Facile ajouter produits / catégories

✨ Points clés

  • Requests.Session() : Gestion efficace connexions HTTP (pooling)
  • BeautifulSoup CSS selectors : Plus puissant que regex pour parsing HTML
  • Stream-based downloads : Gestion mémoire pour gros PDFs
  • Deduplication set() : O(1) lookup pour éviter doublons
  • JSON persistence : Format universel (JS, Python, PHP, etc.)
  • Flask routing : Format et content-negotiation via query params
  • Logging patterns : Structured logging (timestamp, level, message)

📚 Stack & Dépendances

  • requests : HTTP client moderne + sessions
  • beautifulsoup4 : Parsing HTML/XML + CSS selectors
  • flask : Micro-framework REST
  • Pathlib : File path abstraction (stdlib)
  • json : Sérialisation (stdlib)
  • logging : Structured logging (stdlib)
  • zipfile : Compression d'archives (stdlib)

Un projet end-to-end qui démontre ma capacité à automatiser des tâches répétitives : scraping, transformation données, téléchargement, exposition API. Production-ready avec gestion erreurs et logging.

GitHub Logo

➜ Voir aussi : CityEvents