1. Présentation du projet
Julius (nom commercial) / Advanced Scraper (nom technique) est une application web full-stack conçue pour automatiser la prospection commerciale et la recherche de profils professionnels.
L'application permet aux utilisateurs de :
- Construire des requêtes de recherche avancées (Google Dorks, opérateurs booléens, filtres géographiques et par réseau social)
- Lancer des extractions automatisées pour récupérer des informations de contact (emails, téléphones, profils LinkedIn, etc.)
- S'appuyer sur un assistant IA pour générer des configurations de recherche optimisées selon leur profil métier
- Exporter les résultats aux formats CSV et XLSX
- Gérer leurs crédits, leur historique d'extractions et leur profil utilisateur
Le projet est structuré en monorepo avec un frontend React et un backend Python Flask, connectés à des services cloud (Supabase, APIs Google et OpenAI).
2. Objectifs de la solution
Problématique adressée
La prospection manuelle de leads est chronophage, répétitive et demande une maîtrise des techniques de recherche avancées (Google Dorks, ciblage LinkedIn, filtres booléens). Les équipes commerciales perdent du temps à construire des requêtes, parcourir les résultats et extraire manuellement les coordonnées.
Objectifs principaux
| Objectif | Description |
|---|---|
| Simplifier la recherche | Offrir une interface intuitive pour construire des requêtes complexes sans connaître la syntaxe Google Dorks |
| Automatiser l'extraction | Récupérer automatiquement noms, emails, téléphones et profils à partir des résultats de recherche |
| Optimiser avec l'IA | Proposer des configurations de recherche personnalisées via GPT-4o (AI Search Helper) |
| Monétiser l'usage | Contrôler la consommation via un système de crédits par utilisateur |
| Sécuriser les accès | Authentifier les utilisateurs, protéger les routes API et isoler les données par compte |
| Faciliter l'exploitation | Exporter les données dans des formats standards (CSV/XLSX) prêts à l'emploi |
3. Public cible
Julius s'adresse principalement à :
- Équipes commerciales (B2B / B2C) — prospection, génération de leads qualifiés, identification de décideurs
- Recruteurs et chasseurs de têtes — recherche de profils LinkedIn selon des critères précis (poste, localisation, secteur)
- Agences marketing et growth — campagnes de prospection ciblées par pays, secteur ou réseau social
- Freelances et consultants — recherche de clients potentiels sans outils enterprise coûteux
- Administrateurs de la plateforme — gestion des utilisateurs, rôles et crédits via un espace admin
Le produit est pensé pour des utilisateurs qui ont besoin de volume et de précision dans leur prospection, tout en conservant une interface accessible aux débutants grâce à l'assistant IA.
4. Fonctionnalités
4.1 Recherche avancée
- Saisie de mots-clés avec opérateurs booléens (AND, OR, NOT)
- Filtres par type de contenu (profils, documents, etc.)
- Filtres par réseau social (LinkedIn, Twitter, etc.)
- Filtres géographiques (pays, région, ville)
- Prévisualisation de la requête Google générée avant exécution
- Historique des recherches récentes
Implémentation : SearchForm.js, SearchResults.js — API /api/search
4.2 Extraction de contacts
- Lancement d'extractions à partir des résultats de recherche
- Extraction asynchrone en arrière-plan avec suivi de progression
- Données extraites : noms, emails, téléphones, entreprises, titres, URLs de profils
- Export CSV et XLSX
- Historique des extractions avec statuts (
pending,processing,completed,failed) - Téléchargement des fichiers générés
Implémentation : pages Extractions, Exports — API /api/extraction/*
4.3 AI Search Helper
Assistant IA intégré qui :
- Collecte le profil métier de l'utilisateur (secteur, objectif, client idéal, budget, etc.)
- Génère 3 à 5 configurations de recherche personnalisées via OpenAI GPT-4o
- Permet d'appliquer une suggestion en un clic sur le formulaire de recherche
- Enregistre les suggestions appliquées pour analyse ultérieure
Implémentation : AISearchHelper.js — API /api/ai/search-helper, /api/ai/apply-suggestion
4.4 LinkedIn Extract
Fonctionnalité dédiée à la recherche et l'extraction de profils LinkedIn :
- Filtres par mots-clés, localisation, secteur, entreprise, niveau d'expérience
- Extraction structurée (expérience, formation, compétences, coordonnées)
- Rotation de proxies pour limiter les blocages
- Export CSV / XLSX
4.5 Authentification et gestion des comptes
- Inscription et connexion par email / mot de passe
- Connexion Google OAuth
- Sessions JWT gérées par Supabase Auth
- Routes protégées côté frontend (
PrivateRoute) et backend (@require_auth) - Gestion du profil utilisateur et des paramètres (thème, langue, format d'export par défaut)
- Mode invité limité en cas de restrictions de stockage navigateur
4.6 Système de crédits
- Chaque utilisateur dispose d'un solde de crédits
- Les extractions consomment des crédits selon le volume de résultats
- Historique des transactions (
credit_history) - Page dédiée à la consultation et à la gestion des crédits
4.7 Administration
- Rôles utilisateur :
useretadmin - Gestion des rôles et des crédits utilisateurs
- Tableau de bord avec statistiques d'usage
4.8 Autres pages
| Page | Rôle |
|---|---|
| Landing page | Présentation produit, tarification, call-to-action |
| Dashboard | Vue d'ensemble de l'activité utilisateur |
| Search | Recherche et extraction principales |
| Profile / Settings | Paramètres du compte |
| Credits | Solde et consommation de crédits |
| Invite | Invitation d'utilisateurs |
| Admin | Espace administrateur |
5. Éléments techniques
5.1 Architecture globale
| Couche | Composants |
|---|---|
| Client | Frontend React (HTTPS + JWT Bearer vers l’API) |
| Backend | API REST Flask |
| Services | Supabase (PostgreSQL, Auth, Storage), Redis, Google Custom Search API, OpenAI API |
Flux typique :
- L'utilisateur s'authentifie via Supabase Auth (frontend)
- Le frontend envoie le JWT dans le header
Authorization: Bearer <token> - Le backend valide le token et exécute la logique métier
- Les résultats sont stockés en base Supabase et/ou exportés en fichiers
- Le frontend affiche les résultats et permet le téléchargement
5.2 Stack frontend
| Technologie | Usage |
|---|---|
| React 18 | Framework UI |
| Create React App + CRACO | Build et configuration (alias @/ → src/) |
| React Router v6 | Navigation et routes protégées |
| TailwindCSS | Styles utilitaires |
| Shadcn/ui + Radix UI | Composants UI accessibles (dialogs, tabs, toasts, etc.) |
| TanStack React Query | Cache et gestion des requêtes API |
| React Hook Form + Zod | Formulaires et validation |
| Axios | Client HTTP vers le backend |
| Supabase JS Client | Authentification et session |
| Heroicons / Lucide | Icônes |
Structure principale :
frontend/
├── src/
│ ├── components/ # UI, pages, navigation, auth
│ ├── contexts/ # AuthContext (session utilisateur)
│ ├── services/ # api.js, authService, supabase
│ ├── config/ # supabase.js, firebase.js (legacy)
│ └── App.js # Routes et providers
└── public/
5.3 Stack backend
| Technologie | Usage |
|---|---|
| Python 3.9+ / Flask 3 | API REST |
| Gunicorn | Serveur WSGI en production |
| Supabase Python Client | Base de données et auth |
| OpenAI SDK | AI Search Helper et extraction enrichie |
| Google Custom Search API | Recherche web et profils |
| BeautifulSoup / Selenium | Parsing et scraping |
| Pandas + openpyxl | Génération CSV / XLSX |
| Redis | Cache et sessions |
| Sentry | Monitoring des erreurs |
Structure principale :
backend/
├── app/
│ ├── routes/ # auth, search, extraction, ai, user, admin, export, storage, proxy
│ ├── services/ # scraper, export, supabase_auth, credit, cache
│ ├── decorators/ # require_auth, require_admin, require_credits
│ ├── middleware/ # auth_middleware, CORS
│ └── config/ # configuration et variables d'environnement
└── run.py # Point d'entrée Flask
5.4 Base de données (Supabase / PostgreSQL)
Tables principales :
| Table | Rôle |
|---|---|
users | Comptes, crédits, rôles, paramètres |
extractions | Historique et statut des extractions |
credit_history | Transactions de crédits |
ai_suggestions | Suggestions IA générées et appliquées |
proxies | Pool de proxies pour le scraping LinkedIn |
Contraintes notables : rôles (user / admin), crédits ≥ 0, statuts d'extraction contrôlés, clés étrangères vers users.
5.5 Authentification
- Service principal : Supabase Auth (JWT)
- Méthodes : email/mot de passe, Google OAuth
- Côté API : décorateur
@require_authvérifie le headerAuthorization: Bearer - Côté frontend :
AuthContext+PrivateRoutepour les pages protégées - Migration en cours : traces de Firebase Auth encore présentes (config legacy, colonne
firebase_uiden base)
5.6 APIs externes
| Service | Rôle |
|---|---|
| Google Custom Search API | Exécution des recherches web avancées |
| OpenAI (GPT-4o) | Génération de suggestions IA et enrichissement des extractions |
| Supabase | Auth, base de données PostgreSQL, stockage de fichiers |
5.7 Déploiement
| Composant | Hébergement | URL |
|---|---|---|
| Frontend | Netlify | https://astonishing-moxie-bd0351.netlify.app |
| Backend | Render (Frankfurt) | https://advanced-scraper.onrender.com |
| Base de données | Supabase Cloud | PostgreSQL managé |
| Cache | Redis Cloud | Sessions et cache |
Lancement local :
# Backend (port 8000 en dev si 5000 occupé)
cd backend && ./venv/bin/python run.py
# Frontend (port 3000)
cd frontend && npm start
Variables d'environnement requises : clés Supabase, Google API, OpenAI, etc. (voir .env et backend/.env).
5.8 Sécurité
- Authentification JWT sur toutes les routes sensibles
- Contrôle d'accès par rôles (RBAC : user / admin)
- CORS configuré avec liste blanche d'origines
- Validation des entrées côté client et serveur
- Système de crédits pour limiter les abus
- Row Level Security (RLS) côté Supabase
5.9 Points techniques remarquables
- Architecture async/sync hybride — routes Flask avec services asynchrones (OpenAI, Supabase)
- Extraction asynchrone — traitement en arrière-plan avec suivi de progression
- Compatibilité navigateur — gestion des restrictions de cookies/storage (mode restreint)
- Proxy rotation — pour les extractions LinkedIn à volume
- Monorepo — frontend et backend dans un même dépôt, scripts utilitaires à la racine

