ProspectLab utilise un systeme de scraping unifie et complet qui extrait automatiquement toutes les informations pertinentes d'un site web en une seule passe.
-
Analyse Excel : Extraction des informations de base des entreprises
- Nom, adresse, telephone, categorie
- Detection du site web
- Sauvegarde en base de donnees
-
Scraping complet : Extraction detaillee (tache Celery separee)
- Emails (avec contexte et page source)
- Personnes (nom, titre, email, telephone)
- Telephones (avec page source)
- Reseaux sociaux (Facebook, LinkedIn, Twitter, Instagram, YouTube, etc.)
- Technologies (frameworks, CMS, analytics, hebergement)
- Images (avec dimensions et alt text)
- Metadonnees (titre, description, favicon, logo, OpenGraph)
-
Mise a jour temps reel : WebSocket pour suivre la progression
- Compteurs par categorie (emails, personnes, telephones, etc.)
- Affichage du site en cours de scraping
- Progression globale (X/Y entreprises)
Le UnifiedScraper est le moteur central qui orchestre toute l'extraction :
from services.unified_scraper import UnifiedScraper
scraper = UnifiedScraper(
base_url='https://example.com',
max_workers=5, # Nombre de threads paralleles
max_depth=3, # Profondeur de navigation
max_time=300, # Temps max en secondes
max_pages=50, # Nombre max de pages
progress_callback=callback_function # Callback pour progression
)
results = scraper.scrape(){
'emails': [
{'email': 'contact@example.com', 'page_url': 'https://...', 'context': '...'},
...
],
'people': [
{
'name': 'Jean Dupont',
'title': 'Directeur',
'email': 'jean.dupont@example.com',
'phone': '+33 1 23 45 67 89',
'page_url': 'https://...'
},
...
],
'phones': [
{'phone': '+33 1 23 45 67 89', 'page_url': 'https://...'},
...
],
'social_links': {
'facebook': ['https://facebook.com/...'],
'linkedin': ['https://linkedin.com/company/...'],
'twitter': ['https://twitter.com/...'],
...
},
'technologies': {
'cms': ['WordPress 6.4'],
'frameworks': ['React 18.2'],
'analytics': ['Google Analytics'],
'hosting': ['OVH'],
...
},
'images': [
{
'url': 'https://example.com/image.jpg',
'alt': 'Description',
'width': 1920,
'height': 1080,
'page_url': 'https://...'
},
...
],
'metadata': {
'title': 'Titre du site',
'description': 'Description du site',
'icons': {
'favicon': 'https://example.com/favicon.ico',
'logo': 'https://example.com/logo.png',
'og_image': 'https://example.com/og-image.jpg'
},
'open_graph': {
'og:title': 'Titre OpenGraph',
'og:description': 'Description OpenGraph',
'og:image': 'https://example.com/og-image.jpg',
...
},
'og_data_by_page': {
'https://example.com/': {
'og:title': 'Titre page accueil',
'og:description': 'Description page accueil',
...
},
'https://example.com/about': {
'og:title': 'Titre page a propos',
'og:description': 'Description page a propos',
...
},
...
}
},
'resume': 'Resume automatique du site...',
'visited_urls': 42,
'duration': 15.3,
'total_emails': 5,
'total_people': 3,
'total_phones': 8,
'total_social_platforms': 4,
'total_technologies': 12,
'total_images': 156
}Informations de base sur les entreprises.
Resultats de scraping avec totaux et metadonnees.
Liste des emails trouves avec contexte.
Personnes identifiees avec leurs coordonnees.
Telephones extraits avec page source.
Profils de reseaux sociaux detectes.
Technologies utilisees par categorie.
Images du site avec dimensions et alt text.
Donnees OpenGraph normalisees (titre, description, type, etc.). Une entree par page scrapee, permettant de stocker les metadonnees de toutes les pages visitees, pas seulement la page d'accueil. Chaque entree contient :
entreprise_id: Reference vers l'entreprisepage_url: URL de la page source des donnees OGog_title,og_description,og_type,og_url,og_site_name,og_locale: Metadonnees principales
Images OpenGraph avec dimensions et type.
Videos OpenGraph (si presentes).
Audios OpenGraph (si presents).
Locales supportees par le site.
scrapers.entreprise_id->entreprises.id(CASCADE DELETE)scraper_emails.scraper_id->scrapers.id(CASCADE DELETE)scraper_people.scraper_id->scrapers.id(CASCADE DELETE)scraper_phones.scraper_id->scrapers.id(CASCADE DELETE)scraper_social.scraper_id->scrapers.id(CASCADE DELETE)scraper_technologies.scraper_id->scrapers.id(CASCADE DELETE)scraper_images.scraper_id->scrapers.id(CASCADE DELETE)entreprise_og_data.entreprise_id->entreprises.id(CASCADE DELETE)entreprise_og_images.og_data_id->entreprise_og_data.id(CASCADE DELETE)entreprise_og_videos.og_data_id->entreprise_og_data.id(CASCADE DELETE)entreprise_og_audios.og_data_id->entreprise_og_data.id(CASCADE DELETE)entreprise_og_locales.og_data_id->entreprise_og_data.id(CASCADE DELETE)
- max_workers : 3-5 pour eviter de surcharger les serveurs
- max_depth : 2-3 pour un bon equilibre couverture/temps
- max_time : 300 secondes (5 minutes) par site
- max_pages : 50 pages pour limiter le temps de scraping
- delay : 2 secondes entre requetes pour eviter les blocages
Le scraper gere automatiquement :
- Timeouts de connexion
- Erreurs HTTP (404, 500, etc.)
- Sites inaccessibles
- Redirections infinies
- Contenu invalide
- Scraping parallele avec threads
- Cache des pages visitees
- Deduplication automatique
- Limitation du nombre de pages
- Timeout par site
Le scraping envoie des mises a jour en temps reel via WebSocket :
socket.on('scraping_progress', function(data) {
console.log(data.message);
console.log('Emails:', data.total_emails);
console.log('Personnes:', data.total_people);
console.log('Telephones:', data.total_phones);
console.log('Reseaux sociaux:', data.total_social_platforms);
console.log('Technologies:', data.total_technologies);
console.log('Images:', data.total_images);
});
socket.on('scraping_complete', function(data) {
console.log('Scraping termine !');
console.log('Total emails:', data.total_emails);
// Redirection automatique vers /entreprises une fois le scraping + analyse technique termines
});Le scraper collecte les donnees OpenGraph de toutes les pages visitees, pas seulement la page d'accueil. Cela permet d'obtenir une vision complete des metadonnees du site :
- Chaque page scrapee peut avoir ses propres metadonnees OG
- Les donnees sont stockees dans
entreprise_og_dataavec le champpage_urlpour identifier la source - L'interface utilisateur affiche ces donnees dans l'onglet "Pages" de la fiche entreprise
- Les images OG sont liees a chaque entree via
entreprise_og_images
{
'page_url': 'https://example.com/page',
'og_title': 'Titre de la page',
'og_description': 'Description de la page',
'og_type': 'website',
'og_url': 'https://example.com/page',
'og_site_name': 'Nom du site',
'og_locale': 'fr_FR',
'images': [
{
'image_url': 'https://example.com/image.jpg',
'width': 1200,
'height': 630,
'alt_text': 'Description de l image'
}
],
'videos': [...],
'audios': [...],
'locales_alternate': ['en_US', 'es_ES']
}- Respect du fichier
robots.txt(optionnel, configurable) - Pas de scraping de sites protegés par authentification
- Pas de scraping de contenu JavaScript dynamique (necessiterait Selenium)
- Limite de temps par site pour eviter les blocages