Conception et Implémentation d'un Système d'Analyse de Données à Grande Échelle pour le Secteur des Véhicules à Énergie Nouvelle

Analyse des Besoins et Vue d'Ensemble du Système

Dans un marché automobile de plus en plus concurrentiel, l'exploitation intelligente des données volumineuses est devenue cruciale. Ce système a pour objectif de développer une plateforme intégrée pour la collecte, le traitement, l'analyse et la visualisation de données liées aux véhicules à énergie nouvelle. Il vise à assister les entreprises dans leur transformation numérique et à renforcer leur avantage concurrentiel.

La plateforme est conçue autour de plusieurs fonctionnalités clés : un tableau de bord administratif, la gestion des utilisateurs, la gestion des informations sur les véhicules, un forum automobile et la configuration système. Elle est développée dans un environnement Windows 10, en utilisant le langage Java avec le framework SpringBoot pour le back end, et une base de données MySQL pour le stockage et la gestion des données.

Collecte de Données par Web Scraping

Pour collecter des informations sur les véhicules de manière automatisée, un spider Scrapy a été développé. Il cible les sites de ventes automobiles et les portails constructeurs.

Voici un exemple de classe de spider Scapy, rebaptisée et restructurée :

class VehiculeSpider(scrapy.Spider):
    spider_identifier = 'vehicule_info_collector'
    target_url = 'https://cars.app.autohome.com.cn/carext/recrank/all/getrecranklistpageresult2?from=2&pm=2&pluginversion=11.58.5&model=1&channel=0&pageindex={}&pagesize=20&typeid=1&subranktypeid=1&levelid=0&price=0-9000&date=2024-03'
    url_list = target_url.split(";")
    scheme = ''
    netloc = ''
    is_realtime = False

    def parse_details(self, response):
        url_parts = urlparse(self.target_url)
        self.scheme = url_parts.scheme
        self.netloc = url_parts.netloc
        os_type = platform.system().lower()

        if not self.is_realtime and (os_type == 'linux' or os_type == 'windows'):
            db_conn = self.establish_db_connection()
            cursor = db_conn.cursor()
            if self.table_exists(cursor, 'vehicle_data_table') == 1:
                cursor.close()
                db_conn.close()
                self.process_temporary_data()
                return

        response_data = json.loads(response.body)
        try:
            items = response_data["result"]["list"]
        except KeyError:
            return

La méthode de callback analyse les pages de détail et extrait les champs pertinents, tels que la date de recommandation, le nom de la série, l'URL de l'image, le rang, le score, et la plage de prix. Chaque extraction est entourée d'une gestion des exceptions pour garantir la robustesse du scraping.

Prétraitement et Nettoyage des Données

Les données collectées subissent un processus de nettoyage rigoureux pour assurer leur qualité et leur cohérence. Ce processus implique la suppression des doublons, le traitement des valeurs manquantes et la normalisation des formats. La bilbiothèque Pandas est utilisée pour effectuer ces opérations sur les ensembles de données.

Exemple de fonction de nettoyage des données avec Pandas :

def nettoyer_donnees_vehicules(self):
    connection_string = 'mysql+pymysql://user:motdepasse@localhost/base_donnees_vehicules?charset=UTF8MB4'
    engine = create_engine(connection_string)
    df_vehicules = pd.read_sql('SELECT * FROM info_vehicules LIMIT 50', con=engine)

    # Suppression des lignes dupliquées
    df_vehicules.drop_duplicates(inplace=True)

    # Gestion des valeurs nulles
    df_vehicules.fillna(value='Donnée non disponible', inplace=True)

    # Filtrage des valeurs aberrantes pour les prix
    mask_prix = (df_vehicules['prix_estime'] >= 50000) & (df_vehicules['prix_estime'] <= 500000)
    df_vehicules_propres = df_vehicules[mask_prix].copy()

    return df_vehicules_propres

Une fonction utilitaire pour supprimer les balises HTML est également utilisée pour nettoyer les champs textuels récupérés.

def supprimer_balises_html(self, texte_html):
    if texte_html is None:
        return ''
    motif = re.compile(r'<[^>]+>', re.S)
    return motif.sub('', texte_html).strip()

Stockage des Données et Connexion à la Base

Les données nettoyées sont stockées dans une base de données MySQL. Une fonction générique gère la connexion, récupérant les paramètres (type de BDD, hôte, port, identifiants) à partir de la configuration. Pour MySQL, la bibliothèque PyMySQL est utilisée.

def get_db_connection(self):
    db_type = self.config.get('DB_TYPE', 'mysql')
    db_host = self.config.get('DB_HOST', 'localhost')
    db_port = int(self.config.get('DB_PORT', 3306))
    db_user = self.config.get('DB_USER', 'admin')
    db_password = self.config.get('DB_PASSWORD', 'secret123')
    db_name = self.config.get('DB_NAME', 'vehicules_db')

    if db_type == 'mysql':
        connection = pymysql.connect(host=db_host, port=db_port, db=db_name, user=db_user, passwd=db_password, charset='utf8')
    else:
        # Logique pour d'autres types de BDD
        pass
    return connection

Analyse et Visualisation des Données

Un tableau de bord administratif permet de visualiser les données analysées en temps réel. Il présente des graphiques sur les scores des véhicules, les tendances des prix, les statistiques de ventes par marque et par type, ainsi que des nuages de mots-clés pour les catégories de véhicules.

La visualisation est réalisée à l'aide de la bibliothèque JavaScript ECharts, intégrée dans l'application web. Pour le traitement et l'analyse des grands volumes de données, le système s'appuie sur des frameworks tels qu'Apache Spark pour le calcul distribué et Hadoop (HDFS/MapReduce) pour le stockage et le traitement distribué, garantissant ainsi la performance et la scalabilité.

Architecture du Système

L'application est construite sur une architecture MVC (Modèle-Vue-Contrôleur) et une architecture B/S (Navigateur/Serveur).

  • Couche Vue (Frontend) : Développée avec HTML, CSS et le framework Vue.js pour créer une interface utilisateur réactive et interactive.
  • Couche Contrôleur et Service (Backend) : Implémentée avec le framework Python Django. Django gère le routage, la logique métier et la communication avec la base de données.
  • Couche Accès aux Données (DAO) : Responsable des opérations CRUD avec la base de données MySQL, assurant la persistance des données.

Technologies Clés :

  • Backend : Django (Python)
  • Frontend : Vue.js
  • Base de Données : MySQL
  • Web Scraping : Scrapy (Python)
  • Traitement Big Data : Apache Spark, Hadoop
  • Visualisation : ECharts

Tests du Système

Des tests approfondis ont été conduits pour valider la fonctionnalité, la performance et la sécurité du système. Cela inclut des tests unitaires, d'intégration et de système.

Exemple de cas de test pour la fonctionnalité d'inscription/connexion :

Scénario Données d'Entrée Résultat Attendu Résultat Obtenu
Inscription réussie Nom d'utilisateur unique, mot de passe valide Compte créé Succès
Inscription - utilisateur existant Nom d'tuilisateur déjà pris Échec de l'inscription Échec
Connexion réussie Identifiants valides Accès au tableau de bord Succès
Connexion - mot de passe incorrect Mauvais mot de passe Échec de la connexion Échec

Les tests ont confirmé que le système répond aux exigences fonctionnelles, offre une performance acceptable, garantit la sécurité des données des utilisateurs et reste stable dans des conditions normales et d'erreur.

Étiquettes: Scrapy Apache Spark Python Django MySQL

Publié le 22 juin à 03h38