Le scraping de YouTube est fragile — les mises en page changent, les limites de débit se déclenchent, et l'automatisation du navigateur est lente. Les API SERP renvoient les données vidéo YouTube sous forme de résultats structurés lorsque vous recherchez avec site:youtube.com. Vous obtenez les titres des vidéos, les noms des chaînes, le nombre de vues et les dates de mise en ligne sans Selenium, Playwright, ni les quotas de la YouTube Data API. Chaque recherche coûte 0,005 $ et renvoie jusqu'à 10 résultats vidéo.
Prérequis
- Python 3.9+ ou Node.js 18+
- bibliothèque requests installée
- Une clé API Scavio depuis scavio.dev
Parcours
Étape 1: Rechercher YouTube via l'API SERP
Utilisez site:youtube.com dans votre requête de recherche pour obtenir des résultats exclusivement YouTube. L'API SERP renvoie des données structurées incluant les titres des vidéos et les informations de chaîne.
import requests, os
SCAVIO_KEY = os.environ['SCAVIO_API_KEY']
def search_youtube(query: str, count: int = 10) -> list:
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json'},
json={'query': f'site:youtube.com {query}',
'country_code': 'us', 'num_results': count})
resp.raise_for_status()
results = resp.json().get('organic_results', [])
videos = []
for r in results:
link = r.get('link', '')
if 'youtube.com/watch' in link or 'youtu.be/' in link:
videos.append({
'title': r['title'].replace(' - YouTube', '').strip(),
'url': link,
'snippet': r.get('snippet', ''),
'channel': extract_channel(r.get('snippet', '')),
})
return videos
def extract_channel(snippet: str) -> str:
# YouTube snippets often start with channel name or duration
parts = snippet.split('\n') if '\n' in snippet else snippet.split(' ... ')
return parts[0].strip() if parts else ''
videos = search_youtube('python tutorial 2026')
for v in videos[:5]:
print(f'{v["title"][:50]}: {v["channel"][:30]}')
print(f'Cost: $0.005 for {len(videos)} videos')Étape 2: Construire un pipeline de recherche vidéo
Recherchez plusieurs sujets et agrégerez les données vidéo pour une analyse concurrentielle, une recherche de contenu ou une découverte d'influenceurs.
import time
def research_videos(topics: list) -> dict:
all_videos = {}
for topic in topics:
videos = search_youtube(topic, count=10)
all_videos[topic] = videos
time.sleep(0.3)
# Aggregate stats
total_videos = sum(len(v) for v in all_videos.values())
channels = set()
for videos in all_videos.values():
for v in videos:
if v['channel']:
channels.add(v['channel'])
print(f'Topics: {len(topics)}')
print(f'Total videos found: {total_videos}')
print(f'Unique channels: {len(channels)}')
print(f'Cost: {len(topics)} queries = ${len(topics) * 0.005:.3f}')
return all_videos
topics = ['python api tutorial', 'javascript tutorial 2026', 'react hooks explained']
data = research_videos(topics)
for topic, videos in data.items():
print(f'\n{topic}: {len(videos)} videos')
for v in videos[:2]:
print(f' {v["title"][:50]}')Étape 3: Comparer avec l'approche de l'API YouTube Data
Montrez la différence entre l'API SERP et l'API YouTube Data en termes de configuration, de quotas et de coût.
comparison = {
'SERP API (Scavio)': {
'setup': 'One API key, one POST call',
'quota': 'No daily quota, pay per query',
'cost': '$0.005/query (250 free/month)',
'data': 'Title, URL, snippet, channel name',
'rate_limit': '10 req/sec',
'auth': 'API key in header',
},
'YouTube Data API v3': {
'setup': 'Google Cloud project, OAuth consent, API enable',
'quota': '10,000 units/day (search = 100 units = 100 searches/day)',
'cost': 'Free up to quota, then blocked',
'data': 'Full metadata, stats, thumbnails',
'rate_limit': 'Quota-based',
'auth': 'OAuth2 or API key + project',
},
'Scraping (Selenium)': {
'setup': 'Browser driver, anti-detection, proxy',
'quota': 'IP-based blocks, unpredictable',
'cost': '$50-200/month for proxy + compute',
'data': 'Anything visible on page',
'rate_limit': '1-2 req/sec safely',
'auth': 'None (but proxies needed)',
},
}
for method, details in comparison.items():
print(f'{method}:')
for key, val in details.items():
print(f' {key}: {val}')
print()Exemple Python
import requests, os
SCAVIO_KEY = os.environ['SCAVIO_API_KEY']
def youtube_search(query, count=10):
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json'},
json={'query': f'site:youtube.com {query}', 'country_code': 'us', 'num_results': count})
return [{'title': r['title'].replace(' - YouTube', ''), 'url': r['link']}
for r in resp.json().get('organic_results', [])
if 'youtube.com/watch' in r.get('link', '')]
videos = youtube_search('python tutorial 2026')
for v in videos[:5]:
print(f'{v["title"][:50]}: {v["url"]}')Exemple JavaScript
const SCAVIO_KEY = process.env.SCAVIO_API_KEY;
async function youtubeSearch(query, count = 10) {
const resp = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: { 'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ query: `site:youtube.com ${query}`, country_code: 'us', num_results: count })
});
const data = await resp.json();
return (data.organic_results || []).filter(r => r.link?.includes('youtube.com/watch'))
.map(r => ({ title: r.title.replace(' - YouTube', ''), url: r.link }));
}
youtubeSearch('python tutorial 2026').then(v => v.forEach(x => console.log(x.title)));Sortie attendue
Python Tutorial for Beginners 2026 - Full Course: Corey Schafer
Learn Python in 1 Hour - 2026 Edition: Programming with Mosh
Python API Tutorial - Build Your First API: Tech With Tim
Cost: $0.005 for 8 videos
SERP API (Scavio):
setup: One API key, one POST call
quota: No daily quota, pay per query
cost: $0.005/query (250 free/month)