Aperçu
La plupart des outils de suivi de classement facturent par mot-clé par mois. Pour 4 000 mots-clés, les factures dépassent 200 $/mois pour des données que les équipes ne consultent qu'hebdomadairement. Ce workflow exécute une vérification de classement par lots chaque dimanche soir, stocke les résultats dans une base de données et génère un rapport de différences comparant cette semaine à la précédente. Coût hebdomadaire total : 20 $.
Déclencheur
Planification Cron : tous les dimanches à 23h UTC.
Planification
Hebdomadaire (dimanche 23h UTC)
Étapes du workflow
Charger la liste de mots-clés depuis la base de données
Lire toutes les paires mot-clé-localisation depuis la table keywords. Chaque ligne contient le texte du mot-clé, le pays cible et le domaine suivi.
Requête par lots sur tous les mots-clés
Parcourir les 4 000 mots-clés avec un délai de 200 ms entre les requêtes. Pour chaque mot-clé, récupérer les 10 premiers résultats organiques et extraire la position du domaine cible.
Stocker les résultats avec horodatage
Écrire chaque résultat dans la table rankings avec la date actuelle. Inclure la position, l'URL et le titre pour le domaine cible et les 3 principaux concurrents.
Générer un rapport de différences hebdomadaire
Comparer les positions de cette semaine avec celles de la semaine dernière. Marquer les mots-clés qui ont gagné ou perdu 3 positions ou plus. Résumer les mouvements dans un rapport.
Envoyer le rapport sur Slack ou par e-mail
Pousser le rapport de différences hebdomadaire sur Slack ou par e-mail. Inclure les meilleurs gagnants, les meilleurs perdants et les mots-clés nouvellement entrés ou supprimés.
Implémentation Python
import requests, os, json, time
from datetime import date
API_KEY = os.environ["SCAVIO_API_KEY"]
KEYWORDS = json.load(open("keywords.json")) # [{"kw":"...","cc":"us","domain":"example.com"}, ...]
def check_rank(kw, cc, target_domain):
resp = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY, "Content-Type": "application/json"},
json={"query": kw, "country_code": cc},
timeout=15,
)
data = resp.json()
position = None
for r in data.get("organic_results", []):
if target_domain in r.get("link", ""):
position = r.get("position")
break
return {"keyword": kw, "country": cc, "date": str(date.today()), "position": position}
results = []
for item in KEYWORDS:
results.append(check_rank(item["kw"], item["cc"], item["domain"]))
time.sleep(0.2)
with open(f"ranks_{date.today()}.json", "w") as f:
json.dump(results, f, indent=2)
print(f"Checked {len(results)} keywords, {sum(1 for r in results if r['position'])} found")Implémentation JavaScript
const fs = require('fs');
const KEYWORDS = JSON.parse(fs.readFileSync('keywords.json','utf8'));
const H = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
async function checkRank(kw, cc, domain) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {method:'POST', headers:H, body:JSON.stringify({query:kw, country_code:cc})});
const d = await r.json();
const match = (d.organic_results||[]).find(r=>(r.link||'').includes(domain));
return {keyword:kw, country:cc, date:new Date().toISOString().slice(0,10), position:match?.position||null};
}
const results = [];
for (const k of KEYWORDS) { results.push(await checkRank(k.kw, k.cc, k.domain)); await new Promise(r=>setTimeout(r,200)); }
fs.writeFileSync('ranks_'+new Date().toISOString().slice(0,10)+'.json', JSON.stringify(results,null,2));
console.log(results.length+' keywords checked');Plateformes utilisées
Recherche web avec graphe de connaissances, PAA et aperçus IA