Le suivi du classement SEO nécessite de vérifier régulièrement où vos pages apparaissent dans les résultats de recherche Google pour des mots-clés cibles. Les outils SEO commerciaux facturent des centaines de dollars par mois pour cette fonctionnalité. L'API Scavio vous permet de créer votre propre outil de suivi avec un script Python simple qui stocke les positions quotidiennes dans un CSV ou une base de données et vous alerte des changements importants. Ce tutoriel couvre la construction d'un pipeline de suivi de classement qui vérifie jusqu'à 20 mots-clés par exécution et enregistre l'historique des positions.
Prérequis
- Python 3.8 ou supérieur
- Bibliothèque requests installée
- Une clé API Scavio
- Une liste de mots-clés cibles et votre domaine à suivre
Parcours
Étape 1: Définir les mots-clés et le domaine cible
Créez une liste de chaînes de mots-clés et du domaine que vous souhaitez suivre. Le script analysera les résultats pour toute URL contenant votre domaine.
KEYWORDS = ["python web framework", "fastapi tutorial", "django vs flask"]
TARGET_DOMAIN = "mysite.com"Étape 2: Récupérer la SERP et trouver le classement
Pour chaque mot-clé, envoyez une requête POST à l'endpoint Google de Scavio et parcourez organic_results pour trouver une URL correspondant à votre domaine. Retournez la position si trouvée.
def get_rank(keyword: str, domain: str) -> int | None:
data = search_google(keyword)
for r in data.get("organic_results", []):
if domain in r.get("link", ""):
return r["position"]
return NoneÉtape 3: Enregistrer les résultats dans un CSV
Ajoutez le résultat de classement de chaque mot-clé avec un horodatage à un fichier CSV pour suivre les positions dans le temps.
import csv
from datetime import date
def save_rank(keyword: str, rank: int | None) -> None:
with open("rankings.csv", "a", newline="") as f:
writer = csv.writer(f)
writer.writerow([date.today().isoformat(), keyword, rank or "not ranked"])Étape 4: Exécuter la tâche de suivi quotidien
Parcourez tous les mots-clés, récupérez les classements, enregistrez les résultats et affichez un résumé. Planifiez ce script pour qu'il s'exécute quotidiennement avec cron ou un planificateur de tâches.
def run_tracker():
for kw in KEYWORDS:
rank = get_rank(kw, TARGET_DOMAIN)
save_rank(kw, rank)
status = f"#{rank}" if rank else "not ranked"
print(f"{kw}: {status}")
run_tracker()Exemple Python
import os
import csv
import requests
from datetime import date
API_KEY = os.environ.get("SCAVIO_API_KEY", "your_scavio_api_key")
ENDPOINT = "https://api.scavio.dev/api/v1/search"
KEYWORDS = ["python web framework", "fastapi tutorial"]
TARGET_DOMAIN = "mysite.com"
def search_google(q: str) -> dict:
r = requests.post(ENDPOINT, headers={"x-api-key": API_KEY},
json={"query": q, "country_code": "us"})
r.raise_for_status()
return r.json()
def get_rank(keyword: str) -> int | None:
data = search_google(keyword)
for r in data.get("organic_results", []):
if TARGET_DOMAIN in r.get("link", ""):
return r["position"]
return None
def run():
with open("rankings.csv", "a", newline="") as f:
w = csv.writer(f)
for kw in KEYWORDS:
rank = get_rank(kw)
w.writerow([date.today().isoformat(), kw, rank or ""])
print(f"{kw}: {'#' + str(rank) if rank else 'not ranked'}")
if __name__ == "__main__":
run()Exemple JavaScript
const API_KEY = process.env.SCAVIO_API_KEY || "your_scavio_api_key";
const ENDPOINT = "https://api.scavio.dev/api/v1/search";
const fs = require("fs");
const KEYWORDS = ["python web framework", "fastapi tutorial"];
const TARGET_DOMAIN = "mysite.com";
async function getRank(keyword) {
const res = await fetch(ENDPOINT, {
method: "POST",
headers: { "x-api-key": API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ query: keyword, country_code: "us" })
});
const data = await res.json();
const match = (data.organic_results || []).find(r => r.link.includes(TARGET_DOMAIN));
return match ? match.position : null;
}
async function run() {
const today = new Date().toISOString().slice(0, 10);
for (const kw of KEYWORDS) {
const rank = await getRank(kw);
const line = `${today},${kw},${rank || ""}\n`;
fs.appendFileSync("rankings.csv", line);
console.log(`${kw}: ${rank ? "#" + rank : "not ranked"}`);
}
}
run().catch(console.error);Sortie attendue
python web framework: #4
fastapi tutorial: #2
rankings.csv preview:
2026-04-16,python web framework,4
2026-04-16,fastapi tutorial,2