Web Scraping avec Python : Extraction de Données Livres
Découvrez un pipeline ETL pour automatiser l'extraction de données web. Apprenez le scraping avec Python, BeautifulSoup et Requests pour générer des fichiers CSV.
Projet : Scraping de livres – Books to Scrape
Formation OpenClassrooms – Parcours Développeur d'Application Python
Python | Requests | BeautifulSoup | CSV
Objectifs du Projet
Extraire les informations produits de tous les livres
Parcourir et extraire toutes les catégories automatiquement
Gérer la pagination des résultats
Générer un fichier CSV distinct par catégorie
Mettre en place un pipeline ETL (Extract, Transform, Load)
Vue d'ensemble de l'application
1. Accès Accueil
2. Extraction Catégories
3. Parcours Catégorie
4. Scraping Livres
5. Sauvegarde CSV/Img
Application modulaire orchestrée par <b>main.py</b> et divisée en phases.
Architecture & Structure des fichiers
project/ │ ├── main.py ├── phase1.py ├── phase2.py ├── phase3.py ├── phase4.py ├── scraper_utils.py ├── requirements.txt ├── .gitignore │ └── scraped_data/ ├── csv/ │ ├── Travel.csv │ └── ... │ └── images/ ├── book_001.jpg └── ...
✅ <b>Orchestration :</b> main.py<br>✅ <b>Logique :</b> Phases 1 à 4<br>✅ <b>Outils :</b> scraper_utils.py (DRY)
Architecture : Une approche structurée
Principe DRY (Don't Repeat Yourself)
<li style='margin-bottom: 20px;'>📉 Limiter la duplication de code</li><li style='margin-bottom: 20px;'>🛠 Faciliter la maintenance</li><li>📖 Améliorer la lisibilité</li>
Architecture Modulaire
Une approche décentralisée où chaque fonction et chaque module a un rôle défini.
Chaque composant possède une responsabilité claire et unique.
Modulaire
<ul style='padding-left: 20px; margin: 0;'> <li style='margin-bottom: 15px;'><strong>Phases indépendantes</strong> : <br>Files <code>phase1</code> à <code>phase4</code> séparés</li> <li style='margin-bottom: 15px;'><strong>Responsabilité unique</strong> : <br>Chaque fichier a un rôle précis</li> <li><strong>Code réutilisable</strong> et facile à tester</li> </ul>
Orchestré
<ul style='padding-left: 20px; margin: 0;'> <li style='margin-bottom: 15px;'><strong>Pilote unique</strong> : <br><code>main.py</code> ne "travaille" pas, il gère</li> <li style='margin-bottom: 15px;'><strong>Menu utilisateur</strong> : <br>Coordination interactive des phases</li> <li><strong>Séparation</strong> entre la logique métier et l'exécution</li> </ul>
Centralisé (DRY)
<ul style='padding-left: 20px; margin: 0;'> <li style='margin-bottom: 15px;'><strong>scraper_utils.py</strong> : <br>Centralise les fonctions communes</li> <li style='margin-bottom: 15px;'><strong>Pas de répétition</strong> : <br>Respect du principe DRY</li> <li><strong>Maintenance aisée</strong> : <br>Une modification se propage partout</li> </ul>
Pipeline ETL et Architecture
EXTRACT
Récupération brute (Requests, BS4) depuis le site web.
TRANSFORM
Nettoyage et structuration des données.
LOAD
Sauvegarde en CSV et téléchargement des images.
Le pipeline ETL du projet est directement lié à cette architecture modulaire. Chaque étape du pipeline correspond à des responsabilités clairement identifiées et isolées dans le code (fases 1 à 4).
EXTRACT (Extraction)
<ul><li>Extraction gérée par <b>phase1.py</b> à <b>phase4.py</b>.</li><li>Fonctions d'extraction centralisées dans <b>scraper_utils.py</b>.</li><li>Orchestration globale via <b>main.py</b>.</li></ul>
<ul><li>Utilisation de <b>requests</b> (HTML) et <b>BeautifulSoup</b> (Parsing).</li><li>Extraction ciblée : <b>Catégories, URLs, Infos produits</b>.</li></ul>
soup = BeautifulSoup(response.content, 'html.parser') product_page = soup.find('article', class_='product_page')
Gestion des champs manquants
<li><b>Vérification systématique</b> des balises HTML avant accès.</li><li><b>Valeur par défaut ("N/A")</b> si une donnée est absente.</li><li><b>Continuité garantie</b> : Le pipeline ne plante pas sur une erreur.</li>
Étape 2 : TRANSFORM (Nettoyage)
Objectif : Rendre les données propres et exploitables.
URL Relatives ➔ URL Absolues
Nettoyage et Gestion des descriptions manquantes
Structuration via Dictionnaire Python
Étape 3 : LOAD (Chargement)
Sauvegarde structurée pour usage Data / BI.
📂 Fichiers CSV<br><span style='font-size:22px; color: #7f8c8d'>Un fichier par catégorie.<br>En-têtes conformes.<br>Compatible Excel/Pandas.</span>
🖼️ Images<br><span style='font-size:22px; color: #7f8c8d'>Téléchargement local.<br>Nommage cohérent.<br>Dossier séparé.</span>
Données Extraites (Champs)
Product Page URL
Universal Product Code (UPC)
Title
Price Including Tax
Price Excluding Tax
Number Available
Product Description
Category
Review Rating
Image URL
Démonstration Live
1. Lancement : python scraper.py<br>2. Logs temps réel dans le terminal<br>3. Vérification des sorties CSV et Images
$ python scraper.py > Start scraping... > Category: Travel | Books found: 11 > Processing: It's Only the Himalayas... > Saved: scraped_data/csv/Travel.csv > Category: Mystery | Books found: 32 > ... > Done.
Conclusion & Améliorations
✅ Bonnes Pratiques
• Environnement virtuel utilisé<br>• Conformité stricte aux consignes (champs)<br>• Code modulaire et commenté
🚀 Améliorations Futures
• Gestion asynchrone (aiohttp) pour la vitesse<br>• Stockage en base de données (SQLite/PostgreSQL)<br>• Interface graphique ou Logs avancés
- python
- web-scraping
- beautifulsoup
- etl
- data-extraction
- csv
- automation
- openclassrooms
