Se você já tentou requests.get("https://www.youtube.com/...") e depois usou BeautifulSoup para procurar títulos de vídeos, já sabe como termina: volta um monte de <div> vazia e, no fim das contas, nenhum dado útil.
Essa é a frustração mais comum que vejo entre desenvolvedores que tentam fazer scraping no YouTube pela primeira vez. O YouTube é uma aplicação de página única — quase tudo é renderizado no lado do cliente via JavaScript. O HTML que o teu script em Python recebe é só uma casca. Os títulos reais dos vídeos, a contagem de visualizações e os metadados? Eles ficam escondidos dentro de um enorme bloco JSON chamado ytInitialData, que é injetado pelo JS depois que a página carrega.
Ou seja, aquele soup.find("div", class_="ytd-video-renderer") que parece tão razoável retorna None porque esse elemento literalmente não existe na resposta HTTP bruta. Quando entendi isso, tudo fez sentido — e os quatro métodos abaixo são fruto de muito teste, código quebrado e uma quantidade exagerada de issues no GitHub. Vou te mostrar cada abordagem, explicar exatamente quando usar uma ou outra e, no final, deixar um atalho sem código para quem só quer os dados sem montar um projeto inteiro.
Por que extrair dados do YouTube com Python?
O YouTube não é só uma plataforma de vídeo — é uma fonte de dados com . Com e , existe uma quantidade gigantesca de informação pública que empresas, pesquisadores e criadores querem analisar programaticamente.
O problema é que a análise nativa do YouTube só mostra dados do seu próprio canal. Se você quer entender a frequência de postagem de um concorrente, acompanhar temas em alta no seu nicho ou analisar o sentimento do público nos comentários de vídeos de terceiros, precisa fazer scraping.
Aqui estão os casos de uso mais comuns que vejo no dia a dia:
| Caso de uso | Quem precisa disso | Dados envolvidos |
|---|---|---|
| Análise da concorrência | Equipes de marketing, estrategistas de conteúdo | Visualizações, frequência de publicação, taxas de engajamento |
| Geração de leads | Equipes comerciais, prospecção B2B | Informações de contato do canal, e-mails comerciais nas descrições |
| Pesquisa de mercado | Product managers, analistas | Tópicos em alta, sentimento do público nos comentários |
| Estratégia de conteúdo | YouTubers, agências | Formatos com melhor desempenho, padrões ideais de títulos e tags |
| SEO / pesquisa de palavras-chave | Especialistas em SEO | Títulos, tags, descrições e sinais de ranqueamento |
| Monitoramento de marca | Times de PR, gestores de marca | Menções em títulos, comentários e descrições |
| Pesquisa acadêmica | Pesquisadores, cientistas de dados | Conjuntos de comentários para análise de sentimento (um estudo de 2025 atingiu 93,1% de precisão ao ajustar o BERT com 45 mil comentários do YouTube) |
Uma análise competitiva entre DJI, GoPro e Insta360, por exemplo, descobriu que — um tipo de insight impossível de enxergar só dentro do YouTube Studio.
Por que requests + BeautifulSoup sozinho não consegue extrair dados do YouTube
Antes de chegar aos métodos que funcionam, você precisa entender por que a abordagem óbvia falha. Isso não é teoria acadêmica — vai te poupar horas de debug.
A abordagem “óbvia” seria algo assim, em termos conceituais:
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 — sempre
O resultado é sempre zero. Como diz o : “A página foi carregada dinamicamente, o que não é suportado pela biblioteca requests.” O é ainda mais direto: “Usando apenas requests e BeautifulSoup, você não consegue executar JavaScript.”
O explica o mecanismo: o YouTube foi construído como uma Single Page Application (SPA). Quando você faz requisições HTTP básicas, recebe apenas o HTML inicial — o conteúdo real ainda não foi renderizado. Os dados dos vídeos ficam escondidos em objetos JavaScript que o navegador normalmente executaria e injetaria no DOM.
A boa notícia: o YouTube de fato embute todos os dados de que você precisa no HTML bruto. Só que eles não estão em elementos do DOM — estão em dois blocos JSON dentro de tags <script>:
ytInitialData— estrutura da página, listagem de vídeos, métricas de engajamento, tokens de continuação de comentáriosytInitialPlayerResponse— metadados centrais do vídeo (título, descrição, duração, formatos, legendas)
Ambos podem ser acessados com um único requests.get() — sem navegador — desde que você saiba como extrair e interpretar esses dados. Esse é o Método 1 abaixo.
4 formas de extrair dados do YouTube com Python: comparação lado a lado
Antes de entrar em cada método, aqui vai a matriz de decisão. Testei as quatro abordagens e comparei com base nos critérios que realmente importam quando você está escolhendo uma ferramenta para um projeto real.
| Critério | requests + BS4 (ytInitialData) | Selenium / Playwright | yt-dlp | YouTube Data API | Sem código (Thunderbit) |
|---|---|---|---|---|---|
| Complexidade de configuração | Baixa | Média | Baixa | Média (chave de API) | Nenhuma |
| Lida com renderização JS | Parcial (parse de JSON) | Sim | Sim | N/A (API estruturada) | Sim |
| Velocidade | Rápida | Lenta | Rápida | Rápida | Rápida (na nuvem) |
| Risco de anti-bot | Médio | Alto | Baixo | Nenhum | Tratado |
| Cotas / limites de taxa | Nenhum (mas há bloqueios de IP) | Nenhum (mas há detecção) | Nenhum | 10.000 unidades/dia | Baseado em créditos |
| Extração de comentários | Difícil | Possível, mas complexa | Nativo | Nativo | Depende da página |
| Transcrições | Não | Complexo | Sim | Não | Não |
| Melhor para | Metadados rápidos | Resultados de busca, páginas dinâmicas | Metadados em lote + comentários | Dados estruturados em escala | Não programadores, exportações rápidas |
Resumo rápido:

Quais dados do YouTube você realmente consegue extrair — e com qual método?
Esta é a tabela de referência que eu queria ter quando comecei. Nenhum método cobre todos os campos — por isso este artigo traz quatro.
| Campo de dados | BS4 (ytInitialData) | Selenium/Playwright | yt-dlp | YouTube API | Thunderbit |
|---|---|---|---|---|---|
| Título do vídeo | ✅ | ✅ | ✅ | ✅ | ✅ |
| Número de visualizações | ✅ | ✅ | ✅ | ✅ | ✅ |
| Curtidas | ⚠️ Inconsistente | ✅ | ✅ | ✅ | ✅ |
| Comentários (texto) | ❌ | ⚠️ Complexo | ✅ | ✅ | ⚠️ |
| Transcrição/legendas | ❌ | ⚠️ | ✅ | ❌ | ❌ |
| Tags | ✅ | ✅ | ✅ | ✅ | ⚠️ |
| URLs das miniaturas | ✅ | ✅ | ✅ | ✅ | ✅ |
| Número de inscritos do canal | ⚠️ | ✅ | ✅ | ✅ | ✅ |
| Data de envio | ✅ | ✅ | ✅ | ✅ | ✅ |
| Duração do vídeo | ✅ | ✅ | ✅ | ✅ | ✅ |
| Dados específicos de Shorts | ❌ | ⚠️ | ✅ | ⚠️ | ⚠️ |
Escolha o método com base nas linhas que realmente importam para o teu projeto. Se você precisa de comentários e transcrições, o yt-dlp é o vencedor claro. Se precisa de estatísticas estruturadas em escala moderada, a API é a melhor opção. Se quer dados em dois minutos, continue lendo a seção do Thunderbit.

Método 1: extrair dados do YouTube com Python usando requests + BeautifulSoup (parse de ytInitialData)
Esse método aproveita o fato de que o YouTube embute todos os dados da página como JSON dentro do HTML bruto. Você não precisa de navegador — só precisa saber onde procurar.
- Dificuldade: Iniciante
- Tempo necessário: ~15 minutos
- O que você vai precisar: Python 3.10+,
requests,beautifulsoup4
Passo 1: enviar uma requisição GET para a página do YouTube
Envie a requisição com um cabeçalho User-Agent realista. O cabeçalho padrão python-requests/2.x é bloqueado na hora — o confirma que esse é o erro mais comum entre iniciantes.
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", # contorna a barreira de consentimento da UE
8}
9url = "https://www.youtube.com/@mkbhd/videos"
10response = requests.get(url, headers=HEADERS)
11print(response.status_code) # Deve ser 200
O cookie CONSENT é essencial — sem ele, requisições vindas da região da UE são redirecionadas para consent.youtube.com, que entrega HTML sem nenhum ytInitialData.
Passo 2: analisar o HTML e localizar o script ytInitialData
Use BeautifulSoup ou regex para encontrar a tag <script> que contém var ytInitialData =:
1import re
2import json
3# Extrair o JSON de 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 extraído com sucesso")
12else:
13 print("ytInitialData não encontrado — verifique headers/cookies")
Um erro comum é usar um .*? não guloso com apenas }; como sentinela de fim. Terminadores de objetos aninhados aparecem o tempo todo dentro do JSON e vão cortar a captura antes da hora. Use };</script> como faz o — essa é a última atribuição do bloco de script.
Passo 3: navegar pela estrutura do JSON para extrair os vídeos
O JSON é profundamente aninhado. Em vez de fixar caminhos que quebram sempre que o YouTube reorganiza a estrutura (o que acontece com frequência — o documenta várias mudanças de formato desde 2023), use uma busca recursiva por chave:
1def search_dict(partial, search_key):
2 stack = [partial]
3 while stack:
4 cur = stack.pop()
5 if isinstance(cur, dict):
6 for k, v in cur.items():
7 if k == search_key:
8 yield v
9 else:
10 stack.append(v)
11 elif isinstance(cur, list):
12 stack.extend(cur)
13# Extrair informações dos vídeos da página do canal
14videos = []
15for vr in search_dict(data, "videoRenderer"):
16 videos.append({
17 "video_id": vr.get("videoId"),
18 "title": vr["title"]["runs"][0]["text"],
19 "views": vr.get("viewCountText", {}).get("simpleText", "N/A"),
20 "published": vr.get("publishedTimeText", {}).get("simpleText", "N/A"),
21 })
22print(f"Encontrados {len(videos)} vídeos")
23for v in videos[:5]:
24 print(f" {v['title']} — {v['views']}")
Essa abordagem recursiva é a mesma que , yt-dlp e Scrapfly acabaram adotando — ela sobrevive às reestruturações frequentes do JSON do YouTube.
Passo 4: exportar os dados extraídos para CSV ou Excel
1import csv
2with open("youtube_videos.csv", "w", newline="", encoding="utf-8") as f:
3 writer = csv.DictWriter(f, fieldnames=["video_id", "title", "views", "published"])
4 writer.writeheader()
5 writer.writerows(videos)
6print("Dados exportados para youtube_videos.csv")
Quando usar este método — e quando não usar
Melhor para: extração rápida de metadados em poucas páginas de canal ou vídeo. Ferramentas leves de SEO. Análises pontuais em que você precisa de título, visualizações e data de envio.
Limitações: a estrutura do JSON muda — quebras já documentadas incluem a reformulação do botão de curtida (2023: toggleButtonRenderer → segmentedLikeDislikeButtonViewModel), a reformulação da descrição (2023: description.runs[] → attributedDescription.content) e o redesenho da aba Vídeos do canal (2022–2023: gridRenderer → richGridRenderer). IPs de datacenter normalmente são bloqueados de forma suave após 50–200 requisições. Sem comentários, sem transcrições.
Método 2: extrair dados do YouTube com Python usando Selenium ou Playwright
Quando você precisa interagir com a página — rolar resultados de busca, clicar em abas, expandir descrições — automação de navegador é o caminho.
- Dificuldade: Intermediária
- Tempo necessário: ~30 minutos
- O que você vai precisar: Python 3.10+, Playwright (
pip install playwright && playwright install) ou Selenium + ChromeDriver
Eu recomendo Playwright em vez de Selenium para projetos novos. Os mostram o Playwright como cerca de em comparação com o Selenium. O Playwright usa um WebSocket persistente via Chrome DevTools Protocol, enquanto o Selenium usa WebDriver sobre HTTP, adicionando uma camada de tradução para cada comando.
Passo 1: configurar o Playwright
1pip install playwright
2playwright install chromium
1from playwright.sync_api import sync_playwright
2pw = sync_playwright().start()
3browser = pw.chromium.launch(headless=False) # com interface reduz parte da detecção
4context = browser.new_context()
5# Pré-carregar cookie de consentimento para contornar a barreira da UE
6context.add_cookies([{
7 "name": "SOCS",
8 "value": "CAISNQgDEitib3FfaWRlbnRpdHlmcm9udGVuZHVpc2VydmVyXzIwMjMwODI5LjA3X3AxGgJlbiACGgYIgJnPpwY",
9 "domain": ".youtube.com",
10 "path": "/",
11}])
12page = context.new_page()
Passo 2: abrir uma página do YouTube e aguardar o carregamento do conteúdo
1page.goto("https://www.youtube.com/@mkbhd/videos")
2page.wait_for_selector("a#video-title-link", timeout=15000)
3print("Página carregada — elementos de vídeo visíveis")
Se estiver extraindo resultados de busca, vá para https://www.youtube.com/results?search_query=sua+busca.
Passo 3: lidar com infinite scroll para carregar mais vídeos
O YouTube usa rolagem infinita nas páginas de canal e nos resultados de busca. Aqui está o loop clássico de scrollHeight, adaptado do :
1prev_height = -1
2max_scrolls = 20 # limite isso — um canal com 10 mil vídeos vai rolar para sempre
3scroll_count = 0
4while scroll_count < max_scrolls:
5 page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
6 page.wait_for_timeout(1500) # aguarda o novo conteúdo carregar
7 new_height = page.evaluate("document.body.scrollHeight")
8 if new_height == prev_height:
9 break # nenhum novo conteúdo foi carregado
10 prev_height = new_height
11 scroll_count += 1
12print(f"Rolou {scroll_count} vezes")
Passo 4: extrair os dados do vídeo a partir da página renderizada
1video_elements = page.query_selector_all("a#video-title-link")
2videos = []
3for el in video_elements:
4 title = el.inner_text()
5 href = el.get_attribute("href")
6 video_id = href.split("v=")[-1] if href else None
7 videos.append({"title": title, "video_id": video_id, "url": f"https://www.youtube.com{href}"})
8print(f"Extraídos {len(videos)} vídeos")
Para contagem de visualizações e data de envio, você vai precisar capturar elementos irmãos. O alerta que id="video-title-link" não é universal — o YouTube publica várias variações de página. O fallback mais robusto é a[href*="watch"].
Passo 5: exportar para CSV ou Google Sheets
1import csv
2with open("youtube_playwright.csv", "w", newline="", encoding="utf-8") as f:
3 writer = csv.DictWriter(f, fieldnames=["title", "video_id", "url"])
4 writer.writeheader()
5 writer.writerows(videos)
6browser.close()
7pw.stop()
Quando usar este método — e quando não usar
Melhor para: extrair resultados de busca, interagir com elementos dinâmicos da página (clicar em abas, expandir descrições) e qualquer coisa que exija um DOM totalmente renderizado.
Limitações: lento (~1,5–3 segundos por vídeo em um fluxo de rolagem + extração). Alto risco de detecção anti-bot — o Selenium padrão define navigator.webdriver === true, que . Consome muitos recursos (cada instância do navegador usa de 200 a 500 MB de RAM). Para 100 vídeos, espere algo entre 3 e 8 minutos, em vez de segundos com yt-dlp.
Método 3: extrair dados do YouTube com Python usando yt-dlp
yt-dlp é o canivete suíço do scraping no YouTube. É um fork comunitário do youtube-dl com , releases noturnos ativos e suporte embutido para metadados, comentários, transcrições e scraping em lote — tudo sem precisar de navegador ou chave de API.
- Dificuldade: De iniciante a intermediário
- Tempo necessário: ~10 minutos
- O que você vai precisar: Python 3.10+,
pip install yt-dlp
Passo 1: instalar o yt-dlp
1pip install yt-dlp
Sem drivers de navegador, sem chaves de API, sem arquivos de configuração.
Passo 2: extrair metadados do vídeo sem baixar o arquivo
1import yt_dlp
2opts = {
3 "quiet": True,
4 "skip_download": True, # sem bytes do vídeo — só metadados
5 "no_warnings": True,
6}
7with yt_dlp.YoutubeDL(opts) as ydl:
8 info = ydl.extract_info(
9 "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
10 download=False
11 )
12print(f"Título: {info['title']}")
13print(f"Visualizações: {info['view_count']:,}")
14print(f"Curtidas: {info.get('like_count', 'N/A')}")
15print(f"Duração: {info['duration']}s")
16print(f"Data de envio: {info['upload_date']}")
17print(f"Canal: {info['channel']} ({info.get('channel_follower_count', 'N/A')} inscritos)")
18print(f"Tags: {info.get('tags', [])[:5]}")
Uma chamada típica de extract_info retorna de 80 a 120 campos, dependendo do estado do vídeo: id, title, channel, channel_id, channel_follower_count, view_count, like_count, comment_count, upload_date, duration, tags, categories, description, thumbnails, is_live, availability, automatic_captions, subtitles, chapters, heatmap e muito mais.
Passo 3: extrair comentários de um vídeo do YouTube
1opts = {
2 "quiet": True,
3 "skip_download": True,
4 "getcomments": True,
5 "extractor_args": {
6 "youtube": {
7 "max_comments": ["200", "50", "50", "10"], # total, principais, respostas por comentário, respostas no total
8 "comment_sort": ["top"],
9 }
10 },
11}
12with yt_dlp.YoutubeDL(opts) as ydl:
13 info = ydl.extract_info(
14 "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
15 download=False
16 )
17comments = info.get("comments", [])
18print(f"{len(comments)} comentários obtidos")
19for c in comments[:3]:
20 print(f" [{c.get('like_count', 0)} curtidas] {c['author']}: {c['text'][:80]}...")
A extração de comentários é lenta. A relata a coleta de comentários a cerca de 30 KB/s — um vídeo com 100 mil comentários pode levar horas. A documenta vídeos em que as URLs dos formatos expiram (~6 horas) antes de a paginação dos comentários terminar. Defina max_comments de forma agressiva para vídeos grandes.
Passo 4: extrair transcrições e legendas
Nem a YouTube Data API nem o parse com BS4 conseguem te dar transcrições completas. Esse é o grande diferencial do yt-dlp.
1opts = {
2 "quiet": True,
3 "skip_download": True,
4 "writesubtitles": True,
5 "writeautomaticsub": True,
6 "subtitleslangs": ["en", "en-orig"],
7 "subtitlesformat": "json3", # adequado para parsing por máquina: start/dur em ms + texto
8 "outtmpl": "%(id)s.%(ext)s",
9}
10with yt_dlp.YoutubeDL(opts) as ydl:
11 info = ydl.extract_info(
12 "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
13 download=False
14 )
15# Acessar os dados de legenda diretamente do dicionário info
16auto_captions = info.get("automatic_captions", {})
17manua_lsubs = info.get("subtitles", {})
18print(f"Idiomas de legendas automáticas: {list(auto_captions.keys())[:10]}")
19print(f"Idiomas de legendas manuais: {list(manua_lsubs.keys())}")
O formato json3 é o preferido para parsing por máquina — cada segmento traz start/dur em milissegundos e trechos de texto. Os códigos de idioma seguem BCP-47 (en, en-US, zh-Hans, ja, es).
Passo 5: fazer scraping em lote de vários vídeos ou de um canal inteiro
1opts = {
2 "quiet": True,
3 "skip_download": True,
4 "extract_flat": "in_playlist", # rápido — só IDs e títulos dos vídeos
5 "sleep_interval": 2,
6 "max_sleep_interval": 6,
7}
8with yt_dlp.YoutubeDL(opts) as ydl:
9 info = ydl.extract_info(
10 "https://www.youtube.com/@mkbhd/videos",
11 download=False
12 )
13entries = info.get("entries", [])
14print(f"Encontrados {len(entries)} vídeos no canal")
15for e in entries[:5]:
16 print(f" {e.get('title', 'N/A')} — {e.get('id')}")
Passe uma URL de canal, uma URL de playlist ou até uma busca (ytsearch10:python scraping) e o yt-dlp cuida da paginação internamente.
Quando usar este método — e quando não usar
Melhor para: extração em massa de metadados, comentários, transcrições, download de vídeos e varreduras de canal quando você precisa do conjunto completo de campos.
Limitações: não é o ideal para páginas de resultados de busca (Selenium/Playwright é melhor nisso). A corrida anti-bot de 2024–2026 tornou o yt-dlp mais complexo para operar em escala — o YouTube agora aplica em alguns clientes. Em produção, instale o plugin e use --cookies-from-browser chrome (com uma conta descartável — a equipe do yt-dlp avisa que cookies de uma conta Google real podem levar a banimento dessa conta).
Método 4: extrair dados do YouTube com Python usando a YouTube Data API
A API oficial YouTube Data API v3 é a forma mais confiável e estruturada de obter dados do YouTube. As respostas vêm em JSON limpo, os campos são documentados e não existe a guerra de gato e rato do anti-bot. Mas há um detalhe que muitos tutoriais ignoram: o sistema de cota.
- Dificuldade: Intermediária
- Tempo necessário: ~20 minutos (incluindo a configuração da chave de API)
- O que você vai precisar: Python 3.10+, um projeto no Google Cloud,
pip install google-api-python-client
Passo 1: obter uma chave da YouTube Data API
- Acesse o
- Crie um novo projeto (ou selecione um existente)
- Vá em APIs & Services → Library → pesquise por "YouTube Data API v3" → Enable
- Vá em APIs & Services → Credentials → Create Credentials → API Key
- Copie a chave — você vai usá-la no código abaixo
Passo 2: fazer sua primeira chamada à API
1from googleapiclient.discovery import build
2API_KEY = "SUA_CHAVE_DE_API_AQUI"
3youtube = build("youtube", "v3", developerKey=API_KEY)
4# Buscar detalhes de um vídeo específico
5response = youtube.videos().list(
6 part="snippet,statistics,contentDetails",
7 id="dQw4w9WgXcQ"
8).execute()
9video = response["items"][0]
10print(f"Título: {video['snippet']['title']}")
11print(f"Visualizações: {video['statistics']['viewCount']}")
12print(f"Curtidas: {video['statistics'].get('likeCount', 'oculto')}")
13print(f"Comentários: {video['statistics'].get('commentCount', 'desativado')}")
14print(f"Duração: {video['contentDetails']['duration']}")
15print(f"Tags: {video['snippet'].get('tags', [])[:5]}")
A resposta é limpa, tipada e documentada. Sem arqueologia em JSON.
Passo 3: extrair detalhes de vídeos, informações do canal e comentários
1# Buscar vídeos
2search_response = youtube.search().list(
3 part="snippet",
4 q="tutorial de web scraping em Python",
5 type="video",
6 maxResults=10,
7 order="viewCount"
8).execute()
9for item in search_response["items"]:
10 print(f" {item['snippet']['title']} — {item['id']['videoId']}")
11# Buscar comentários
12comments_response = youtube.commentThreads().list(
13 part="snippet",
14 videoId="dQw4w9WgXcQ",
15 maxResults=20,
16 order="relevance"
17).execute()
18for item in comments_response["items"]:
19 comment = item["snippet"]["topLevelComment"]["snippet"]
20 print(f" [{comment['likeCount']} curtidas] {comment['authorDisplayName']}: {comment['textDisplay'][:80]}")
A realidade das cotas da YouTube API (o que ninguém conta)
Esta é a parte que separa um guia útil de um tutorial de copiar e colar. A alocação padrão é de , com redefinição à meia-noite no horário do Pacífico. Veja quanto cada chamada custa:
| Endpoint da API | Custo por chamada | Máximo por chamada |
|---|---|---|
search.list | 100 unidades | 50 resultados |
videos.list | 1 unidade | 50 IDs de vídeo (em lote) |
channels.list | 1 unidade | 50 IDs de canal |
commentThreads.list | 1 unidade | 100 comentários |
captions.list | 50 unidades | N/A |
Agora a conta. Suponha que você queira extrair 1.000 resultados de busca:
- Chamadas de busca: 1.000 resultados ÷ 50 por página = 20 chamadas × 100 unidades = 2.000 unidades (20% do teu orçamento diário — já foi)
- Detalhes dos vídeos para esses 1.000 vídeos: 1.000 IDs ÷ 50 por lote = 20 chamadas × 1 unidade = 20 unidades (barato — o
videos.listem lote é o grande alívio) - Comentários desses 1.000 vídeos (assumindo 1 página por vídeo): 1.000 chamadas × 1 unidade = 1.000 unidades
Total: cerca de 3.020 unidades para uma extração modesta. Mas se esses vídeos tiverem threads longas de comentários (50+ páginas cada), você vai queimar as 7.000 unidades restantes bem rápido. Um vídeo com 50.000 comentários = ~500 páginas = 500 unidades. Faça isso com 20 vídeos e a cota do dia acaba.
O exige uma auditoria de conformidade completa: URL da política de privacidade, URL dos termos de uso, vídeo mostrando o app e justificativa matemática da cota. Relatos da comunidade sugerem resposta típica do Google em 3–5 dias úteis, aprovação completa pode levar semanas ou meses, e muitos pedidos são negados — especialmente casos do tipo “quero mais dados para análise”.
Quando usar a API: escala pequena a média, quando você precisa de dados estruturados e confiáveis, quando comentários e estatísticas do canal importam, e quando você consegue conviver com o limite de cota.
Quando fazer scraping faz mais sentido: projetos em grande escala (>10 mil vídeos/dia), campos que a API não expõe (transcrições completas — captions.download exige OAuth + permissão do proprietário do vídeo), ou quando você precisa de mais de 500 resultados de busca por consulta (limite rígido da API, independentemente do totalResults).
O atalho sem código: extrair dados do YouTube com Thunderbit (sem Python)
Se você precisa de Python para uma pipeline de dados, use os Métodos 1–4 acima. Mas se precisa de dados do YouTube em 2 minutos — talvez você seja um profissional de marketing querendo comparar concorrentes, ou um desenvolvedor que só quer uma extração rápida sem configurar projeto nenhum — existe um caminho mais curto.
é uma extensão de AI web scraper para Chrome que criamos justamente para os casos em que escrever código é exagero. Ela funciona diretamente nas páginas do YouTube no teu navegador.
Como extrair dados do YouTube com Thunderbit em 3 passos
Passo 1: instale a e abra uma página de canal, uma página de resultados de busca ou uma página de vídeo no YouTube.
Passo 2: clique em "AI Suggest Fields" na barra lateral do Thunderbit. A IA lê a página e sugere colunas como título do vídeo, visualizações, data de envio, duração, nome do canal e URL da miniatura. Você pode adicionar, remover ou renomear colunas como quiser.
Passo 3: clique em "Scrape" e exporte para Google Sheets, Excel, CSV, Airtable ou Notion. Os dados caem numa tabela limpa, pronta para uso.
Para quem isso é indicado
- Profissionais de marketing que precisam de dados de canais concorrentes, mas não programam
- Desenvolvedores que querem uma extração rápida sem criar ambiente virtual e instalar dependências
- Qualquer pessoa esbarrando em barreiras anti-bot — o Thunderbit faz o scraping na própria sessão autenticada do teu navegador, herdando cookies e tokens PO. Isso contorna vários bloqueios que atrapalham scrapers no lado do servidor
- O Thunderbit também pode usar para visitar cada página de vídeo e enriquecer a tabela com detalhes adicionais (curtidas, descrição, tags)
Para uma análise mais profunda de como o Thunderbit lida especificamente com o YouTube, confira o e o .
Dicas para extrair dados do YouTube com Python sem ser bloqueado
Essas dicas valem para todos os quatro métodos em Python. As medidas anti-bot do YouTube têm dificuldade , com três sinais principais: análise comportamental do IP, necessidade de execução de JS e estrutura HTML que muda com frequência.
Para todos os métodos:
- Alterne os User-Agents e o conjunto completo de headers —
Accept,Accept-Languagee os client hintsSec-CH-UAprecisam bater com o UA declarado. O tem uma lista atualizada. - Adicione atrasos aleatórios de 2 a 8 segundos entre requisições. Intervalos fixos são um sinal de detecção.
- Use proxies residenciais para qualquer coisa além de poucas páginas. IPs de datacenter (AWS, GCP, Hetzner) estão .
- Alterne sessão + IP juntos — o YouTube vincula sessões ao IP, e o mesmo cookie de sessão aparecendo em dois IPs é um sinal vermelho.
Para requests + BS4: defina o cookie CONSENT=YES+cb. Sem isso, requisições da UE são redirecionadas para uma página de consentimento sem dados.
Para Selenium/Playwright: rode com interface, usando xvfb em servidores Linux, em vez de --headless=new — o Chrome headless ainda entrega sinais de fingerprint suficientes para detectores mais sofisticados. Considere o , que aplica cerca de 17 evasões.
Para yt-dlp: use as opções sleep_interval e max_sleep_interval. Instale o plugin para geração de PO Token. Use --cookies-from-browser chrome com uma conta descartável.
Para a API: monitore o uso de cota no e faça requisições em lote de forma eficiente. Uma única chamada videos.list com 50 IDs separados por vírgula custa 1 unidade — use isso a teu favor.
Para o Thunderbit: as medidas anti-bot são tratadas automaticamente, já que o scraping acontece na tua sessão do navegador. É basicamente como automatizar o que você faria manualmente.
É legal extrair dados do YouTube com Python?
Depende do que você extrai, de como você extrai e do que faz com os dados.
O cenário jurídico mudou em 2024 com Meta Platforms v. Bright Data (N.D. Cal., janeiro de 2024), quando . Depois dessa decisão, extrair dados públicos ficou “significativamente menos arriscado”. Por outro lado, hiQ v. LinkedIn terminou com uma por violação dos termos, violações da CFAA (contas falsas) e invasão de bens móveis — além de uma liminar permanente.
Os próprios são explícitos: “Você não está autorizado a acessar o Serviço usando meios automatizados (como robôs, botnets ou scrapers)”, exceto com permissão prévia por escrito ou conforme permitido pela legislação aplicável. A YouTube Data API é a forma oficialmente autorizada de acessar os dados.
Algumas regras práticas:
- Extrair dados públicos visíveis para pesquisa pessoal ou análise não comercial geralmente traz menos risco
- A API é o caminho mais seguro — ela é explicitamente autorizada
- Evite extrair conteúdo privado ou protegido por login, baixar vídeos com copyright para redistribuição ou violar GDPR com dados pessoais de comentários
- Comentários do YouTube contêm dados pessoais sob o Art. 4(1) do GDPR — trate com cuidado as informações de titulares de dados da UE
- Consulte um advogado para projetos de scraping comercial
Nada disso é aconselhamento jurídico. O cenário muda rápido — uma nova onda de que fizeram scraping no YouTube para treinamento está redesenhando esse campo em 2025–2026.
Qual método você deve usar para extrair dados do YouTube com Python?
Guia de decisão:
- Precisa de metadados rápidos de poucas páginas? → Método 1 (requests + BS4). Rápido, leve, sem dependências além de
requestsebeautifulsoup4. - Precisa extrair resultados de busca ou interagir com páginas dinâmicas? → Método 2 (Selenium/Playwright). Renderização completa no navegador, suporte a infinite scroll, mas lento e sujeito à detecção.
- Precisa de metadados em massa, comentários ou transcrições? → Método 3 (yt-dlp). A ferramenta única mais completa — por um motivo.
- Precisa de dados estruturados e confiáveis em escala moderada? → Método 4 (YouTube Data API). Oficial, limpa, mas limitada a .
- Precisa dos dados em 2 minutos sem escrever código? → . Baseado no navegador, com IA, exporta para Google Sheets em poucos cliques.
Nenhum método cobre todos os casos de uso. Salve a tabela comparativa e a tabela de campos extraíveis acima — elas vão te poupar tempo no teu próximo projeto. E, se quiser explorar mais , temos vários guias no blog da Thunderbit cobrindo desde até .
Perguntas frequentes
Posso extrair dados do YouTube sem uma chave de API?
Sim. Os Métodos 1 (requests + BS4), 2 (Selenium/Playwright) e 3 (yt-dlp) não exigem chave de API. Só o Método 4 (YouTube Data API) precisa de uma. O Thunderbit também funciona sem chave de API — ele faz a extração diretamente no teu navegador.
Qual é a maneira mais rápida de extrair dados do YouTube com Python?
Em Python, yt-dlp e requests + BS4 são os mais rápidos — ambos evitam a sobrecarga de navegador e conseguem puxar metadados em segundos por vídeo. O yt-dlp é especialmente rápido em operações em lote porque cuida da paginação internamente. Para quem não usa Python, o Thunderbit é o mais rápido no geral porque não há tempo de configuração.
Como extrair comentários do YouTube com Python?
yt-dlp tem extração de comentários embutida via opção getcomments — é o caminho mais simples. A YouTube Data API também suporta comentários por meio de commentThreads.list (1 unidade de cota por chamada, até 100 comentários por página). Selenium/Playwright até consegue fazer isso rolando a página e extraindo os elementos renderizados, mas é lento e frágil.
Posso extrair Shorts do YouTube com Python?
Sim. O yt-dlp lida bem com metadados de Shorts — ele os trata como vídeos normais, com campos extras específicos de Shorts. A YouTube Data API tem suporte parcial (a contagem de visualizações de Shorts — agora a métrica conta qualquer início de reprodução/replay). BS4 e Selenium/Playwright têm suporte limitado a Shorts, porque a vitrine de Shorts usa estruturas de DOM diferentes.
Quantos vídeos do YouTube posso extrair por dia?
Com a YouTube Data API, você fica limitado a cerca de 10.000 unidades de cota por dia. Usando chamadas em lote de videos.list (50 IDs por chamada por 1 unidade), isso dá até 500 mil consultas de estatísticas de vídeo por dia — mas search.list, com 100 unidades por chamada, consome o orçamento rapidamente. Com métodos de scraping (BS4, Selenium, yt-dlp), o limite é prático, não fixo: bloqueios de IP costumam começar após algumas centenas ou alguns milhares de requisições por IP por dia, dependendo da configuração de proxy e do padrão de requisições. O Thunderbit usa um sistema de créditos vinculado ao seu .
Saiba mais
