- Passage des requêtes DB en asynchrone dans improved_search_service pour éviter le blocage de l'Event Loop. - Ajout du Rapport d'Analyse Technique complet. - Sécurisation CORS (best effort). - Ajout Walkthrough et Implementation Plan.
5.6 KiB
Rapport d'Analyse Technique - PriceFlow
Date: 07 Janvier 2026 Analyste: Mary (Business Analyst) Application: PriceFlow (Backend & Scrapers)
1. Synthèse "Executive Summary"
L'application PriceFlow présente des fondations fonctionnelles solides pour le scraping e-commerce, utilisant des technologies modernes (Playwright, FastAPI, Browserless). L'architecture de scraping est particulièrement sophistiquée, utilisant des navigateurs persistants et des stratégies hybrides d'extraction (JSON-LD, CSS, IA).
Cependant, l'analyse révèle des failles de sécurité critiques (clés API exposées) et des problèmes de performance structurels (blocage de la boucle événementielle asynchrone par la base de données) qui doivent être corrigés avant tout passage en production.
2. Analyse Sécurité 🚨 (CRITIQUE)
🔴 Failles Critiques
-
Exposition de Secrets (Hardcoded Secrets) :
- Fichier :
docker-compose.yml - Problème : La clé
OPENROUTER_API_KEYest écrite en clair. - Risque : Utilisation frauduleuse du quota, surcoût financier immédiat.
- Action requise : Révoquer la clé immédiatement et utiliser un fichier
.env.
- Fichier :
-
Identifiants par Défaut :
- Fichier :
docker-compose.yml - Problème :
POSTGRES_PASSWORD=priceflowest utilisé. - Risque : Compromission triviale de la base de données si le port 5488 est exposé (ce qui est le cas dans la config actuelle).
- Fichier :
-
CORS Permissif (Cross-Origin Resource Sharing) :
- Fichier :
main.py - Problème :
allow_origins=["*"](ou via variable d'env par défaut). - Risque : Permet à n'importe quel site malveillant d'interroger l'API s'il est visité par un utilisateur authentifié (CSRF/Data Exfiltration).
- Fichier :
🟠 Risques Modérés
-
Migrations Manuelles Hardcodées :
- Fichier :
main.py - Problème : Utilisation de
CREATE TABLEvia des chaînes SQL brutes au démarrage. - Risque : Difficile à maintenir, risque d'erreur humaine et d'injection si les chaînes étaient dynamiques.
alembicest installé mais non utilisé pour l'initialisation.
- Fichier :
-
CSP Browserless désactivé :
- Le service Browserless désactive explicitement la Content Security Policy (
bypass_csp: true). C'est nécessaire pour le scraping mais nécessite que le conteneur soit strictement isolé du réseau interne sensible.
- Le service Browserless désactive explicitement la Content Security Policy (
3. Analyse Efficience ⚡
✅ Points Forts
- Browserless Persistant : L'utilisation de
async_playwrightavec une connexion WebSocket persistante vers Browserless (BrowserlessService) est excellente. Cela évite le coût énorme du lancement de processus Chrome pour chaque requête. - Streaming SSE : L'endpoint de recherche (
/api/search) utilise les Server-Sent Events, permettant une UX réactive même si le scraping est lent.
⚠️ Problèmes de Performance (Blocking I/O)
- Mélange Synchrone/Asynchrone Dangereux :
- Fichier :
app/services/improved_search_service.py(et autres routeurs) - Détection : La fonction
search_productsest définie avecasync def, mais elle effectue des appels base de données synchrones :db.query(SearchSite)...all(). - Impact : Ceci bloque la boucle d'événements (Event Loop) de FastAPI. Pendant que la base de données répond, aucune autre requête API ne peut être traitée. Sous charge, cela effondrera les performances.
- Solution : Utiliser
run_in_threadpoolpour les appels DB synchrones ou migrer versSQLAlchemy AsyncSession.
- Fichier :
4. Analyse Efficacité & Fonctionnalités 🎯
✅ Points Forts
- Stratégie de Scraping Robuste ("ImprovedSearchService") :
- Le code implémente une stratégie en "couches" très intelligente :
- JSON-LD (Structuré, très fiable).
- IA Extraction (Fallback puissant si configuré).
- Sélecteurs CSS Stricts (Meta tags, ID connus).
- Sélecteurs CSS Flous (Recherche du prix le plus bas, détection de mots clés "HT/TTC").
- Cette redondance garantit un taux de succès élevé.
- Le code implémente une stratégie en "couches" très intelligente :
- Gestion des Anti-Bots :
- Rotation des User-Agents.
- Injection de scripts "Stealth" (masquage de
navigator.webdriver). - Gestion automatique des popups (CMP/Cookies).
⚠️ Améliorations Possibles
- Gestion des Erreurs :
- Les exceptions sont souvent capturées génériquement (
except Exception: pass). Cela peut masquer des changements structurels sur les sites cibles.
- Les exceptions sont souvent capturées génériquement (
5. Qualité du Code 📝
✅ Points Positifs
- Utilisation du typage statique (Type Hints) généralisée.
- Utilisation de
ruffpour le linting. - Code modulaire (Routeurs / Services / Schémas).
⚠️ Dette Technique
- God Classes :
BrowserlessService(~700 lignes) etImprovedSearchService(~950 lignes) cumulent trop de responsabilités (gestion navigateur, parsing, logique métier).- Il serait préférable de séparer le "BrowserManager" des "Parsers".
- Duplication de Code :
- Redondance entre
browserless_service.pyetimproved_search_service.pysur l'initialisation et la gestion des popups.
- Redondance entre
Recommandations Prioritaires
- IMMÉDIAT (Sécurité) : Passer
OPENROUTER_API_KEYet les mots de passe DB dans un fichier.env. - COURT TERME (Performance) : Corriger les appels DB bloquants dans les routes
async. - MOYEN TERME (Code) : Refactoriser pour éliminer la duplication entre les services de scraping.