Si tu as déjà essayé requests.get("https://www.youtube.com/...") puis analysé le résultat avec BeautifulSoup à la recherche des titres de vidéos, tu connais déjà la conclusion : tu te retrouves avec un mur de <div> vides et zéro donnée exploitable.
C’est la galère la plus courante que je vois chez les développeurs qui tentent d’extraire des données YouTube pour la première fois. YouTube est une application monopage : presque tout est rendu côté client via JavaScript. Le HTML reçu par ton script Python n’est qu’une coque vide. Les vrais titres de vidéos, le nombre de vues et les métadonnées ? Ils sont planqués dans un énorme bloc JSON appelé ytInitialData, injecté par JavaScript après le chargement de la page.
Donc, ton très raisonnable soup.find("div", class_="ytd-video-renderer") renvoie None parce que cet élément n’existe tout simplement pas dans la réponse HTTP brute. Une fois que j’ai compris ça, tout a été limpide — et les quatre méthodes ci-dessous sont le résultat de beaucoup de tests, de bugs casse-tête, et de trop nombreux tickets GitHub lus. Je vais te guider pas à pas, te montrer exactement quand utiliser chaque approche, et glisser à la fin un raccourci sans code pour ceux qui veulent simplement les données sans se prendre la tête avec la config du projet.
Pourquoi extraire YouTube avec Python au départ ?
YouTube n’est pas seulement une plateforme vidéo — c’est une source de données colossale avec . Avec et , il existe une quantité énorme d’infos publiques que les entreprises, les chercheurs et les créateurs veulent analyser automatiquement.
Le souci, c’est que les analyses intégrées de YouTube ne montrent que les données de ta propre chaîne. Si tu veux comprendre la cadence de publication d’un concurrent, suivre les sujets tendance dans ta niche, ou analyser le sentiment du public à partir des commentaires sur les vidéos de quelqu’un d’autre, il faut extraire les données.
Voici les cas d’usage concrets les plus courants que j’ai rencontrés :
| Cas d’usage | Qui en a besoin | Données concernées |
|---|---|---|
| Analyse concurrentielle | Équipes marketing, stratèges contenu | Nombre de vues, fréquence de publication, taux d’engagement |
| Génération de leads | Équipes commerciales, prospection B2B | Infos de contact de la chaîne, e-mails professionnels dans les descriptions |
| Étude de marché | Chefs de produit, analystes | Sujets tendance, sentiment du public via les commentaires |
| Stratégie de contenu | YouTubeurs, agences | Formats performants, schémas de titres/tags efficaces |
| SEO / recherche de mots-clés | Spécialistes SEO | Titres de vidéos, tags, descriptions, signaux de classement |
| Veille de marque | Équipes RP, responsables de marque | Mentions dans les titres, commentaires, descriptions |
| Recherche académique | Chercheurs, data scientists | Jeux de commentaires pour l’analyse de sentiment (une étude de 2025 a atteint 93,1 % de précision en ajustant BERT sur 45 000 commentaires YouTube) |
Une analyse concurrentielle DJI vs GoPro vs Insta360, par exemple, a montré que — un type d’insight totalement invisible depuis YouTube Studio.
Pourquoi requests + BeautifulSoup seuls ne suffisent pas pour YouTube
Avant d’aborder les méthodes qui marchent, il faut comprendre pourquoi l’approche évidente plante. Ce n’est pas un détail académique — ça te fera gagner des heures de débogage.
L’approche « logique » ressemble à ça, en théorie :
1import requests
2from bs4 import BeautifulSoup
3response = requests.get("https://www.youtube.com/@somechannel/videos")
4soup = BeautifulSoup(response.text, "html.parser")
5videos = soup.find_all("a", id="video-title-link")
6print(len(videos)) # 0 — à chaque fois
Le résultat est toujours zéro. Comme le dit : « La page a été chargée dynamiquement, ce que la librairie requests ne prend pas en charge. » est encore plus direct : « Avec requests et BeautifulSoup seuls, tu ne peux pas exécuter JavaScript. »
explique le mécanisme : YouTube est construit comme une Single Page Application (SPA). Quand tu fais une simple requête HTTP, tu ne reçois que le HTML initial — le contenu réel n’a pas encore été rendu. Les données vidéo sont cachées dans des objets JavaScript qu’un navigateur exécute normalement puis injecte dans le DOM.
Bonne nouvelle : YouTube embarque bien toutes les données dont tu as besoin dans le HTML brut. Elles ne se trouvent simplement pas dans les éléments DOM, mais dans deux blocs JSON à l’intérieur de balises <script> :
ytInitialData— structure de la page, liste des vidéos, métriques d’engagement, jetons de continuation des commentairesytInitialPlayerResponse— métadonnées essentielles de la vidéo (titre, description, durée, formats, sous-titres)
Les deux sont accessibles avec un simple requests.get() — sans navigateur — à condition de savoir comment les extraire et les parser. C’est la méthode 1 ci-dessous.
4 façons d’extraire YouTube avec Python : comparaison directe
Avant d’entrer dans le détail, voici une grille de décision. J’ai testé les quatre approches et je les ai comparées selon les critères qui comptent vraiment quand on choisit un outil pour un vrai projet.
| Critère | requests + BS4 (ytInitialData) | Selenium / Playwright | yt-dlp | API YouTube Data | Sans code (Thunderbit) |
|---|---|---|---|---|---|
| Complexité d’installation | Faible | Moyenne | Faible | Moyenne (clé API) | Aucune |
| Gère le rendu JS | Partiellement (analyse JSON) | Oui | Oui | N/A (API structurée) | Oui |
| Vitesse | Rapide | Lente | Rapide | Rapide | Rapide (cloud) |
| Risque anti-bot | Moyen | Élevé | Faible | Aucun | Géré |
| Quota / limites de débit | Aucun (mais blocages IP) | Aucun (mais détection) | Aucun | 10 000 unités/jour | Basé sur des crédits |
| Extraction des commentaires | Difficile | Possible mais complexe | Intégré | Intégré | Dépend de la page |
| Transcriptions | Non | Complexe | Oui | Non | Non |
| Idéal pour | Métadonnées rapides | Résultats de recherche, pages dynamiques | Métadonnées + commentaires en masse | Données structurées à grande échelle | Non-codeurs, exports rapides |
Résumé rapide :

Quelles données YouTube peut-on réellement extraire, et avec quelle méthode ?
Voici le tableau de référence que j’aurais aimé avoir au début. Aucune méthode ne couvre tous les champs — c’est précisément pour ça que cet article en présente quatre.
| Champ de données | BS4 (ytInitialData) | Selenium/Playwright | yt-dlp | API YouTube | Thunderbit |
|---|---|---|---|---|---|
| Titre de la vidéo | ✅ | ✅ | ✅ | ✅ | ✅ |
| Nombre de vues | ✅ | ✅ | ✅ | ✅ | ✅ |
| Nombre de likes | ⚠️ Inconstant | ✅ | ✅ | ✅ | ✅ |
| Commentaires (texte) | ❌ | ⚠️ Complexe | ✅ | ✅ | ⚠️ |
| Transcription / sous-titres | ❌ | ⚠️ | ✅ | ❌ | ❌ |
| Tags | ✅ | ✅ | ✅ | ✅ | ⚠️ |
| URL des miniatures | ✅ | ✅ | ✅ | ✅ | ✅ |
| Nombre d’abonnés de la chaîne | ⚠️ | ✅ | ✅ | ✅ | ✅ |
| Date de mise en ligne | ✅ | ✅ | ✅ | ✅ | ✅ |
| Durée de la vidéo | ✅ | ✅ | ✅ | ✅ | ✅ |
| Données spécifiques aux Shorts | ❌ | ⚠️ | ✅ | ⚠️ | ⚠️ |
Choisis ta méthode selon les lignes qui comptent le plus pour ton projet. Si tu as besoin de commentaires et de transcriptions, yt-dlp est le grand gagnant. Si tu veux des stats structurées à une échelle modérée, l’API est la meilleure option. Si tu veux les données en deux minutes, continue jusqu’à la section Thunderbit.

Méthode 1 : extraire YouTube avec Python via requests + BeautifulSoup (analyse de ytInitialData)
Cette méthode exploite le fait que YouTube embarque toutes les données de page sous forme de JSON dans le HTML brut. Tu n’as pas besoin d’un navigateur — il suffit de savoir où regarder.
- Niveau : Débutant
- Temps nécessaire : ~15 minutes
- Prérequis : Python 3.10+,
requests,beautifulsoup4
Étape 1 : envoyer une requête GET à la page YouTube
Envoie une requête avec un User-Agent réaliste. L’en-tête par défaut python-requests/2.x est bloqué presque immédiatement — le guide sur les en-têtes de confirme que c’est le piège numéro un pour les débutants.
1import requests
2HEADERS = {
3 "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) "
4 "AppleWebKit/537.36 (KHTML, like Gecko) "
5 "Chrome/114.0.0.0 Safari/537.36",
6 "Accept-Language": "en-US,en;q=0.9",
7 "Cookie": "CONSENT=YES+cb", # contourne l’écran de consentement UE
8}
9url = "https://www.youtube.com/@mkbhd/videos"
10response = requests.get(url, headers=HEADERS)
11print(response.status_code) # devrait être 200
Le cookie CONSENT est essentiel — sans lui, les requêtes venant de l’UE redirigent vers consent.youtube.com, qui sert un HTML dépourvu de ytInitialData.
Étape 2 : analyser le HTML et localiser le script ytInitialData
Utilise BeautifulSoup ou une regex pour repérer la balise <script> contenant var ytInitialData = :
1import re
2import json
3# Extraire le JSON ytInitialData
4match = re.search(
5 r"var ytInitialData\s*=\s*({.*?});</script>",
6 response.text,
7 re.DOTALL
8)
9if match:
10 data = json.loads(match.group(1))
11 print("ytInitialData extrait avec succès")
12else:
13 print