r/AIRankingStrategy confirme le schéma de 2026 : les citations des moteurs d'IA sont en retard sur les classements SEO de plusieurs semaines à plusieurs mois. Une page classée sur Google aujourd'hui apparaîtra plus tard dans les citations de ChatGPT, Claude ou Perplexity. Ce tutoriel construit le tracker qui mesure ce retard.
Prérequis
- Python 3.10+
- Une clé API Scavio
- Postgres ou DuckDB pour le stockage en séries temporelles
Parcours
Étape 1: Extraire les classements SERP quotidiennement
Instantané standard du SERP Google par mot-clé suivi.
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', [])]Étape 2: Extraire les citations des AI Overviews
Les AI Overviews de Google citent directement leurs sources.
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', [])Étape 3: Stocker les deux dans une série temporelle
Une ligne par (mot-clé, url, date, surface).
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'))Étape 4: Calculer le retard des citations
Pour chaque URL, mesurer les jours entre le premier classement SERP et la première citation 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()Étape 5: Visualiser la distribution des retards
Attendez-vous à une longue traîne : la plupart des URLs accusent un retard de 30 à 90 jours.
# 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 NoneExemple 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'))Exemple 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 || {} };
}Sortie attendue
Time-series of SERP ranks vs AI citations per keyword. Mean citation lag visible, queryable per URL.