L'analyse de la concurrence est une tâche récurrente pour les chefs de produit, les marketeurs et les fondateurs. Vérifier manuellement où les concurrents se classent pour des termes clés, quelles actualités ils génèrent et comment leurs listes de produits évoluent prend du temps. Ce tutoriel construit un pipeline automatisé de veille concurrentielle utilisant l'API Scavio. À partir d'une liste de domaines concurrents, il suit leurs positions SERP organiques pour un ensemble de mots-clés, récupère les mentions récentes dans les actualités et rédige un rapport de synthèse hebdomadaire.
Prérequis
- Python 3.10 ou supérieur
- bibliothèque requests installée
- Une clé API Scavio
- Une liste de domaines concurrents et de mots-clés cibles
Parcours
Étape 1: Définir les concurrents et les mots-clés
Configurer un dictionnaire associant les noms des concurrents à leurs domaines, et une liste de mots-clés à suivre.
COMPETITORS = {
"Acme Corp": "acmecorp.com",
"Beta Tools": "betatools.io",
}
KEYWORDS = ["project management software", "task tracking tool", "team collaboration app"]Étape 2: Suivre les positions SERP pour chaque concurrent
Pour chaque mot-clé, récupérer les résultats SERP et analyser organic_results pour le domaine de chaque concurrent.
def track_positions(keyword: str) -> dict:
data = search_google(keyword)
positions = {}
for name, domain in COMPETITORS.items():
for r in data.get("organic_results", []):
if domain in r.get("link", ""):
positions[name] = r["position"]
break
return positionsÉtape 3: Récupérer les mentions dans les actualités
Rechercher sur Google News chaque nom de concurrent pour trouver des articles récents, des annonces de produits et une couverture médiatique.
def get_news(competitor_name: str) -> list[dict]:
data = search_google(f"{competitor_name} news 2026")
return data.get("news_results", data.get("organic_results", []))[:5]Étape 4: Générer le rapport hebdomadaire
Combiner les classements SERP et les mentions dans les actualités en un rapport structuré et l'enregistrer sous forme de fichier markdown.
from datetime import date
def generate_report() -> str:
lines = [f"# Competitor Intelligence Report — {date.today()}\n"]
for kw in KEYWORDS:
lines.append(f"## {kw}")
positions = track_positions(kw)
for name, pos in positions.items():
lines.append(f" - {name}: #{pos}")
return "\n".join(lines)Exemple Python
import os
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"
COMPETITORS = {"Acme": "acmecorp.com", "Beta": "betatools.io"}
KEYWORDS = ["project management software", "task tracking tool"]
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 track(kw: str) -> dict:
data = search_google(kw)
out = {}
for name, domain in COMPETITORS.items():
for r in data.get("organic_results", []):
if domain in r.get("link", ""):
out[name] = r["position"]
break
return out
if __name__ == "__main__":
for kw in KEYWORDS:
pos = track(kw)
print(f"\n{kw}:")
for name, p in pos.items():
print(f" {name}: #{p}")Exemple JavaScript
const API_KEY = process.env.SCAVIO_API_KEY || "your_scavio_api_key";
const ENDPOINT = "https://api.scavio.dev/api/v1/search";
const COMPETITORS = { "Acme": "acmecorp.com", "Beta": "betatools.io" };
const KEYWORDS = ["project management software", "task tracking tool"];
async function searchGoogle(q) {
const res = await fetch(ENDPOINT, {
method: "POST",
headers: { "x-api-key": API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ query: q, country_code: "us" })
});
return res.json();
}
async function trackPositions(kw) {
const data = await searchGoogle(kw);
const out = {};
for (const [name, domain] of Object.entries(COMPETITORS)) {
const match = (data.organic_results || []).find(r => r.link.includes(domain));
if (match) out[name] = match.position;
}
return out;
}
async function main() {
for (const kw of KEYWORDS) {
const pos = await trackPositions(kw);
console.log(`\n${kw}:`);
Object.entries(pos).forEach(([n, p]) => console.log(` ${n}: #${p}`));
}
}
main().catch(console.error);Sortie attendue
project management software:
Acme: #3
Beta: #7
task tracking tool:
Acme: #5
Beta: not ranked