Les impressions YouTube diminuent après la publication : les vidéos atteignent un pic de visibilité dans les recherches en quelques jours, puis baissent progressivement à mesure que de nouveaux contenus entrent en concurrence. Suivre cette baisse aide les créateurs à comprendre la durée de vie de leur contenu. Ce tutoriel suit la position dans les recherches au fil du temps en utilisant des requêtes API quotidiennes au lieu de se fier à YouTube Studio (qui ne montre que vos propres vidéos).
Prérequis
- Python 3.8+
- Une clé API Scavio
- URLs de vidéos ou mots-clés à suivre
Parcours
Étape 1: Suivre la position d'un mot-clé dans les recherches
Interrogez YouTube quotidiennement via API et enregistrez le classement de votre vidéo.
import requests, os, json
from datetime import date
H = {'x-api-key': os.environ['SCAVIO_API_KEY'], 'Content-Type': 'application/json'}
def track_position(keyword: str, target_channel: str) -> dict:
resp = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': 'youtube', 'query': keyword}, timeout=10)
results = resp.json().get('organic', [])
for i, r in enumerate(results):
if target_channel.lower() in r.get('channel', '').lower():
return {'keyword': keyword, 'position': i + 1, 'date': date.today().isoformat(),
'title': r.get('title', ''), 'views': r.get('views', '')}
return {'keyword': keyword, 'position': None, 'date': date.today().isoformat(), 'not_found': True}Étape 2: Construire une boucle de suivi quotidien
Suivez plusieurs mots-clés chaque jour et stockez l'historique des positions.
from pathlib import Path
def daily_rank_track(keywords: list, channel: str) -> dict:
history_file = Path('yt_rank_history.json')
history = json.loads(history_file.read_text()) if history_file.exists() else {}
today = date.today().isoformat()
today_data = []
for kw in keywords:
position = track_position(kw, channel)
today_data.append(position)
history[today] = today_data
history_file.write_text(json.dumps(history, indent=2))
return {'date': today, 'tracked': len(keywords), 'found': sum(1 for d in today_data if d.get('position')),
'positions': today_data}Étape 3: Calculer le taux de déclin
Analysez l'historique des positions pour calculer les courbes de déclin des impressions.
def calculate_decay(history: dict, keyword: str) -> dict:
positions = []
for day, data in sorted(history.items()):
for entry in data:
if entry.get('keyword') == keyword and entry.get('position'):
positions.append({'date': day, 'position': entry['position']})
if len(positions) < 2:
return {'keyword': keyword, 'insufficient_data': True}
first_pos = positions[0]['position']
last_pos = positions[-1]['position']
days_tracked = len(positions)
decay_rate = (last_pos - first_pos) / days_tracked if days_tracked > 0 else 0
return {
'keyword': keyword,
'first_position': first_pos,
'current_position': last_pos,
'days_tracked': days_tracked,
'decay_rate_per_day': round(decay_rate, 2),
'positions_lost': last_pos - first_pos,
'trend': 'declining' if decay_rate > 0.1 else 'stable' if abs(decay_rate) < 0.1 else 'improving',
}Étape 4: Générer un rapport de déclin
Produisez un rapport récapitulatif indiquant quel contenu décline le plus rapidement.
def decay_report(history_file: str = 'yt_rank_history.json') -> dict:
history = json.loads(Path(history_file).read_text())
keywords = set()
for day_data in history.values():
for entry in day_data:
if entry.get('keyword'):
keywords.add(entry['keyword'])
decays = [calculate_decay(history, kw) for kw in keywords]
decays = [d for d in decays if not d.get('insufficient_data')]
decays.sort(key=lambda d: d.get('decay_rate_per_day', 0), reverse=True)
return {
'total_keywords': len(decays),
'fastest_decaying': decays[:3],
'most_stable': [d for d in decays if d.get('trend') == 'stable'],
'improving': [d for d in decays if d.get('trend') == 'improving'],
}Exemple Python
import requests, os, json
from datetime import date
def track_yt_rank(keyword, channel):
r = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': os.environ['SCAVIO_API_KEY'], 'Content-Type': 'application/json'},
json={'platform': 'youtube', 'query': keyword}).json()
for i, v in enumerate(r.get('organic',[])):
if channel.lower() in v.get('channel','').lower():
return i + 1
return NoneExemple JavaScript
async function trackYTRank(keyword, channel) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'},
body: JSON.stringify({platform: 'youtube', query: keyword})
});
const results = (await r.json()).organic || [];
const idx = results.findIndex(v => v.channel?.toLowerCase().includes(channel.toLowerCase()));
return idx >= 0 ? idx + 1 : null;
}Sortie attendue
A YouTube impression decay tracker that monitors search position daily and calculates decay rates per keyword, identifying content that needs refreshing.