Les données commerciales de Google Maps sont essentielles pour la génération de leads, les audits SEO locaux et les études de marché. Scraper Google Maps directement déclenche des protections anti-bot agressives, notamment des CAPTCHA, des bannissements d'IP et des défis JavaScript. L'API Scavio vous permet de rechercher des entreprises locales par requête et localisation, renvoyant un JSON structuré avec le nom, l'adresse, la note, le nombre d'avis, le numéro de téléphone et le site web. Ce tutoriel montre comment interroger les données Google Maps pour n'importe quelle catégorie d'entreprise et localisation, puis exporter les résultats pour la prospection ou l'analyse.
Prérequis
- Python 3.8 ou supérieur
- bibliothèque requests installée
- Une clé API Scavio
- Une catégorie d'entreprise cible et une localisation à rechercher
Parcours
Étape 1: Rechercher des entreprises locales
Envoyez une requête POST au point de terminaison Scavio avec une requête de type Google Maps incluant le type d'entreprise et la localisation. Le champ local_results contient des listes d'entreprises structurées.
import os
import requests
API_KEY = os.environ.get("SCAVIO_API_KEY", "your_scavio_api_key")
ENDPOINT = "https://api.scavio.dev/api/v1/search"
def search_maps(query: str, location: str) -> list[dict]:
response = requests.post(
ENDPOINT,
headers={"x-api-key": API_KEY},
json={"query": f"{query} in {location}", "country_code": "us"}
)
response.raise_for_status()
return response.json().get("local_results", [])Étape 2: Extraire les détails de l'entreprise
Analysez chaque résultat local pour obtenir le nom, l'adresse, le téléphone, la note, le nombre d'avis et l'URL du site web.
def extract_business(result: dict) -> dict:
return {
"name": result.get("title"),
"address": result.get("address"),
"phone": result.get("phone"),
"rating": result.get("rating"),
"reviews": result.get("reviews"),
"website": result.get("website"),
}Étape 3: Filtrer par note minimale
Conservez uniquement les entreprises dépassant un seuil de note pour des listes de leads de qualité.
def filter_by_rating(businesses: list[dict], min_rating: float = 4.0) -> list[dict]:
return [
b for b in businesses
if b.get("rating") and float(b["rating"]) >= min_rating
]Étape 4: Exporter vers CSV
Écrivez la liste filtrée d'entreprises dans un fichier CSV pour une utilisation dans les importations CRM ou les outils de prospection.
import csv
def export_csv(businesses: list[dict], filename: str = "leads.csv") -> None:
with open(filename, "w", newline="") as f:
writer = csv.DictWriter(f, fieldnames=["name", "address", "phone", "rating", "reviews", "website"])
writer.writeheader()
writer.writerows(businesses)
print(f"Exported {len(businesses)} businesses to {filename}")Exemple Python
import os
import csv
import requests
API_KEY = os.environ.get("SCAVIO_API_KEY", "your_scavio_api_key")
ENDPOINT = "https://api.scavio.dev/api/v1/search"
def search_maps(query: str, location: str) -> list[dict]:
r = requests.post(ENDPOINT, headers={"x-api-key": API_KEY},
json={"query": f"{query} in {location}", "country_code": "us"})
r.raise_for_status()
return r.json().get("local_results", [])
def extract(result: dict) -> dict:
return {
"name": result.get("title"),
"address": result.get("address"),
"phone": result.get("phone"),
"rating": result.get("rating"),
"reviews": result.get("reviews"),
"website": result.get("website"),
}
if __name__ == "__main__":
results = search_maps("dentists", "San Francisco, CA")
businesses = [extract(r) for r in results]
high_rated = [b for b in businesses if b["rating"] and float(b["rating"]) >= 4.5]
with open("leads.csv", "w", newline="") as f:
w = csv.DictWriter(f, fieldnames=list(high_rated[0].keys()))
w.writeheader()
w.writerows(high_rated)
print(f"Exported {len(high_rated)} leads")Exemple JavaScript
const API_KEY = process.env.SCAVIO_API_KEY || "your_scavio_api_key";
const ENDPOINT = "https://api.scavio.dev/api/v1/search";
const fs = require("fs");
async function searchMaps(query, location) {
const res = await fetch(ENDPOINT, {
method: "POST",
headers: { "x-api-key": API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ query: `${query} in ${location}`, country_code: "us" })
});
const data = await res.json();
return (data.local_results || []).map(r => ({
name: r.title, address: r.address, phone: r.phone,
rating: r.rating, reviews: r.reviews, website: r.website
}));
}
async function main() {
const businesses = await searchMaps("dentists", "San Francisco, CA");
const filtered = businesses.filter(b => b.rating && parseFloat(b.rating) >= 4.5);
const header = "name,address,phone,rating,reviews,website";
const rows = filtered.map(b => Object.values(b).join(","));
fs.writeFileSync("leads.csv", [header, ...rows].join("\n"));
console.log(`Exported ${filtered.length} leads`);
}
main().catch(console.error);Sortie attendue
{
"local_results": [
{
"title": "Pacific Heights Dental",
"address": "2100 Webster St, San Francisco, CA 94115",
"phone": "(415) 555-0123",
"rating": "4.9",
"reviews": 342,
"website": "https://pacificheightsdental.com",
"hours": "Open until 5:00 PM"
}
]
}