Las citas de AI Overview determinan qué sitios web obtienen visibilidad en las respuestas generadas por AI de Google. El seguimiento de estas citas a lo largo del tiempo revela qué dominios están ganando o perdiendo visibilidad en las búsquedas de IA, qué formatos de contenido son los más citados y cómo cambian los patrones de citas de Google. Este tutorial muestra cómo crear un rastreador de citas OEA automatizado que monitorea un conjunto de palabras clave, registra qué dominios aparecen en las fuentes de AI Overview y rastrea la frecuencia de las citas a lo largo del tiempo. Creará un canal que se ejecutará diariamente y generará informes de tendencias.
Requisitos previos
- Python 3.8+ instalado
- solicita biblioteca instalada
- Una clave API de Scavio de scavio.dev
- Una lista de palabras clave para monitorear las citas de descripción general de AI
Guia paso a paso
Paso 1: Configurar el rastreador
Defina las palabras clave y el almacenamiento para el seguimiento de citas.
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",
]Paso 2: Extraer citas de descripción general de IA
Consulta cada palabra clave y extrae los dominios citados en 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(),
}Paso 3: Construir la base de datos de citas
Almacene datos de citas a lo largo del tiempo para permitir el análisis de tendencias.
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 snapshotPaso 4: Generar informe de tendencias
Compare instantáneas para detectar cambios en las citas y cambios en la clasificación de dominios.
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]),
}Paso 5: Seguimiento del rendimiento de un dominio específico
Supervise cómo cambia el recuento de citas de un dominio específico con el tiempo.
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")Ejemplo en 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"))Ejemplo en 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);Salida esperada
An automated citation tracking pipeline that monitors AI Overview sources daily, stores citation history, identifies trending domains, and generates domain-level performance reports.