Google Maps Scraper : extraction de prospects open source à grande échelle
Découvrez un scraper Google Maps basé sur Go, avec interface CLI, interface Web, API REST, prise en charge des proxys, extraction d’e-mails et mise à l’échelle distribuée.
Google Maps Scraper : extraction de prospects open source à grande échelle
La collecte de données structurées sur les entreprises locales est utile pour la prospection commerciale, les études de marché, le SEO local, l’enrichissement et l’automatisation — mais copier manuellement des fiches depuis Google Maps ne passe pas à l’échelle. Le projet open source gosom/google-maps-scraper transforme les recherches Google Maps en enregistrements structurés contenant les informations sur les entreprises, les coordonnées, les avis, les coordonnées géographiques et, en option, les adresses e-mail.
Le projet est distribué sous licence MIT et propose plusieurs modes d’exécution : une interface en ligne de commande, une interface Web locale, une API REST, une édition SaaS auto-hébergée facultative et une compétence pour agents IA dédiée aux workflows en langage naturel. Il est principalement écrit en Go et utilise Playwright pour l’extraction via navigateur.
Données collectées par le scraper
Un résultat type peut inclure plus de 33 champs, notamment :
- Nom de l’entreprise, catégorie, description et statut
- Adresse postale et adresse complète formatée
- Numéro de téléphone et site Web officiel
- Lien Google Maps, identifiant Place, CID et autres identifiants
- Note moyenne, nombre d’avis, répartition des notes et avis clients
- Latitude, longitude, fuseau horaire, Plus Code et URL Street View
- Horaires d’ouverture et informations sur les périodes d’affluence
- Fourchette de prix, réservations, menu et liens de commande en ligne
- Images, miniature, statut du propriétaire, cartes bancaires acceptées et métadonnées supplémentaires
- Adresses e-mail découvertes grâce à l’exploration facultative des sites Web des entreprises
La collecte étendue des avis peut récupérer jusqu’à environ 300 avis par établissement avec l’option -extra-reviews. L’extraction des e-mails est désactivée par défaut, car la visite de chaque site Web d’entreprise augmente considérablement la durée d’exécution.
Démarrage rapide avec Docker
Docker est la méthode d’installation recommandée, car l’image inclut l’environnement d’automatisation du navigateur. Créez un répertoire de sortie et montez un fichier d’entrée contenant une requête par ligne :
mkdir -p gmaps-output
docker run \\
-v gmaps-playwright-cache:/opt \\
-v "$PWD/example-queries.txt:/queries.txt:ro" \\
-v "$PWD/gmaps-output:/out" \\
gosom/google-maps-scraper \\
-input /queries.txt \\
-results /out/results.csv \\
-depth 1 \\
-exit-on-inactivity 3m
Un fichier de requêtes peut ressembler à ceci :
restaurants in Berlin
software companies in Austin
coffee shops in Athens
Le format de sortie par défaut est le CSV. Pour écrire du JSON, ajoutez -json et utilisez un chemin de résultat se terminant par .json :
docker run \\
-v gmaps-playwright-cache:/opt \\
-v "$PWD/queries.txt:/queries.txt:ro" \\
-v "$PWD/output:/out" \\
gosom/google-maps-scraper \\
-input /queries.txt \\
-results /out/results.json \\
-json \\
-depth 1 \\
-exit-on-inactivity 3m
Lors de la première exécution, les bibliothèques du navigateur peuvent être téléchargées et le cache Playwright initialisé. La persistance de /opt dans un volume Docker nommé évite de répéter cette opération.
Trois façons de l’utiliser
1. Ligne de commande
La CLI convient parfaitement aux tâches reproductibles, aux scripts shell, aux tâches cron et aux pipelines de données. Les options importantes incluent :
| Option | Fonction |
|---|---|
-input |
Fichier d’entrée contenant des requêtes ou des URL Google Maps |
-results |
Chemin de sortie CSV, JSON ou JSONL |
-depth |
Profondeur maximale de défilement des résultats ; 10 par défaut |
-c |
Nombre de tâches de scraping simultanées ; la moitié des cœurs CPU par défaut |
-email |
Explore les sites Web des entreprises pour trouver des adresses e-mail |
-extra-reviews |
Collecte des données d’avis étendues |
-resume |
Reprend un scraping interrompu basé sur un fichier |
-fast-mode |
Collecte rapidement jusqu’à 21 résultats par requête |
-lang |
Langue de Google Maps, par exemple de |
-geo |
Coordonnées de recherche, par exemple 37.7749,-122.4194 |
-radius |
Rayon de recherche en mètres |
-grid-bbox |
Divise une zone géographique délimitée par une boîte englobante en cellules |
2. Interface Web et API REST
Lancez l’interface Web locale avec :
mkdir -p gmapsdata
docker run \\
-v "$PWD/gmapsdata:/gmapsdata" \\
-p 8080:8080 \\
gosom/google-maps-scraper \\
-data-folder /gmapsdata
Ouvrez http://localhost:8080. Le serveur expose également une spécification OpenAPI 3.0.3 à l’adresse http://localhost:8080/api/docs.
Les principaux endpoints de l’API sont :
POST /api/v1/jobs— créer une tâche de scrapingGET /api/v1/jobs— lister les tâchesGET /api/v1/jobs/{id}— consulter une tâcheDELETE /api/v1/jobs/{id}— supprimer une tâcheGET /api/v1/jobs/{id}/download— télécharger les résultats au format CSV
Le scraper peut ainsi être intégré à des tableaux de bord internes, des workflows CRM ou des services planifiés de génération de prospects.
3. Workflow avec agent IA
Le dépôt inclut un package Agent Skills compatible avec des outils tels que Claude Code, Codex, Cursor et GitHub Copilot. Installez-le avec :
npx skills add gosom/google-maps-scraper
Vous pouvez ensuite demander quelque chose comme :
Find dentists in Berlin and include their websites and email addresses.
La compétence peut déduire les paramètres de recherche par défaut, effectuer une petite exécution de validation, lancer l’exploration Docker, suivre sa progression et aider à enregistrer ou analyser les résultats. Les identifiants de proxy sont saisis via une invite de terminal locale masquée plutôt que copiés dans la conversation avec l’agent. Docker et Node.js sont requis sur macOS, Linux ou Windows via WSL.
Gestion des tâches volumineuses
Le projet indique environ 120 établissements par minute avec -c 8 -depth 1, bien que le débit réel dépende de la complexité des requêtes, des ressources du navigateur, des conditions réseau et du blocage éventuel.
Voici une estimation indicative :
| Mots-clés | Résultats par mot-clé | Total d’établissements | Temps estimé |
|---|---|---|---|
| 100 | 16 | 1 600 | ~13 minutes |
| 1 000 | 16 | 16 000 | ~2,5 heures |
| 10 000 | 16 | 160 000 | ~22 heures |
La concurrence contrôle le nombre de tâches exécutées simultanément. Les paramètres des processus du navigateur et des pages offrent un contrôle supplémentaire :
./google-maps-scraper \\
-c 8 \\
-browser-pool-size 2 \\
-pages-per-browser 4 \\
-input queries.txt \\
-results results.csv \\
-depth 1
Ici, huit tâches sont réparties entre deux processus de navigateur, avec quatre onglets par navigateur. Surveillez l’utilisation des ressources avec htop ou docker stats ; Chromium peut consommer beaucoup de CPU et de mémoire. Le produit de browser-pool-size et pages-per-browser devrait être à peu près égal ou supérieur à -c afin de maintenir les workers occupés.
Pour les tâches interrompues, utilisez le mode reprise :
./google-maps-scraper \\
-resume \\
-input queries.txt \\
-results results.csv \\
-depth 10
Le mode reprise lit les sorties CSV ou JSONL existantes, ignore les établissements déjà écrits et conserve un fichier annexe <results>.resume.json contenant les requêtes d’entrée terminées. Il nécessite une sortie sous forme de fichier standard et est incompatible avec stdout, les writers personnalisés, la sortie LeadsDB et le mode rapide.
Couverture géographique avec le scraping par grille
Une seule recherche Google Maps peut ne pas exposer suffisamment de résultats dans une zone dense. Le scraping par grille divise une boîte englobante en cellules et exécute une requête depuis chaque cellule :
./google-maps-scraper \\
-input queries.txt \\
-results peristeri-cafes.csv \\
-grid-bbox "38.0077,23.6719,38.0257,23.6947" \\
-grid-cell 0.5 \\
-zoom 16 \\
-depth 1 \\
-c 4
Le mode grille contribue à accroître la couverture géographique, mais ne limite pas strictement les résultats à la boîte englobante. Pour appliquer un filtrage strict par distance, utilisez -geo avec -radius en mode rapide ou filtrez les enregistrements après coup à l’aide de la latitude et de la longitude.
Le mode rapide renvoie jusqu’à 21 résultats par requête, classés par distance :
./google-maps-scraper \\
-input queries.txt \\
-results results.csv \\
-fast-mode \\
-zoom 15 \\
-radius 5000 \\
-geo '37.7749,-122.4194'
Le mode rapide est actuellement en version bêta et peut être davantage sujet au blocage. Il ne peut pas être combiné avec -grid-bbox.
Configuration des proxys
Pour les tâches volumineuses, les proxys peuvent aider à répartir le trafic et à réduire la limitation de débit. Les protocoles pris en charge comprennent SOCKS5, SOCKS5H, HTTP et HTTPS :
./google-maps-scraper \\
-input queries.txt \\
-results results.csv \\
-proxies 'socks5://user:pass@host:port,http://host2:port2' \\
-depth 1 \\
-c 2
Vous pouvez également placer une URL de proxy par ligne dans un fichier :
./google-maps-scraper \\
-input queries.txt \\
-results results.csv \\
-proxies-file proxies.txt
L’utilisation de proxys ne remplace pas une conception responsable du crawling. Commencez avec une faible concurrence, validez un petit échantillon et respectez les lois applicables ainsi que les conditions régissant les données auxquelles vous accédez.
Exportation directe vers LeadsDB
Au lieu d’écrire des fichiers intermédiaires, le scraper peut envoyer directement les enregistrements vers LeadsDB, qui fournit la déduplication, le filtrage, l’accès via API et les exportations :
export LEADSDB_API_KEY="your-api-key"
./google-maps-scraper \\
-input queries.txt \\
-exit-on-inactivity 3m
Vous pouvez aussi fournir explicitement la clé avec -leadsdb-api-key. Les champs Google Maps sont associés à des champs de prospects tels que le nom, la catégorie, le téléphone, le site Web, l’adresse, les coordonnées, la note, le nombre d’avis, l’e-mail, l’URL du logo et l’identifiant source. Les métadonnées Maps supplémentaires sont conservées comme attributs personnalisés.
Mise à l’échelle avec PostgreSQL et Kubernetes
Pour les charges distribuées, PostgreSQL peut servir de fournisseur de tâches partagé. Démarrez la base de données de développement, alimentez-la en tâches et exécutez des workers de scraping sur plusieurs machines :
docker-compose -f docker-compose.dev.yaml up -d
./google-maps-scraper \\
-dsn "postgres://postgres:postgres@localhost:5432/postgres" \\
-produce \\
-input example-queries.txt \\
-lang en
./google-maps-scraper \\
-c 2 \\
-depth 1 \\
-dsn "postgres://postgres:postgres@localhost:5432/postgres"
Un déploiement Kubernetes peut exécuter plusieurs réplicas :
apiVersion: apps/v1
kind: Deployment
metadata:
name: google-maps-scraper
spec:
replicas: 3
selector:
matchLabels:
app: google-maps-scraper
template:
metadata:
labels:
app: google-maps-scraper
spec:
containers:
- name: google-maps-scraper
image: gosom/google-maps-scraper:latest
args: ["-c", "1", "-depth", "10", "-dsn", "postgres://user:pass@host:5432/db"]
resources:
requests:
memory: "512Mi"
cpu: "500m"
Les navigateurs headless nécessitent des allocations significatives de CPU et de mémoire ; les demandes de ressources doivent donc être ajustées à l’aide de tests de charge plutôt que copiées telles quelles.
Compiler depuis les sources
Le projet nécessite Go 1.26.6 ou une version ultérieure :
git clone https://github.com/gosom/google-maps-scraper.git
cd google-maps-scraper
go mod download
go build
./google-maps-scraper \\
-input example-queries.txt \\
-results results.csv \\
-exit-on-inactivity 3m
Les développeurs peuvent également créer des plugins writer personnalisés en Go :
go build -buildmode=plugin -tags=plugin -o myplugin.so myplugin.go
./google-maps-scraper \\
-writer ~/plugins:MyWriter \\
-input queries.txt
Considérations opérationnelles
La télémétrie anonyme est activée par défaut et peut être désactivée avec :
export DISABLE_TELEMETRY=1
Le dépôt est distribué sous licence MIT, mais les utilisateurs restent responsables du respect des lois applicables en matière de vie privée, de protection des données et des conditions d’utilisation des sites Web. Évitez de collecter les données dont vous n’avez pas besoin, protégez les coordonnées exportées et intégrez des limites de débit ainsi que des stratégies de nouvelle tentative dans les workflows de production.
Grâce à sa combinaison d’extraction via navigateur, de sortie structurée, de tâches reprenables, de contrôles géographiques, de prise en charge des proxys, d’API et d’exécution distribuée, Google Maps Scraper est bien plus qu’une simple commande ponctuelle. Il constitue une base pratique pour les développeurs qui souhaitent transformer les résultats de recherche locale en pipelines de données reproductibles et vérifiables.