Extraire YouTube avec Python : 4 méthodes qui fonctionnent vraiment

Dernière mise à jour le April 15, 2026

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’usageQui en a besoinDonnées concernées
Analyse concurrentielleÉquipes marketing, stratèges contenuNombre de vues, fréquence de publication, taux d’engagement
Génération de leadsÉquipes commerciales, prospection B2BInfos de contact de la chaîne, e-mails professionnels dans les descriptions
Étude de marchéChefs de produit, analystesSujets tendance, sentiment du public via les commentaires
Stratégie de contenuYouTubeurs, agencesFormats performants, schémas de titres/tags efficaces
SEO / recherche de mots-clésSpécialistes SEOTitres de vidéos, tags, descriptions, signaux de classement
Veille de marqueÉquipes RP, responsables de marqueMentions dans les titres, commentaires, descriptions
Recherche académiqueChercheurs, data scientistsJeux 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 commentaires
  • ytInitialPlayerResponse — 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èrerequests + BS4 (ytInitialData)Selenium / Playwrightyt-dlpAPI YouTube DataSans code (Thunderbit)
Complexité d’installationFaibleMoyenneFaibleMoyenne (clé API)Aucune
Gère le rendu JSPartiellement (analyse JSON)OuiOuiN/A (API structurée)Oui
VitesseRapideLenteRapideRapideRapide (cloud)
Risque anti-botMoyenÉlevéFaibleAucunGéré
Quota / limites de débitAucun (mais blocages IP)Aucun (mais détection)Aucun10 000 unités/jourBasé sur des crédits
Extraction des commentairesDifficilePossible mais complexeIntégréIntégréDépend de la page
TranscriptionsNonComplexeOuiNonNon
Idéal pourMétadonnées rapidesRésultats de recherche, pages dynamiquesMétadonnées + commentaires en masseDonnées structurées à grande échelleNon-codeurs, exports rapides

Résumé rapide : youtube-scraping-methods.webp

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éesBS4 (ytInitialData)Selenium/Playwrightyt-dlpAPI YouTubeThunderbit
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.

extracted-data-categories.webp

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
Ke
Ke
CTO @ Thunderbit. Ke is the person everyone pings when data gets messy. He's spent his career turning tedious, repetitive work into quiet little automations that just run. If you've ever wished a spreadsheet could fill itself in, Ke has probably already built the thing that does it.
Table des matières

Essaie Thunderbit

Extrayez des leads et d’autres données en seulement 2 clics. Propulsé par l’IA.

Obtenir Thunderbit C’est gratuit
Extraire des données grâce à l’IA
Transfère facilement les données vers Google Sheets, Airtable ou Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week