Если ты когда-нибудь пробовал requests.get("https://www.youtube.com/...") и разбирал ответ через BeautifulSoup в поисках названий видео, ты уже знаешь, чем всё обычно заканчивается: перед тобой стена пустых <div>-тегов и ровно ноль полезных данных.
Это самая частая проблема, с которой я сталкиваюсь у разработчиков, которые впервые пытаются парсить YouTube. YouTube — это одностраничное приложение, и почти всё на нём рендерится на стороне клиента через JavaScript. HTML, который получает твой Python-скрипт, — это всего лишь оболочка. А настоящие заголовки видео, счётчики просмотров и метаданные? Они спрятаны в огромном JSON-блоке под названием ytInitialData, который внедряется JS уже после загрузки страницы.
Поэтому вполне логичный soup.find("div", class_="ytd-video-renderer") возвращает None, потому что такого элемента буквально нет в сыром HTTP-ответе. Когда я это понял, пазл наконец сложился — а четыре метода ниже стали результатом множества тестов, сломанных попыток и слишком долгого чтения GitHub issue. Я проведу тебя по каждому подходу, покажу, когда именно использовать тот или иной вариант, и в конце дам no-code альтернативу для тех, кому нужны просто данные без настройки проекта.
Зачем вообще парсить YouTube на Python?
YouTube — это не просто видеоплатформа, а источник данных с . На платформе размещено , а . В этом массиве открытой информации бизнес, исследователи и авторы контента видят огромный потенциал для анализа.
Но есть нюанс: встроенная аналитика YouTube показывает данные только по твоему каналу. Если ты хочешь понять частоту публикаций конкурента, отследить тренды в своей нише или проанализировать реакцию аудитории в комментариях к чужим видео, без парсинга не обойтись.
Вот самые типичные сценарии, с которыми я сталкивался на практике:
| Сценарий | Кому нужно | Какие данные |
|---|---|---|
| Анализ конкурентов | Маркетинговым командам, контент-стратегам | Просмотры, частота публикаций, уровень вовлечённости |
| Генерация лидов | Отделам продаж, B2B outreach | Контакты канала, рабочие email в описаниях |
| Исследование рынка | Продакт-менеджерам, аналитикам | Трендовые темы, настроение аудитории по комментариям |
| Контент-стратегия | YouTube-авторам, агентствам | Форматы с высокой отдачей, лучшие шаблоны заголовков и тегов |
| SEO / keyword research | SEO-специалистам | Заголовки, теги, описания, сигналы ранжирования |
| Мониторинг бренда | PR-командам, бренд-менеджерам | Упоминания в заголовках, комментариях и описаниях |
| Академические исследования | Исследователям, data scientist’ам | Датасеты комментариев для анализа тональности (одно исследование 2025 года показало точность 93,1% при дообучении BERT на 45 тыс. комментариев YouTube) |
Например, конкурентный анализ DJI vs. GoPro vs. Insta360 показал, что — такой вывод невозможно увидеть внутри YouTube Studio.
Почему одного requests + BeautifulSoup недостаточно для парсинга YouTube
Прежде чем перейти к рабочим методам, важно понять, почему очевидный путь не срабатывает. Это не теория — это экономия часов на отладке.
Выглядит «очевидный» подход примерно так:
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 — каждый раз
Результат всегда нулевой. Как пишет : «Страница загружена динамически, а requests это не поддерживает». говорит ещё прямее: «Используя только requests и BeautifulSoup, вы не можете выполнить JavaScript».
объясняет механику: YouTube построен как Single Page Application (SPA). При обычном HTTP-запросе ты получаешь только стартовую HTML-оболочку — реальный контент ещё не отрендерен. Данные о видео спрятаны внутри JavaScript-объектов, которые браузер обычно исполняет и вставляет в DOM.
Хорошая новость: YouTube действительно встраивает все нужные данные в сырой HTML. Просто не в DOM-элементы, а в два JSON-блока внутри <script>-тегов:
ytInitialData— структура страницы, списки видео, метрики вовлечённости, токены продолжения комментариевytInitialPlayerResponse— основная метаинформация о видео (заголовок, описание, длительность, форматы, субтитры)
Оба блока доступны через обычный requests.get() — браузер не нужен — если знать, как их извлечь и распарсить. Именно это и есть Метод 1 ниже.
4 способа парсить YouTube на Python: сравнение рядом
Прежде чем разбирать методы по отдельности, вот матрица выбора. Я протестировал все четыре подхода и сравнил их по тем критериям, которые реально важны при выборе инструмента для рабочего проекта.
| Критерий | requests + BS4 (ytInitialData) | Selenium / Playwright | yt-dlp | YouTube Data API | No-code (Thunderbit) |
|---|---|---|---|---|---|
| Сложность настройки | Низкая | Средняя | Низкая | Средняя (API key) | Нет |
| Работа с JS | Частично (парсинг JSON) | Да | Да | Н/Д (структурированный API) | Да |
| Скорость | Быстро | Медленно | Быстро | Быстро | Быстро (облако) |
| Риск антибот-защиты | Средний | Высокий | Низкий | Нет | Обрабатывается |
| Квоты / лимиты | Нет (но возможны блокировки IP) | Нет (но есть детект) | Нет | 10 000 единиц/день | На основе кредитов |
| Извлечение комментариев | Сложно | Возможно, но непросто | Встроено | Встроено | Зависит от страницы |
| Транскрипты | Нет | Сложно | Да | Нет | Нет |
| Лучший вариант для | Быстрых метаданных | Поиска, динамических страниц | Массовых метаданных и комментариев | Структурированных данных в масштабе | Не-программистов, быстрых экспортов |
Краткий обзор:

Какие данные YouTube вообще можно извлечь и каким методом?
Это та справочная таблица, которой мне не хватало в начале. Ни один метод не покрывает все поля — именно поэтому статья и разбирает четыре подхода.
| Поле данных | BS4 (ytInitialData) | Selenium/Playwright | yt-dlp | YouTube API | Thunderbit |
|---|---|---|---|---|---|
| Название видео | ✅ | ✅ | ✅ | ✅ | ✅ |
| Просмотры | ✅ | ✅ | ✅ | ✅ | ✅ |
| Количество лайков | ⚠️ Нестабильно | ✅ | ✅ | ✅ | ✅ |
| Комментарии (текст) | ❌ | ⚠️ Сложно | ✅ | ✅ | ⚠️ |
| Транскрипт / субтитры | ❌ | ⚠️ | ✅ | ❌ | ❌ |
| Теги | ✅ | ✅ | ✅ | ✅ | ⚠️ |
| URL миниатюр | ✅ | ✅ | ✅ | ✅ | ✅ |
| Число подписчиков канала | ⚠️ | ✅ | ✅ | ✅ | ✅ |
| Дата загрузки | ✅ | ✅ | ✅ | ✅ | ✅ |
| Длительность видео | ✅ | ✅ | ✅ | ✅ | ✅ |
| Данные по Shorts | ❌ | ⚠️ | ✅ | ⚠️ | ⚠️ |
Выбирай метод по тому, какие строки для тебя важнее всего. Если нужны комментарии и транскрипты — безусловный фаворит yt-dlp. Если нужны структурированные метрики в умеренном объёме — лучше всего API. Если данные нужны за две минуты — переходи к разделу про Thunderbit.

Метод 1: парсинг YouTube на Python через requests + BeautifulSoup (извлечение ytInitialData)
Этот способ использует тот факт, что YouTube встраивает все данные страницы в JSON внутри сырого HTML. Браузер не нужен — нужно лишь знать, где искать.
- Сложность: Начальный уровень
- Время: примерно 15 минут
- Что понадобится: Python 3.10+,
requests,beautifulsoup4
Шаг 1: отправьте GET-запрос на страницу YouTube
Отправляй запрос с реалистичным User-Agent. Стандартный заголовок python-requests/2.x блокируется почти мгновенно — подтверждает, что это самая частая ошибка новичков.
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", # обходит EU consent wall
8}
9url = "https://www.youtube.com/@mkbhd/videos"
10response = requests.get(url, headers=HEADERS)
11print(response.status_code) # Должно быть 200
Cookie CONSENT критически важен — без него запросы из региона ЕС перенаправляются на consent.youtube.com, который отдаёт HTML вообще без ytInitialData.
Шаг 2: распарсьте HTML и найдите скрипт ytInitialData
Используйте BeautifulSoup или regex, чтобы найти тег <script> с var ytInitialData =:
1import re
2import json
3# Извлекаем 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 успешно извлечён")
12else:
13 print("ytInitialData не найден — проверьте заголовки и cookies")
Частая ошибка — использовать не жадный .*? и заканчивать захват просто на };. Внутри JSON постоянно встречаются вложенные закрывающие скобки, и захват обрежется слишком рано. Используй };</script>, как делает — это последнее присваивание в отдельном script-блоке.
Шаг 3: пройдите по JSON и извлеките данные о видео
JSON глубоко вложен. Вместо того чтобы жёстко прописывать путь, который сломается при любом изменении структуры YouTube (а это происходит регулярно — фиксирует множество изменений формата с 2023 года), лучше использовать рекурсивный поиск по ключу:
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# Извлекаем информацию о видео со страницы канала
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"Найдено видео: {len(videos)}")
23for v in videos[:5]:
24 print(f" {v['title']} — {v['views']}")
Именно к такому рекурсивному подходу пришли , yt-dlp и Scrapfly — он переживает частые изменения JSON-структуры YouTube.
Шаг 4: экспортируйте данные в CSV или 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("Данные экспортированы в youtube_videos.csv")
Когда использовать этот метод, а когда нет
Лучше всего для: быстрого получения метаданных с нескольких страниц канала или видео. Лёгких SEO-инструментов. Разовых анализов, где нужны заголовок, просмотры и дата публикации.
Ограничения: структура JSON меняется — среди известных поломок были рефакторинг кнопки лайка (2023: toggleButtonRenderer → segmentedLikeDislikeButtonViewModel), рефакторинг описания (2023: description.runs[] → attributedDescription.content) и переработка вкладки Videos канала (2022–2023: gridRenderer → richGridRenderer). IP из дата-центров обычно получают soft-block уже после 50–200 запросов. Комментариев нет, транскриптов нет.
Метод 2: парсинг YouTube на Python через Selenium или Playwright
Когда нужно взаимодействовать со страницей — прокручивать результаты поиска, нажимать вкладки, раскрывать описание — лучше всего подходит браузерная автоматизация.
- Сложность: Средний уровень
- Время: примерно 30 минут
- Что понадобится: Python 3.10+, Playwright (
pip install playwright && playwright install) или Selenium + ChromeDriver
Для новых проектов я рекомендую Playwright вместо Selenium. показывает, что Playwright примерно по сравнению с Selenium. Playwright использует постоянное WebSocket-соединение через Chrome DevTools Protocol, а Selenium работает через WebDriver поверх HTTP, добавляя слой преобразования на каждую команду.
Шаг 1: настройте Playwright
1pip install playwright
2playwright install chromium
1from playwright.sync_api import sync_playwright
2pw = sync_playwright().start()
3browser = pw.chromium.launch(headless=False) # headful снижает риск детекта
4context = browser.new_context()
5# Предустановим cookie consent, чтобы обойти EU wall
6context.add_cookies([{
7 "name": "SOCS",
8 "value": "CAISNQgDEitib3FfaWRlbnRpdHlmcm9udGVuZHVpc2VydmVyXzIwMjMwODI5LjA3X3AxGgJlbiACGgYIgJnPpwY",
9 "domain": ".youtube.com",
10 "path": "/",
11}])
12page = context.new_page()
Шаг 2: перейдите на страницу YouTube и дождитесь загрузки контента
1page.goto("https://www.youtube.com/@mkbhd/videos")
2page.wait_for_selector("a#video-title-link", timeout=15000)
3print("Страница загружена — элементы видео видны")
Если ты парсишь результаты поиска, переходи на https://www.youtube.com/results?search_query=your+query.
Шаг 3: обработайте бесконечную прокрутку, чтобы загрузить больше видео
На страницах каналов и поиска YouTube использует бесконечную прокрутку. Вот классический цикл по scrollHeight, адаптированный из :
1prev_height = -1
2max_scrolls = 20 # ограничьте — канал с 10K видео будет скроллиться бесконечно
3scroll_count = 0
4while scroll_count < max_scrolls:
5 page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
6 page.wait_for_timeout(1500) # ждём загрузки нового контента
7 new_height = page.evaluate("document.body.scrollHeight")
8 if new_height == prev_height:
9 break # новый контент не подгрузился
10 prev_height = new_height
11 scroll_count += 1
12print(f"Прокрутка выполнена {scroll_count} раз")
Шаг 4: извлеките данные о видео из отрендеренной страницы
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"Извлечено видео: {len(videos)}")
Для просмотров и даты публикации нужно доставать соседние элементы. предупреждает, что id="video-title-link" не универсален — у YouTube есть несколько вариантов страниц. Более надёжный запасной вариант — a[href*="watch"].
Шаг 5: экспортируйте в CSV или 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()
Когда использовать этот метод, а когда нет
Лучше всего для: парсинга результатов поиска, работы с динамическими элементами страницы (клики по вкладкам, раскрытие описаний), любых задач, где нужен полностью отрендеренный DOM.
Ограничения: медленно (примерно 1,5–3 секунды на видео в потоке scroll-extract). Высокий риск антибот-детекта — обычный Selenium выставляет navigator.webdriver === true, и . Требует много ресурсов: каждый экземпляр браузера потребляет 200–500 МБ RAM. Для 100 видео рассчитывай на 3–8 минут вместо секунд, как у yt-dlp.
Метод 3: парсинг YouTube на Python через yt-dlp
yt-dlp — это швейцарский нож для скрапинга YouTube. Это форк youtube-dl с сообществом, у которого , активные nightly-релизы и встроенная поддержка метаданных, комментариев, транскриптов и пакетного парсинга — без браузера и без API key.
- Сложность: от начального до среднего уровня
- Время: примерно 10 минут
- Что понадобится: Python 3.10+,
pip install yt-dlp
Шаг 1: установите yt-dlp
1pip install yt-dlp
Никаких браузерных драйверов, никаких API-ключей, никаких конфигов.
Шаг 2: извлеките метаданные видео без скачивания
1import yt_dlp
2opts = {
3 "quiet": True,
4 "skip_download": True, # без видеофайлов — только метаданные
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"Название: {info['title']}")
13print(f"Просмотры: {info['view_count']:,}")
14print(f"Лайки: {info.get('like_count', 'N/A')}")
15print(f"Длительность: {info['duration']}s")
16print(f"Дата загрузки: {info['upload_date']}")
17print(f"Канал: {info['channel']} ({info.get('channel_follower_count', 'N/A')} подписчиков)")
18print(f"Теги: {info.get('tags', [])[:5]}")
Типичный вызов extract_info возвращает 80–120 полей в зависимости от состояния видео: 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 и многое другое.
Шаг 3: извлеките комментарии из видео YouTube
1opts = {
2 "quiet": True,
3 "skip_download": True,
4 "getcomments": True,
5 "extractor_args": {
6 "youtube": {
7 "max_comments": ["200", "50", "50", "10"], # всего, родителей, ответов на родителя, всего ответов
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)}")
19for c in comments[:3]:
20 print(f" [{c.get('like_count', 0)} лайков] {c['author']}: {c['text'][:80]}...")
Извлечение комментариев идёт медленно. В указана скорость около 30 КБ/с — для видео со 100 тыс. комментариев это может занять часы. описывает случаи, когда URL форматов истекают (~через 6 часов) ещё до завершения пагинации комментариев. Для больших видео задавай max_comments максимально агрессивно.
Шаг 4: извлеките транскрипты и субтитры
Ни YouTube Data API, ни разбор BS4 не дадут тебе полный транскрипт. Это уникальное преимущество yt-dlp.
1opts = {
2 "quiet": True,
3 "skip_download": True,
4 "writesubtitles": True,
5 "writeautomaticsub": True,
6 "subtitleslangs": ["en", "en-orig"],
7 "subtitlesformat": "json3", # удобно для парсинга: start/dur в ms + текст
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# Получаем данные субтитров напрямую из info dict
16auto_captions = info.get("automatic_captions", {})
17manual_subs = info.get("subtitles", {})
18print(f"Языки автосубтитров: {list(auto_captions.keys())[:10]}")
19print(f"Языки ручных субтитров: {list(manual_subs.keys())}")
Формат json3 лучше всего подходит для машинного парсинга — каждый сегмент содержит start/dur в миллисекундах и текстовые фрагменты. Коды языков используют BCP-47 (en, en-US, zh-Hans, ja, es).
Шаг 5: пакетно парсите несколько видео или весь канал
1opts = {
2 "quiet": True,
3 "skip_download": True,
4 "extract_flat": "in_playlist", # быстро — только ID видео и заголовки
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"Найдено видео на канале: {len(entries)}")
15for e in entries[:5]:
16 print(f" {e.get('title', 'N/A')} — {e.get('id')}")
Передай URL канала, плейлиста или даже поисковый запрос (ytsearch10:python scraping) — и yt-dlp сам обработает пагинацию.
Когда использовать этот метод, а когда нет
Лучше всего для: массового извлечения метаданных, комментариев, транскриптов, скачивания видео, скрапа всего канала, когда нужен полный набор полей.
Ограничения: не лучший вариант для поиска по страницам результатов поиска (для этого Selenium/Playwright удобнее). В 2024–2026 годы антибот-гонка усложнила масштабный запуск yt-dlp — YouTube теперь на некоторых клиентах требует . Для production используй плагин и --cookies-from-browser chrome (с одноразовым аккаунтом — команда yt-dlp предупреждает, что cookies от настоящего Google-аккаунта могут привести к бану этого аккаунта).
Метод 4: парсинг YouTube на Python через YouTube Data API
Официальный YouTube Data API v3 — самый надёжный и структурированный способ получить данные YouTube. Ответы приходят в чистом JSON, поля документированы, и никакой игры в кошки-мышки с антиботом нет. Но есть нюанс, который часто замалчивают в туториалах: система квот.
- Сложность: Средний уровень
- Время: примерно 20 минут (включая настройку API key)
- Что понадобится: Python 3.10+, проект в Google Cloud,
pip install google-api-python-client
Шаг 1: получите ключ YouTube Data API
- Перейди в
- Создай новый проект или выбери существующий
- Открой APIs & Services → Library → найди "YouTube Data API v3" → Enable
- Перейди в APIs & Services → Credentials → Create Credentials → API Key
- Скопируй ключ — он понадобится в коде ниже
Шаг 2: выполните первый API-запрос
1from googleapiclient.discovery import build
2API_KEY = "YOUR_API_KEY_HERE"
3youtube = build("youtube", "v3", developerKey=API_KEY)
4# Получаем данные конкретного видео
5response = youtube.videos().list(
6 part="snippet,statistics,contentDetails",
7 id="dQw4w9WgXcQ"
8).execute()
9video = response["items"][0]
10print(f"Название: {video['snippet']['title']}")
11print(f"Просмотры: {video['statistics']['viewCount']}")
12print(f"Лайки: {video['statistics'].get('likeCount', 'скрыты')}")
13print(f"Комментарии: {video['statistics'].get('commentCount', 'отключены')}")
14print(f"Длительность: {video['contentDetails']['duration']}")
15print(f"Теги: {video['snippet'].get('tags', [])[:5]}")
Ответ чистый, типизированный и документированный. Никакой археологии по JSON не требуется.
Шаг 3: извлеките детали видео, информацию о канале и комментарии
1# Поиск видео
2search_response = youtube.search().list(
3 part="snippet",
4 q="python web scraping tutorial",
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# Комментарии
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']} лайков] {comment['authorDisplayName']}: {comment['textDisplay'][:80]}")
Реальность квот YouTube API (о чём обычно не говорят)
Это тот раздел, который отличает действительно полезный гайд от обычного copy-paste туториала. Стандартная квота — , сбрасывается в полночь по тихоокеанскому времени. Вот сколько стоит каждый вызов:
| API endpoint | Стоимость за вызов | Максимум результатов за вызов |
|---|---|---|
search.list | 100 единиц | 50 результатов |
videos.list | 1 единица | 50 ID видео (батчем) |
channels.list | 1 единица | 50 ID каналов |
commentThreads.list | 1 единица | 100 комментариев |
captions.list | 50 единиц | Н/Д |
Теперь математика. Допустим, ты хочешь собрать 1000 результатов поиска:
- Поисковые запросы: 1000 результатов ÷ 50 на страницу = 20 вызовов × 100 единиц = 2000 единиц (20% дневного бюджета — и это только поиск)
- Детали видео для этих 1000 роликов: 1000 ID ÷ 50 за батч = 20 вызовов × 1 единица = 20 единиц (дёшево — batched
videos.listреально спасает) - Комментарии к этим 1000 видео (если взять по одной странице на видео): 1000 вызовов × 1 единица = 1000 единиц
Итого: около 3020 единиц на умеренный сбор. Но если у видео глубокие ветки комментариев (50+ страниц каждое), оставшиеся 7000 единиц исчезнут очень быстро. Видео с 50 000 комментариев = примерно 500 страниц = 500 единиц. Собери 20 таких видео — и на сегодня всё.
Процесс требует полноценной проверки соответствия: URL политики конфиденциальности, URL Terms of Service, видеодемонстрация приложения, обоснование расчёта квот. По сообщениям сообщества, обычный ответ Google приходит за 3–5 рабочих дней, полное одобрение может занять недели или месяцы, а многие заявки отклоняют — особенно если причина звучит как «нужны дополнительные данные для аналитики».
Когда использовать API: небольшие и средние объёмы, когда нужны структурированные и надёжные данные, когда важны комментарии и статистика канала, и когда вас устраивает потолок квоты.
Когда парсинг лучше: крупные проекты (>10K видео/день), поля, которых нет в API (полные транскрипты — captions.download требует OAuth и разрешения владельца видео), или когда нужно больше 500 результатов поиска на один запрос (жёсткий лимит API, независимо от totalResults).
No-code альтернатива: парсинг YouTube через Thunderbit без Python
Если Python нужен тебе как часть data pipeline — используй методы 1–4 выше. Но если данные из YouTube нужны за 2 минуты — например, ты маркетолог и собираешь статистику по конкурентам, или разработчик, которому нужен быстрый выгруз без настройки окружения, — есть более быстрый путь.
— это AI web scraper в виде расширения для Chrome, которое мы создали именно для случаев, когда писать код слишком затратно. Оно работает прямо на страницах YouTube в твоём браузере.
Как парсить YouTube с Thunderbit за 3 шага
Шаг 1: установи и открой страницу канала YouTube, результаты поиска или страницу видео.
Шаг 2: нажми "AI Suggest Fields" в боковой панели Thunderbit. AI прочитает страницу и предложит столбцы вроде названия видео, просмотров, даты загрузки, длительности, названия канала и URL миниатюры. При необходимости ты можешь добавлять, удалять и переименовывать столбцы.
Шаг 3: нажми "Scrape" и экспортируй данные в Google Sheets, Excel, CSV, Airtable или Notion. Данные попадут в аккуратную таблицу, готовую к работе.
Кому это подойдёт
- Маркетологам, которым нужны данные по каналам конкурентов, но они не пишут код
- Разработчикам, которым нужен быстрый выгруз без настройки virtual environment и установки зависимостей
- Тем, кто упирается в антибот-защиту — Thunderbit работает в твоём собственном авторизованном браузерном сеансе и использует твои cookies и PO tokens. Это помогает обойти многие блокировки, с которыми сталкиваются серверные скрапер-решения
- Thunderbit также может использовать , чтобы заходить на каждую страницу видео и обогащать таблицу дополнительными полями (лайки, описание, теги)
Если хочешь глубже разобраться, как Thunderbit работает именно с YouTube, загляни в и на .
Как парсить YouTube на Python и не получить блокировку
Эти советы подходят для всех четырёх Python-методов. Антибот-защита YouTube оценивается как , и основные сигналы детекта — это поведение IP, необходимость исполнять JS и часто меняющаяся HTML-структура.
Для всех методов:
- Меняй User-Agent и весь набор заголовков целиком —
Accept,Accept-Language,Sec-CH-UAи client hints должны совпадать с заявленным UA. содержит актуальный список. - Добавляй случайные паузы 2–8 секунд между запросами. Фиксированные интервалы — это сигнал для детекта.
- Используй residential proxies, если работаешь не с парой страниц. IP из дата-центров (AWS, GCP, Hetzner) к .
- Меняй сессию и IP одновременно — YouTube связывает сессии с IP, и один и тот же session cookie на двух IP выглядит подозрительно.
Для requests + BS4: задай cookie CONSENT=YES+cb. Без него запросы из ЕС будут редиректиться на страницу согласия без данных.
Для Selenium/Playwright: на Linux-серверах запускай headful с xvfb, а не --headless=new — headless Chrome всё ещё выдаёт достаточно фингерпринтов, чтобы продвинутые детекторы его распознали. Можно рассмотреть , который применяет около 17 обходов.
Для yt-dlp: используй sleep_interval и max_sleep_interval. Установи плагин для генерации PO Token. Используй --cookies-from-browser chrome с одноразовым аккаунтом.
Для API: отслеживай расход квоты в и эффективно батчь запросы. Один вызов videos.list с 50 ID через запятую стоит 1 единицу — используй это.
Для Thunderbit: антибот-защита обрабатывается автоматически, потому что скрапинг происходит в твоём браузерном сеансе. По сути, ты просто автоматизируешь то, что и так делал бы вручную.
Законно ли парсить YouTube на Python?
Это зависит от того, что именно ты парсишь, как ты это делаешь и что потом делаешь с данными.
Юридический ландшафт изменился в 2024 году после дела Meta Platforms v. Bright Data (Северный округ Калифорнии, январь 2024), где . После этого сбор публично доступных данных стал «значительно менее рискованным». С другой стороны, дело hiQ v. LinkedIn завершилось за нарушение ToS, нарушение CFAA (фальшивые аккаунты) и trespass to chattels — плюс постоянный судебный запрет.
Собственные сформулированы жёстко: «Вам запрещено использовать автоматизированные средства (например, роботы, ботнеты или скраперы) для доступа к сервису», кроме случаев, когда есть письменное разрешение или это разрешено действующим законодательством. Официально одобренный способ доступа к данным — это YouTube Data API.
Несколько практических правил:
- Сбор открыто видимых данных для личного исследования или некоммерческого анализа обычно менее рискован
- API — самый безопасный путь, потому что он прямо разрешён
- Не парси приватный или закрытый за логином контент, не скачивай защищённые авторским правом видео для дальнейшего распространения и не нарушай GDPR, если обрабатываешь персональные данные из комментариев
- Комментарии YouTube содержат персональные данные в смысле GDPR Art. 4(1) — обращайся с информацией об участниках из ЕС осторожно
- Для коммерческих scraping-проектов проконсультируйся с юристом
Это не юридическая консультация. Ситуация быстро меняется — новая волна исков по , которые скрапили YouTube для обучающих данных, уже меняет рынок в 2025–2026 годах.
Какой метод выбрать для парсинга YouTube на Python?
Короткий гид по выбору:
- Нужны быстрые метаданные с нескольких страниц? → Метод 1 (requests + BS4). Быстро, легко, почти без зависимостей, кроме
requestsиbeautifulsoup4. - Нужно парсить результаты поиска или работать с динамическими страницами? → Метод 2 (Selenium/Playwright). Полный рендеринг браузером, поддержка бесконечной прокрутки, но медленно и заметно для детекторов.
- Нужны массовые метаданные, комментарии или транскрипты? → Метод 3 (yt-dlp). Самый мощный одиночный инструмент — и не случайно.
- Нужны структурированные и надёжные данные в умеренном масштабе? → Метод 4 (YouTube Data API). Официально, чисто, но ограничено квотой .
- Нужны данные за 2 минуты без кода? → . Браузерное решение на AI, экспорт в Google Sheets в пару кликов.
Ни один метод не закрывает все кейсы. Добавь в закладки таблицу сравнения и справку по извлекаемым полям выше — это сэкономит время в следующем проекте. А если хочешь изучить ещё больше , в блоге Thunderbit есть много материалов: от до .
FAQ
Можно ли парсить YouTube без API key?
Да. Методы 1 (requests + BS4), 2 (Selenium/Playwright) и 3 (yt-dlp) не требуют API key. Он нужен только для Метода 4 (YouTube Data API). Thunderbit тоже работает без API key — он скрапит данные прямо в твоём браузере.
Какой самый быстрый способ парсить YouTube на Python?
Для Python самыми быстрыми будут yt-dlp и requests + BS4 — оба обходятся без браузера и могут получать метаданные за считанные секунды на видео. yt-dlp особенно быстр для пакетной обработки, потому что сам управляет пагинацией. Для тех, кто не пишет на Python, Thunderbit — самый быстрый вариант в целом, потому что настройка вообще не нужна.
Как парсить комментарии YouTube на Python?
yt-dlp имеет встроенное извлечение комментариев через опцию getcomments — это самый простой путь. YouTube Data API тоже поддерживает комментарии через commentThreads.list (1 единица квоты за вызов, до 100 комментариев на страницу). Selenium/Playwright технически тоже могут это сделать через прокрутку и извлечение отрендеренных элементов, но это медленно и ненадёжно.
Можно ли парсить YouTube Shorts на Python?
Да. yt-dlp хорошо обрабатывает метаданные Shorts — он воспринимает их как обычные видео с дополнительными полями, специфичными для Shorts. YouTube Data API поддерживает Shorts частично (подсчёт просмотров Shorts — теперь просмотром считается любое начало воспроизведения/повтор). У BS4 и Selenium/Playwright поддержка Shorts ограничена, потому что shelf Shorts использует другую DOM-структуру.
Сколько видео YouTube можно парсить в день?
С YouTube Data API ты ограничен примерно 10 000 единицами квоты в день. При использовании batched videos.list (50 ID за вызов и 1 единица) это теоретически даёт до 500 000 проверок статусов видео в день — но search.list по 100 единиц за вызов быстро съедает бюджет. Для scraping-методов (BS4, Selenium, yt-dlp) лимит скорее практический, чем жёстко прописанный: блокировки IP обычно начинаются после нескольких сотен или нескольких тысяч запросов на IP в день, в зависимости от прокси и паттерна запросов. Thunderbit использует систему кредитов, зависящую от твоего .
Узнать больше