Projet de web scraping d'Amazon réalisé dans le cadre du module de programmation Python.
Le web scraping, aussi appelé harvesting ou moissonnage, consiste à extraire automatiquement des données présentes sur un site web à l'aide d'un programme.
Dans ce projet, un robot ouvre les pages de résultats Amazon, repère les cartes des produits et récupère leurs informations (nom, prix, note, avis, livraison, image...). Les doublons sont retirés, les résultats peuvent être filtrés, analysés (statistiques, comparaison de marques, évolution des prix, graphiques), puis enregistrés dans des fichiers CSV et dans une base SQLite. Le programme se pilote depuis un menu console.
Attention : ce projet est pédagogique. Il faut respecter les conditions d'utilisation d'Amazon, son fichier
robots.txt, la législation applicable et limiter la fréquence des requêtes.
Ce projet sert à apprendre le web scraping, sur de petites quantités de données publiques. Le programme fait des pauses entre les actions pour ne pas surcharger le site. Les conditions d'utilisation d'Amazon encadrent la collecte automatique de données : il ne faut donc pas s'en servir à des fins commerciales ni republier les données et les images collectées.
Le projet est réalisé dans un cadre académique, dans le cadre du cours de Python. Aucune licence n'est définie pour le moment.
LIMITES DU PROJET
- Les conditions d'utilisation d'Amazon interdisent l'extraction automatisée : il faut garder de petits volumes, laisser plusieurs heures entre deux exécutions et ne pas utiliser les données hors d'un cadre d'étude.
- Si un CAPTCHA apparaît, le programme s'arrête et conserve les articles déjà récupérés. Il ne cherche pas à le contourner.
- Pour un usage réel, il faut préférer l'API officielle Product Advertising API d'Amazon.
STACK TECHNIQUE / OUTILS UTILISÉS
- Langage : Python 3 avec l'architecture MVC
- Navigateur automatisé : Firefox
- Bibliothèques externes :
selenium: ouverture du navigateur et recherche d'éléments HTML ;python-dotenv: lecture facultative d'un fichier.env;matplotlib: graphiques enregistrés en PNG.
- Outils intégrés à Python :
argparse,csv,sqlite3,dataclasses,re,unicodedata,statistics,urllib,socket,logging. - Gestion du code :
GitetGitHub(une branche par fonctionnalité, versionsmajeure.intermédiaire.mineure).
ARCHITECTURE DU PROJET
/Projet-1-WEB-SCRAPING
│
├── main.py # point d'entrée (menu ou ligne de commande)
├── config.py # réglages du programme
├── requirements.txt # dépendances Python
├── README.md # présentation du projet
├── .gitignore # fichiers exclus de Git
│
├── app/
│ ├── outils.py # normaliser, slugifier, vérifier internet
│ ├── journal.py # fichier de journal (logging)
│ ├── controllers/
│ │ └── controleur_scraping.py # orchestre scraping, filtres, export, base, menu
│ ├── models/
│ │ ├── produit.py # données d'un produit
│ │ ├── depot_produits.py # stockage en mémoire, doublons, filtre, exclusion
│ │ ├── statistiques.py # prix, comparaison de marques, variation
│ │ └── base_sqlite.py # base de données SQLite
│ ├── scraper/
│ │ ├── navigateur.py # création du navigateur Firefox
│ │ ├── extracteur.py # sélecteurs CSS et lecture d'un produit
│ │ ├── scraper_amazon.py # pilotage de la page Amazon
│ │ ├── telechargeur_images.py # téléchargement des images
│ │ └── erreurs.py # erreur de connexion
│ └── views/
│ ├── export_view.py # data.csv par catégorie et recap.csv
│ ├── graphique_view.py # graphiques PNG (matplotlib)
│ └── vue_console.py # menu et affichages dans le terminal
│
├── pages/ # pages HTML sauvegardées (ecouteurs.html = exemple)
└── data/ # résultats générés (ignorés par Git)
├── recap.csv # résumé de chaque catégorie scrapée
├── base_de_donnees/
│ └── produits.db # base SQLite (recherches et produits)
├── graphiques/ # graphiques PNG
├── journal/
│ └── scraping.log # journal des opérations et des erreurs
└── tech/
└── <categorie>/
├── data.csv # produits de la catégorie
└── images/ # images téléchargées
Les fichiers __init__.py ne sont pas listés pour garder le schéma lisible.
INSTALLATION & UTILISATION
git clone https://github.com/itsketii/Projet-1-WEB-SCRAPING.git
cd Projet-1-WEB-SCRAPING
py -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
Firefox doit également être installé sur l'ordinateur.
python main.py
Le menu propose :
- lancer un scraping à partir d'un mot-clé (nombre de pages, filtre, mots exclus et téléchargement des images au choix) ;
- analyser une page HTML déjà sauvegardée ;
- afficher les produits en mémoire ;
- afficher les statistiques (prix minimum, maximum, moyen, médian, promotions), comparer des marques et enregistrer un graphique ;
- consulter l'historique des recherches enregistrées dans la base SQLite ;
- suivre l'évolution du prix moyen d'un mot-clé entre plusieurs recherches et enregistrer un graphique ;
- afficher le journal des opérations.
python main.py "écouteurs sans fil"
Options disponibles :
| Option | Rôle |
|---|---|
--pages 2 |
nombre de pages de résultats à parcourir |
--filtre "iphone 18" |
ne garder que les produits dont le nom contient ces mots |
--exclure "coque etui" |
retirer les produits dont le nom contient l'un de ces mots |
--images |
télécharger l'image de chaque produit |
--local pages\ecouteurs.html |
travailler sur une page sauvegardée, sans requête vers Amazon |
Exemple, sans aucune requête vers Amazon :
python main.py "ecouteurs" --local pages\ecouteurs.html --filtre jbl --exclure filaire
Les produits en double (souvent des produits sponsorisés qui reviennent d'une page à l'autre) sont retirés automatiquement. Sans connexion internet, le programme affiche un message au lieu de planter.
Le projet fonctionne sans configuration. Pour modifier les réglages, créer un
fichier .env à la racine :
HEADLESS=false
DELAI_ATTENTE=15
DOSSIER_DATA=data
FAMILLE=tech
HEADLESS=truelance Firefox sans afficher sa fenêtre ;DELAI_ATTENTE=15attend au maximum 15 secondes les résultats ;DOSSIER_DATA=dataindique où enregistrer les résultats ;FAMILLE=techest le dossier de famille de produits dansdata/.
Le fichier .env est ignoré par Git. Le nombre de pages par défaut
(PAGES_MAX) et la pause entre deux pages (PAUSE_PAGES) se règlent dans
config.py.
RÉSULTATS
Pour chaque catégorie scrapée, les produits sont enregistrés dans
data/tech/<categorie>/data.csv (ouvrable avec Excel ou LibreOffice), les
images dans data/tech/<categorie>/images/, et la ligne de la catégorie est
mise à jour dans data/recap.csv. Toutes les recherches sont aussi conservées
dans la base data/base_de_donnees/produits.db, et les graphiques dans
data/graphiques/.
Le fichier data/journal/scraping.log garde la trace de chaque lancement :
pages lues, pages bloquées, erreurs de connexion, durées.
Si Amazon affiche un captcha ou une page bloquée, la page est sauvegardée avec
le suffixe _bloque.html et aucun produit n'est exporté.
DIFFICULTÉS RENCONTRÉES
- Les pages Amazon peuvent changer de structure, ce qui oblige à adapter les sélecteurs utilisés pour trouver les produits.
- Certains produits n'ont pas de prix, d'image ou d'autres informations disponibles.
- Les produits sponsorisés peuvent apparaître plusieurs fois et doivent être retirés avant l'enregistrement.
- Le chargement des pages peut être long ou interrompu par une page bloquée ou un CAPTCHA.
- La gestion des filtres, des exclusions, des statistiques, des graphiques et de l'historique a demandé de séparer correctement les responsabilités entre les modèles, les vues et le contrôleur.
AUTRICE
KOUADIO KETSIA
Licence 2 Informatique & Génie Logiciel, Institut Ivoirien de Technologie (IIT).
Projet réalisé dans le cadre du cours de Programmation Python.
