Le SEO local détermine si une entreprise apparaît dans Google Maps et le pack local pour des requêtes géociblées. Un analyseur SEO local examine comment une entreprise se présente dans les résultats locaux : sa note, le nombre d'avis, la présence d'un site web, et son classement par rapport aux concurrents. Ce tutoriel construit un analyseur SEO local utilisant l'API Scavio qui interroge les résultats locaux pour des mots-clés ciblés, évalue la qualité de la fiche entreprise et produit un rapport de score SEO local.
Prérequis
- Python 3.8 ou supérieur
- bibliothèque requests installée
- Une clé API Scavio
- Un nom d'entreprise et un emplacement à vérifier
Parcours
Étape 1: Récupérer les résultats locaux pour les mots-clés cibles
Recherchez des mots-clés à intention locale pour lesquels votre entreprise devrait être classée. Le champ local_results contient les fiches Google Maps.
def get_local_results(keyword: str, location: str) -> list[dict]:
r = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"query": f"{keyword} in {location}", "country_code": "us"}
)
r.raise_for_status()
return r.json().get("local_results", [])Étape 2: Trouver l'entreprise cible dans les résultats
Scannez les résultats locaux pour trouver le nom de l'entreprise cible. Retournez sa position et les détails de la fiche si trouvée.
def find_business(results: list[dict], business_name: str) -> dict | None:
for i, r in enumerate(results):
if business_name.lower() in r.get("title", "").lower():
return {"position": i + 1, **r}
return NoneÉtape 3: Évaluer la qualité de la fiche
Calculez un score SEO local basé sur la note, le nombre d'avis, la présence d'un site web et la disponibilité du numéro de téléphone.
def score_listing(listing: dict) -> dict:
score = 0
factors = {}
rating = float(listing.get("rating", 0) or 0)
if rating >= 4.5:
score += 30
factors["rating"] = f"{rating}/5 (excellent)"
elif rating >= 4.0:
score += 20
factors["rating"] = f"{rating}/5 (good)"
else:
factors["rating"] = f"{rating}/5 (needs improvement)"
reviews = int(listing.get("reviews", 0) or 0)
if reviews >= 100:
score += 25
elif reviews >= 20:
score += 15
factors["reviews"] = str(reviews)
if listing.get("website"):
score += 20
factors["website"] = "present"
else:
factors["website"] = "missing"
if listing.get("phone"):
score += 15
factors["phone"] = "present"
else:
factors["phone"] = "missing"
return {"score": score, "max_score": 90, "factors": factors}Étape 4: Générer le rapport SEO local
Exécutez l'analyseur sur plusieurs mots-clés et produisez un rapport SEO local complet.
def local_seo_check(business: str, location: str, keywords: list[str]) -> None:
print(f"Local SEO Report: {business} in {location}\n" + "=" * 50)
for kw in keywords:
results = get_local_results(kw, location)
match = find_business(results, business)
if match:
scores = score_listing(match)
print(f"\n{kw}: Position #{match['position']}, Score: {scores['score']}/{scores['max_score']}")
else:
print(f"\n{kw}: Not found in local results")Exemple Python
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 get_local(kw: str, loc: str) -> list[dict]:
r = requests.post(ENDPOINT, headers={"x-api-key": API_KEY},
json={"query": f"{kw} in {loc}", "country_code": "us"})
r.raise_for_status()
return r.json().get("local_results", [])
def score(listing: dict) -> int:
s = 0
if float(listing.get("rating") or 0) >= 4.0: s += 25
if int(listing.get("reviews") or 0) >= 50: s += 25
if listing.get("website"): s += 25
if listing.get("phone"): s += 15
return s
if __name__ == "__main__":
business = "Joe's Coffee"
keywords = ["coffee shop", "best coffee", "cafe near me"]
for kw in keywords:
results = get_local(kw, "Austin, TX")
match = next((r for r in results if business.lower() in r.get("title", "").lower()), None)
if match:
print(f"{kw}: #{results.index(match)+1}, score={score(match)}/90")
else:
print(f"{kw}: not found")Exemple JavaScript
const API_KEY = process.env.SCAVIO_API_KEY || "your_scavio_api_key";
const ENDPOINT = "https://api.scavio.dev/api/v1/search";
async function getLocal(kw, loc) {
const res = await fetch(ENDPOINT, {
method: "POST",
headers: { "x-api-key": API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ query: `${kw} in ${loc}`, country_code: "us" })
});
const data = await res.json();
return data.local_results || [];
}
async function main() {
const business = "Joe's Coffee";
const keywords = ["coffee shop", "best coffee"];
for (const kw of keywords) {
const results = await getLocal(kw, "Austin, TX");
const idx = results.findIndex(r => r.title?.toLowerCase().includes(business.toLowerCase()));
if (idx >= 0) {
console.log(`${kw}: #${idx + 1}, rating: ${results[idx].rating}`);
} else {
console.log(`${kw}: not found`);
}
}
}
main().catch(console.error);Sortie attendue
Local SEO Report: Joe's Coffee in Austin, TX
==================================================
coffee shop: Position #3, Score: 75/90
rating: 4.7/5 (excellent)
reviews: 234
website: present
phone: present
best coffee: Position #5, Score: 65/90
cafe near me: Not found in local results