Les citations AI Overview déterminent quels sites Web obtiennent de la visibilité dans les réponses générées par l'IA de Google. Le suivi de ces citations dans le temps révèle quels domaines gagnent ou perdent en visibilité dans la recherche IA, quels formats de contenu sont le plus cités et comment les schémas de citation de Google évoluent. Ce tutoriel montre comment construire un suivi AEO automatisé des citations qui surveille un ensemble de mots-clés, enregistre quels domaines apparaissent dans les sources AI Overview et suit la fréquence des citations au fil du temps. Vous créerez un pipeline qui s'exécute quotidiennement et génère des rapports de tendance.
Prérequis
- Python 3.8+ installé
- bibliothèque requests installée
- Une clé API Scavio depuis scavio.dev
- Une liste de mots-clés à surveiller pour les citations AI Overview
Parcours
Étape 1: Configurer le suivi
Définir les mots-clés et le stockage pour le suivi des citations.
import os, requests, json
from datetime import date
from collections import Counter
API_KEY = os.environ["SCAVIO_API_KEY"]
TRACKER_FILE = "aeo_citations.json"
KEYWORDS = [
"what is RAG in AI",
"best CRM for small business",
"how to automate email outreach",
"python web scraping alternatives",
]Étape 2: Extraire les citations AI Overview
Interroger chaque mot-clé et extraire les domaines cités dans les AI Overviews.
def extract_citations(keyword):
resp = requests.post("https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "google", "query": keyword})
data = resp.json()
aio = data.get("ai_overview", {})
sources = aio.get("sources", []) if aio else []
from urllib.parse import urlparse
domains = [urlparse(s.get("link", "")).netloc for s in sources if s.get("link")]
return {
"keyword": keyword,
"has_aio": bool(aio),
"citation_count": len(sources),
"domains": domains,
"urls": [s.get("link", "") for s in sources],
"date": date.today().isoformat(),
}Étape 3: Construire la base de données des citations
Stocker les données de citation au fil du temps pour permettre l'analyse des tendances.
def load_tracker():
try:
with open(TRACKER_FILE) as f:
return json.load(f)
except FileNotFoundError:
return []
def save_snapshot(keywords):
tracker = load_tracker()
snapshot = {
"date": date.today().isoformat(),
"citations": [extract_citations(kw) for kw in keywords],
}
all_domains = []
for c in snapshot["citations"]:
all_domains.extend(c["domains"])
snapshot["top_domains"] = Counter(all_domains).most_common(10)
tracker.append(snapshot)
with open(TRACKER_FILE, "w") as f:
json.dump(tracker, f, indent=2)
return snapshotÉtape 4: Générer un rapport de tendance
Comparer les instantanés pour détecter les changements de citation et les variations de classement des domaines.
def trend_report():
tracker = load_tracker()
if len(tracker) < 2:
return {"status": "need at least 2 snapshots"}
current = tracker[-1]
previous = tracker[-2]
curr_domains = Counter()
prev_domains = Counter()
for c in current["citations"]:
curr_domains.update(c["domains"])
for c in previous["citations"]:
prev_domains.update(c["domains"])
gainers = {d: curr_domains[d] - prev_domains.get(d, 0)
for d in curr_domains if curr_domains[d] > prev_domains.get(d, 0)}
losers = {d: prev_domains[d] - curr_domains.get(d, 0)
for d in prev_domains if prev_domains[d] > curr_domains.get(d, 0)}
return {
"period": f"{previous['date']} -> {current['date']}",
"gainers": dict(sorted(gainers.items(), key=lambda x: -x[1])[:5]),
"losers": dict(sorted(losers.items(), key=lambda x: -x[1])[:5]),
}Étape 5: Suivre les performances d'un domaine spécifique
Surveiller comment le nombre de citations d'un domaine spécifique évolue dans le temps.
def domain_performance(domain):
tracker = load_tracker()
performance = []
for snapshot in tracker:
count = 0
for c in snapshot["citations"]:
count += sum(1 for d in c["domains"] if domain in d)
performance.append({"date": snapshot["date"], "citations": count})
return performance
perf = domain_performance("example.com")
for p in perf:
print(f"{p['date']}: {p['citations']} citations")Exemple Python
import os, requests
API_KEY = os.environ["SCAVIO_API_KEY"]
def citations(keyword):
resp = requests.post("https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "google", "query": keyword})
aio = resp.json().get("ai_overview", {})
sources = aio.get("sources", []) if aio else []
return {"keyword": keyword, "count": len(sources),
"domains": [s.get("link","")[:50] for s in sources[:3]]}
print(citations("what is RAG in AI"))Exemple JavaScript
const H = {"x-api-key": process.env.SCAVIO_API_KEY, "Content-Type": "application/json"};
async function citations(keyword) {
const r = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST", headers: H,
body: JSON.stringify({platform: "google", query: keyword})
});
const aio = (await r.json()).ai_overview || {};
const sources = aio.sources || [];
return {keyword, count: sources.length, domains: sources.slice(0,3).map(s=>s.link)};
}
citations("what is RAG in AI").then(console.log);Sortie attendue
An automated citation tracking pipeline that monitors AI Overview sources daily, stores citation history, identifies trending domains, and generates domain-level performance reports.