Aperçu
Les agences SEO local ont besoin de données commerciales : cohérence NAP, nombre d'avis, notes, catégories et présence concurrentielle. Ce workflow recherche des entreprises sur Google Maps dans une zone cible, enrichit chaque résultat avec les données de Google Search pour vérifier la présence en ligne, et exporte un jeu de données structuré prêt pour les audits SEO ou la qualification de leads. Un pipeline remplace les vérifications manuelles d'annuaires.
Déclencheur
À la demande par engagement client, ou hebdomadaire pour un suivi continu.
Planification
Hebdomadaire
Étapes du workflow
Définir la zone cible et les catégories
Définir la zone géographique (ville, code postal) et les catégories d'entreprises à rechercher.
Rechercher des entreprises sur Google Maps
Appeler Scavio avec la plateforme google-maps pour trouver les entreprises correspondant aux critères.
Extraire les détails des entreprises
Analyser le nom, l'adresse, le téléphone, la note, le nombre d'avis, le site web et la catégorie à partir des résultats Maps.
Vérifier la présence en ligne via Google Search
Pour chaque entreprise, effectuer une recherche Google pour vérifier si elle possède un site web réel et son classement.
Exporter un jeu de données structuré
Enregistrer les résultats au format CSV ou JSON avec tous les champs d'entreprise, les indicateurs de présence web et les scores d'opportunité SEO.
Implémentation Python
import requests, os, json, csv
API_KEY = os.environ["SCAVIO_API_KEY"]
H = {"x-api-key": API_KEY, "Content-Type": "application/json"}
def search_maps(query: str) -> list:
resp = requests.post(
"https://api.scavio.dev/api/v1/search",
headers=H,
json={"query": query, "platform": "google-maps"},
timeout=15,
)
return resp.json().get("local_results", [])
def check_web_presence(business_name: str, city: str) -> dict:
resp = requests.post(
"https://api.scavio.dev/api/v1/search",
headers=H,
json={"query": f"{business_name} {city}", "country_code": "us"},
timeout=15,
)
results = resp.json().get("organic_results", [])
has_website = any(business_name.lower().replace(" ", "") in r.get("link", "").lower().replace(" ", "") for r in results[:5])
return {"has_website": has_website, "google_results": len(results)}
def collect_local_data(categories: list, city: str):
all_businesses = []
for cat in categories:
query = f"{cat} in {city}"
maps_results = search_maps(query)
for biz in maps_results:
name = biz.get("title", "")
web = check_web_presence(name, city)
all_businesses.append({
"name": name,
"address": biz.get("address", ""),
"phone": biz.get("phone", ""),
"rating": biz.get("rating", ""),
"reviews": biz.get("reviews", 0),
"category": cat,
"has_website": web["has_website"],
"google_results": web["google_results"],
})
return all_businesses
businesses = collect_local_data(["plumber", "dentist", "accountant"], "Austin TX")
print(f"Collected {len(businesses)} businesses")
no_website = [b for b in businesses if not b["has_website"]]
print(f"Without website: {len(no_website)} (lead opportunities)")Implémentation JavaScript
const H = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
async function searchMaps(query) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {method:'POST', headers:H, body:JSON.stringify({query, platform:'google-maps'})});
return (await r.json()).local_results || [];
}
async function checkWebPresence(businessName, city) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {method:'POST', headers:H, body:JSON.stringify({query:businessName+' '+city, country_code:'us'})});
const results = (await r.json()).organic_results || [];
const hasWebsite = results.slice(0,5).some(r=>(r.link||'').toLowerCase().replace(/ /g,'').includes(businessName.toLowerCase().replace(/ /g,'')));
return {hasWebsite, googleResults:results.length};
}
async function collectLocalData(categories, city) {
const all = [];
for (const cat of categories) {
const mapsResults = await searchMaps(cat+' in '+city);
for (const biz of mapsResults) {
const name = biz.title || '';
const web = await checkWebPresence(name, city);
all.push({name, address:biz.address||'', phone:biz.phone||'', rating:biz.rating||'', reviews:biz.reviews||0, category:cat, hasWebsite:web.hasWebsite, googleResults:web.googleResults});
}
}
return all;
}
const businesses = await collectLocalData(['plumber','dentist','accountant'], 'Austin TX');
console.log('Collected '+businesses.length+' businesses');
const noWebsite = businesses.filter(b=>!b.hasWebsite);
console.log('Without website: '+noWebsite.length+' (lead opportunities)');Plateformes utilisées
Google Maps
Recherche d'entreprises locales avec notes et coordonnées
Recherche web avec graphe de connaissances, PAA et aperçus IA