Les annonces Google Ads révèlent la stratégie de messagerie, les propositions de valeur et les offres promotionnelles de vos concurrents. Surveiller l'évolution des textes publicitaires vous aide à garder une longueur d'avance sur le positionnement de vos concurrents et à identifier rapidement les nouvelles campagnes. L'API Scavio inclut les résultats d'annonces payantes dans sa réponse SERP, contenant le titre, la description, l'URL affichée et le nom de l'annonceur. Ce tutoriel construit un script qui suit les textes publicitaires pour un ensemble de mots-clés, enregistre des instantanés au format JSON et compare les modifications entre les exécutions.
Prérequis
- Python 3.8 ou supérieur
- bibliothèque requests installée
- Une clé API Scavio
- Une liste de mots-clés pour lesquels les concurrents diffusent des annonces
Parcours
Étape 1: Récupérer les résultats SERP incluant les annonces
Interrogez Google via Scavio. La réponse inclut un tableau ads avec le titre, la description et le display_url pour chaque résultat payant.
import requests
def get_ads(keyword: str) -> list[dict]:
r = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"query": keyword, "country_code": "us"}
)
r.raise_for_status()
return r.json().get("ads", [])Étape 2: Extraire les détails des textes publicitaires
Analyser chaque annonce pour le titre, la description, l'URL affichée et le domaine de l'annonceur.
def parse_ad(ad: dict) -> dict:
return {
"headline": ad.get("title", ""),
"description": ad.get("description", ""),
"display_url": ad.get("displayed_link", ""),
"link": ad.get("link", ""),
}Étape 3: Enregistrer l'instantané de l'annonce au format JSON
Stockez chaque exécution sous forme d'instantané horodaté afin de pouvoir comparer les textes publicitaires entre les exécutions.
import json
from datetime import datetime
def save_snapshot(keyword: str, ads: list[dict]) -> None:
snapshot = {
"keyword": keyword,
"timestamp": datetime.now().isoformat(),
"ads": [parse_ad(a) for a in ads]
}
filename = f"ads_{keyword.replace(' ', '_')}_{datetime.now().strftime('%Y%m%d')}.json"
with open(filename, "w") as f:
json.dump(snapshot, f, indent=2)Étape 4: Comparer les textes publicitaires entre deux instantanés
Comparez deux fichiers d'instantanés pour détecter les nouvelles annonces, les annonces supprimées et les textes modifiés.
def diff_snapshots(old_file: str, new_file: str) -> dict:
with open(old_file) as f:
old = {a["link"]: a for a in json.load(f)["ads"]}
with open(new_file) as f:
new = {a["link"]: a for a in json.load(f)["ads"]}
return {
"new_ads": [new[k] for k in new if k not in old],
"removed_ads": [old[k] for k in old if k not in new],
"changed": [new[k] for k in new if k in old and new[k] != old[k]],
}Exemple Python
import os
import json
import requests
from datetime import datetime
API_KEY = os.environ.get("SCAVIO_API_KEY", "your_scavio_api_key")
ENDPOINT = "https://api.scavio.dev/api/v1/search"
KEYWORDS = ["crm software", "project management tool", "email marketing platform"]
def get_ads(keyword: str) -> list[dict]:
r = requests.post(ENDPOINT, headers={"x-api-key": API_KEY},
json={"query": keyword, "country_code": "us"})
r.raise_for_status()
return r.json().get("ads", [])
def monitor():
for kw in KEYWORDS:
ads = get_ads(kw)
print(f"\n{kw}: {len(ads)} ads")
for ad in ads:
print(f" {ad.get('title', 'N/A')}")
print(f" {ad.get('description', '')[:80]}")
snapshot = {"keyword": kw, "ts": datetime.now().isoformat(), "ads": ads}
with open(f"ads_{kw.replace(' ', '_')}.json", "w") as f:
json.dump(snapshot, f, indent=2)
if __name__ == "__main__":
monitor()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");
async function getAds(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();
return data.ads || [];
}
async function main() {
const keywords = ["crm software", "project management tool"];
for (const kw of keywords) {
const ads = await getAds(kw);
console.log(`\n${kw}: ${ads.length} ads`);
ads.forEach(a => console.log(` ${a.title}`));
fs.writeFileSync(`ads_${kw.replace(/ /g, "_")}.json`, JSON.stringify({ keyword: kw, ads }, null, 2));
}
}
main().catch(console.error);Sortie attendue
crm software: 4 ads
Salesforce CRM - The #1 CRM Platform
Start your free trial today. Trusted by 150,000+ businesses worldwide.
HubSpot CRM - Free Forever CRM
Get started with a CRM that scales. No credit card required.
project management tool: 3 ads
Monday.com - Work Management Platform
Manage projects, workflows, and tasks in one place.