r/AIRankingStrategy confirma el patrón de 2026: las citas de los motores de IA van por detrás de las clasificaciones de SEO en semanas o meses. La clasificación de una página en Google hoy aparecerá en las citas de ChatGPT, Claude o Perplexity más adelante. Este tutorial crea el rastreador que mide el retraso.
Requisitos previos
- Python 3.10+
- Una clave API de Scavio
- Postgres o DuckDB para almacenamiento de series temporales
Guia paso a paso
Paso 1: Obtenga clasificaciones SERP diariamente
Instantánea SERP estándar de Google por palabra clave rastreada.
import requests, os, datetime
API_KEY = os.environ['SCAVIO_API_KEY']
def serp_snapshot(keyword):
r = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'query': keyword, 'num_results': 10})
return [x['link'] for x in r.json().get('organic_results', [])]Paso 2: Extraer citas de descripciones generales de IA
Las descripciones generales de IA de Google citan fuentes directamente.
def ai_overview_citations(keyword):
r = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'query': keyword, 'include_ai_overview': True})
ao = r.json().get('ai_overview', {})
return ao.get('citations', [])Paso 3: Almacene ambos en una serie temporal
Una fila por (palabra clave, URL, fecha, superficie).
import duckdb
db = duckdb.connect('citations.duckdb')
db.execute('CREATE TABLE IF NOT EXISTS citations(keyword TEXT, url TEXT, date DATE, surface TEXT)')
def record(keyword):
today = datetime.date.today()
for u in serp_snapshot(keyword):
db.execute('INSERT INTO citations VALUES (?, ?, ?, ?)', (keyword, u, today, 'serp'))
for c in ai_overview_citations(keyword):
db.execute('INSERT INTO citations VALUES (?, ?, ?, ?)', (keyword, c, today, 'ai_overview'))Paso 4: Calcular el retraso de las citas
Para cada URL, mida los días entre el primer ranking SERP y la primera cita de IA.
def lag_days(keyword):
return db.execute('''
SELECT url,
MIN(CASE WHEN surface='serp' THEN date END) AS first_serp,
MIN(CASE WHEN surface='ai_overview' THEN date END) AS first_ai
FROM citations WHERE keyword=?
GROUP BY url
''', (keyword,)).fetchall()Paso 5: Visualice la distribución del retraso
Espere una cola larga: la mayoría de las URL tienen un retraso de 30 a 90 días.
# Plot with matplotlib or pipe into Superset
import statistics
def mean_lag(keyword):
rows = lag_days(keyword)
diffs = [(r[2] - r[1]).days for r in rows if r[1] and r[2]]
return statistics.mean(diffs) if diffs else NoneEjemplo en Python
import os, requests
API_KEY = os.environ['SCAVIO_API_KEY']
def track(keyword):
r = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'query': keyword, 'include_ai_overview': True})
return {'serp': r.json().get('organic_results', []), 'ao': r.json().get('ai_overview', {})}
print(track('best ai web scraping tools 2026'))Ejemplo en JavaScript
const API_KEY = process.env.SCAVIO_API_KEY;
export async function track(keyword) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: { 'x-api-key': API_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ query: keyword, include_ai_overview: true })
});
const d = await r.json();
return { serp: d.organic_results || [], ao: d.ai_overview || {} };
}Salida esperada
Time-series of SERP ranks vs AI citations per keyword. Mean citation lag visible, queryable per URL.