Processus de Collecte de Données

Scraping pour albioccasion.com

TP1: Mise en place d'un processus de collecte de données

Développement d'un système complet de scraping pour collecter des données de voitures depuis https://www.albioccasion.com

🎯 Objectif

  • Scraper un site Web
  • Transformer les données en un format exploitable
  • Stocker les données dans une base de données

🌐 Source

  • Site web Albi.ca (https://www.albioccasion.com)

💾 Destination

  • Base de données SQLite
  • API REST pour accéder aux données

Caractéristiques du Processus

🏗️ Architecture Modulaire

  • Navigateur web (navigator.py) : Connexion et navigation
  • Extracteur de données (extractor.py) : Parsing HTML
  • Base de données (database.py) : Stockage et récupération
  • Scraper principal (scraper.py) : Orchestration
  • API REST (api.py) : Accès HTTP

🔧 Fonctionnalités

  • Connexion au site web
  • Gestion de la pagination
  • Détection des informations de la voiture
  • Standardisation des données
  • Gestion des doublons
  • Insertion des données dans la base de données

📊 Structure de la Base de Données (JSON)

{ "id": int, "make": str, "model": str, "year": int, "price": int, "mileage": int, "fuel": str, "location": str, "options": list[str], "detail_url": str }

Mise en Place

👨🎼 Orchestration

class AlbiScraper:
    def __init__(self):
        self.navigator = AlbiNavigator()
        self.database = AlbiDatabase()
                    
  • Responsable du processus de scraping
  • Contrôle la navigation et l'extraction des données
  • Gère l'insertion des données dans la base de données

🧭 Navigation

class AlbiNavigator:
    def __init__(self):
        self.base_url = "https://www.albioccasion.com"
        self.playwright = sync_playwright().start()
        self.browser = self.playwright.chromium.launch()
        self.page = self.browser.new_page()
                    
  • Responsable du navigateur
  • Contrôle de l'API Playwright

📤 Extraction des Données

class AlbiExtractor:
    def __init__(self):
        self.page = self.browser.new_page()
        self.soup = BeautifulSoup(self.page.content(), 'html.parser')
                    
  • Parsing HTML avec BeautifulSoup
  • Standardisation des données

📤 Base de Données

class CarDatabase:
    def __init__(self):
        self.conn = sqlite3.connect('cars.db')
        self.cursor = self.conn.cursor()
                    
  • Responsable de la base de données
  • Stockage des données

Comment Tester l'Application

🧪 Tests de Base

# Interface CLI
python -m car_scrapper.cli --start-page 1 --pages 2

# Afficher toutes les voitures
python -m car_scrapper.cli --show-all
                    

🌐 Tests API REST

# Démarrer le serveur
python server.py

# Tester les endpoints
curl "http://localhost:5000/api/cars"
curl "http://localhost:5000/api/stats"
                    

🔍 Tests Avancés

# Filtrage et pagination
curl "http://localhost:5000/api/cars?price_lt=30000&year_gt=2020"
curl "http://localhost:5000/api/cars?page=1&per_page=10"
curl "http://localhost:5000/api/cars?sort_by=price&sort_order=desc"
                    

Paramètres Principaux d'Exécution

5-6s
Temps par page
>80%
Taux de succès
12
Éléments/page (API)

📊 Paramètres de Collecte

  • Nombre de pages à scraper
  • Page de départ
  • Nombre de pages à scraper

💾 Paramètres de Stockage

  • Base SQLite (cars.db)
  • Gestion des doublons
  • Mises à jour automatiques
  • Format JSON pour options

🌐 Paramètres API

  • Port : 5000
  • Hôte : 0.0.0.0
  • Pagination : 20/max 50
  • Filtres multiples

Conclusion

🎯 Difficultés Rencontrées

  • Pagination dynamique : Analyse complexe du HTML
  • Détection carburant : Overlays gouvernementaux
  • Gestion timeouts : Pages JavaScript modernes
  • Beaucoup de site utilisent des techniques de protection contre le scraping sophistiquées

🚀 Compétences Acquises

  • Web Scraping avancé : Playwright + BeautifulSoup
  • Architecture modulaire : Séparation des responsabilités
  • Gestion BDD : SQLite avec optimisations
  • API REST : Endpoints complets
  • Gestion d'erreurs : Robustesse
  • Documentation

🔮 Améliorations Possibles

⚡ Parallélisation

Scraping multi-thread

📊 Monitoring

Métriques et logs détaillés

🔄 Scheduling

Collecte automatique périodique