Логотип «2Captcha»Перейти на главную страницу
Туториалы по обходу капчи

Эта статья была полезной?

Как парсить YouTube

Грегори Фишер
Грегори Фишер

Технический специалист

YouTube — крупнейшая видеоплатформа, и парсинг её данных (комментариев, метаданных видео, результатов поиска) имеет свою специфику. В отличие от многих сайтов, эффективный скрапер YouTube не обязан полагаться на тяжелые headless-браузеры для рендеринга JavaScript.

Вместо этого он может читать данные напрямую из тех же конечных точек (Innertube API), которые использует собственный фронтенд YouTube. Однако существуют важные нюансы: комментарии подгружаются через цепочку токенов продолжения (continuation tokens), а при подозрительной активности сайт может выдать challenge-проверку.

В этом руководстве мы разберем, как извлекать данные надежно и быстро, используя open-source проект 2scraper/youtube-scraper, минимизируя накладные расходы и грамотно обрабатывая защиты.

Что мы создадим

Скрипт, способный работать в трёх режимах:

  1. Комментарии (по умолчанию): извлечение тредов и ответов на них с конкретного видео.
  2. Видео: сбор точных метаданных (точная дата загрузки в ISO, длительность, категория, ключевые слова).
  3. Поиск: получение списка видео по поисковому запросу (часто используется как источник URL для последующего парсинга комментариев).

Извлекаемые данные (для режима комментариев) включают: sku (ID комментария), title (название видео), text, author_name, like_count, reply_count, published_at_approx, reply_level, parent_id, is_pinned и creator_hearted.

Важно: Репозиторий намеренно заменяет имена авторов и текст комментариев в своих примерах (sample_output), так как публикация чужих слов требует отдельного правового обоснования. Однако все метрики, таймстампы и флаги извлекаются в исходном, нетронутом виде.

Требования

  • Python: версии 3.9 или новее.
  • Транспорт: По умолчанию (--transport auto) браузер не требуется. Скрипт использует обычные HTTPS-запросы, что делает его очень быстрым.
  • Браузерные движки (опционально): Playwright, Selenium или Puppeteer. Нужны только если сайт начнет отказывать в доступе через обычный HTTP.
  • Внешние сервисы (опционально): Ключ API 2Captcha (TWOCAPTCHA_KEY) для решения редких challenge-проверок.

Настройка проекта

  1. Клонируйте репозиторий и создайте виртуальное окружение:

    bash Copy
    git clone https://github.com/2scraper/youtube-scraper.git
    cd youtube-scraper
    python3 -m venv .venv
    source .venv/bin/activate  # Для Windows: .venv\Scripts\activate
  2. Установите базовые зависимости. Браузерные библиотеки не устанавливаются по умолчанию, что предотвращает конфликты версий зависимостей:

    bash Copy
    pip install -r requirements.txt
  3. Если вы планируете использовать браузерный режим (например, для обхода блокировок), установите зависимости конкретного движка отдельно:

    bash Copy
    pip install -r requirements-playwright.txt
    playwright install chromium

Быстрый старт

Основной точкой входа является youtube_scraper.py. Вот примеры запуска для каждого режима:

bash Copy
# 1. Комментарии (по умолчанию): 3 страницы (60 топ-комментариев), сортировка по новым, с ответами
python3 youtube_scraper.py --url "dQw4w9WgXcQ" --pages 3 --sort newest --replies

# 2. Метаданные видео (точный ISO-формат даты загрузки, длительность, теги)
python3 youtube_scraper.py --url "dQw4w9WgXcQ" --mode video

# 3. Поиск: найти видео по запросу (чтобы затем скормить их URL в режим комментариев)
python3 youtube_scraper.py --url "web scraping tutorial" --mode search --pages 3

Примечание о пагинации: В режиме комментариев страница (--pages) — это не экран, а порция данных. Одна страница равна 20 топ-комментариям. Если включен флаг --replies, каждая ветка с ответами потребует дополнительного запроса.

Как работает скрапер: Транспорты

Архитектура репозитория разделяет логику выполнения (run_core.py) и драйверы. Это позволяет гибко выбирать транспорт:

Транспорт Поведение Скорость (пример)
--transport http Только прямые HTTPS-запросы. Если сайт отказывает, выполнение прерывается. ~2.0 сек
--transport auto По умолчанию. Начинает с HTTPS. Если обнаруживается challenge, автоматически запускает браузер и переключается на него до конца запуска. ~2.0 сек (без challenge)
--transport browser Всегда использует headless-браузер (Playwright/Selenium). ~3.4 сек

Использование auto или http дает значительный прирост производительности, так как исключает накладные расходы на запуск браузера, парсинг DOM и выполнение JavaScript, если в этом нет реальной необходимости.

Извлечение данных

1. Режим комментариев (Innertube API)

Скрапер эмулирует POST-запросы, которые делает фронтенд YouTube. Он получает начальный набор комментариев и использует continuation token из ответа для запроса следующих порций.

  • Ответы на комментарии (replies) имеют собственный токен продолжения.
  • Поле parent_id автоматически вычисляется из sku (ID комментария), так как ID ответа всегда содержит ID родительского комментария, разделенный точкой. Это позволяет восстанавливать древовидную структуру без дополнительного бэкенда.

2. Режим видео (Двойной запрос)

Для получения полных метаданных скрапер делает два запроса на одно видео:

  1. /next: получает базовую информацию и отрендеренные цифры (просмотры, лайки).
  2. /player: извлекает точную дату загрузки в формате ISO, длительность в секундах, категорию и список ключевых слов (тегов), которых нет в первом ответе.

3. Ограничение сторонних API (Важный факт)

Репозиторий прямо указывает: сервисы вроде Scraper API, которые просто возвращают отрендеренный HTML страницы, не могут извлечь комментарии YouTube. YouTube не рендерит комментарии в исходный HTML; они подгружаются отдельным POST-запросом, который такие сервисы не эмулируют. Попытки использовать waitFor для появления комментариев в таких сервисах приводят к таймаутам (HTTP 408) или ошибкам валидации (HTTP 422).

Работа с Anti-Bot защитой и CAPTCHA

Хотя YouTube редко блокирует обычные запросы на просмотр, при массовом сборе данных может сработать защита.

Обнаружение и эскалация

При использовании --transport auto скрапер анализирует ответ. Если классифицируется как challenge, он запускает браузер (если он еще не запущен) и переключается на него. Обратное переключение на HTTP не происходит, так как сайт, заблокировавший сессию один раз, с высокой вероятностью сделает это снова.

Решение CAPTCHA через 2Captcha

Если включен параметр --solve-captcha when-blocked (по умолчанию) и предоставлен --twocaptcha-key, скрапер попытается решить задачу.

  • Важное ограничение: Решение CAPTCHA работает только в браузерном транспорте. У чистого HTTP-клиента нет DOM-дерева, в которое можно было бы внедрить решенный токен. Поэтому при --transport http скрапер честно предупредит о невозможности решения и завершит работу, а не будет бесконечно пытаться.

Использование прокси

Поддержка прокси встроена и может быть задана через --proxy или файл --proxy-file.

Критически важная деталь ротации:
Если вы используете --proxy-rotate per-page, скрапер не просто меняет IP-адрес на лету. Он полностью закрывает текущую браузерную сессию и создает новую. Это сделано намеренно: если бот-менеджер YouTube выдал куки для IP-адреса А, а вы попытаетесь использовать их с IP-адреса Б, это создаст гораздо более сильный сигнал аномалии, чем отсутствие куки вообще. Полная пересборка сессии безопаснее.

Масштабирование скрапера

  1. Ограничение параллельности (--concurrency):
    В режиме comments параллелизм выше 1 игнорируется (или принудительно снижается до 1). Это не ошибка, а архитектурное ограничение: страница комментариев адресуется токеном, который выдает предыдущая страница. Два воркера не могут независимо запрашивать страницу 2, не имея результата страницы 1. Параллелизм эффективен только в режиме video, где каждое видео имеет независимый URL.
  2. Безопасный CSV: При экспорте в CSV (--format csv) любое значение, начинающееся с =, +, -, @ или табуляции (например, @username автора), автоматически экранируется ведущей кавычкой '. Это предотвращает атаки через формулы в электронных таблицах (CSV Injection).
  3. Лимиты решений: Используйте --max-solves, чтобы ограничить бюджет на решение CAPTCHA в случае массовых блокировок.

Устранение проблем

Проблема Возможная причина Решение
Скрапер выдает 0 комментариев, хотя они есть Используется сторонний HTML-render API (например, Scraper API) Перейдите на --transport auto или browser. Сторонние рендереры не эмулируют POST-запросы Innertube.
Ошибка ModuleNotFoundError при запуске Попытка использовать --transport browser без установки зависимостей движка Установите requirements-playwright.txt (или selenium/puppeteer) в чистом виртуальном окружении.
Предупреждение о невозможности решения CAPTCHA Запущен режим --transport http при обнаружении challenge Переключитесь на --transport auto или browser, чтобы у скрапера был DOM для инъекции токена.
Параллельный запуск (--concurrency > 1) не ускоряет сбор комментариев Архитектурное ограничение цепочки continuation tokens Это ожидаемое поведение. Для ускорения параллельте обработку разных видео (режим video), а не страниц одного видео.
Данные в CSV выглядят сломанными в Excel Имя автора начинается с @, Excel интерпретирует это как формулу Это защитный механизм скрапера. Откройте файл через Импорт данных в Excel или используйте формат json.

Пример результата

Фрагмент реального вывода в формате JSON (данные автора анонимизированы в соответствии с политикой репозитория, метрики — реальные):

json Copy
{
  "source": "youtube.com",
  "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ&lc=UgzX1Y2Z3...",
  "sku": "UgzX1Y2Z3...",
  "title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)",
  "text": "[Comment text redacted for privacy]",
  "author_name": "@[channel_handle]",
  "author_is_verified": true,
  "like_count": 318000,
  "like_count_text": "318K",
  "reply_count": 962,
  "published_time_text": "1 year ago",
  "published_at_approx": "2025-09-21T02:10:14Z",
  "published_at_precision": "year",
  "edited": false,
  "reply_level": 0,
  "parent_id": null,
  "is_pinned": true,
  "pinned_by": "Pinned by @[channel_handle]",
  "creator_hearted": true,
  "sort": "top",
  "data_source": "innertube.entity"
}

Полный компактный пример кода

Поскольку репозиторий предоставляет готовый, оптимизированный CLI, лучший способ интеграции — вызов его логики. Ниже приведен минимальный Python-скрипт, демонстрирующий, как можно программно вызвать ядро скрапера:

python Copy
import subprocess
import json
import sys
import os

def scrape_youtube_comments(video_id: str, pages: int = 2):
    """
    Запускает youtube_scraper.py с транспортом auto (HTTPS с фоллбэком на браузер).
    Возвращает список комментариев в виде словарей Python.
    """
    command = [
        sys.executable, "youtube_scraper.py",
        "--url", video_id,
        "--pages", str(pages),
        "--format", "json",
        "--out", "temp_output"
    ]
    
    # Запускаем процесс
    result = subprocess.run(command, capture_output=True, text=True)
    
    if result.returncode != 0:
        print(f"Ошибка выполнения: {result.stderr}")
        return []
        
    # Читаем результат
    try:
        with open("temp_output.json", "r", encoding="utf-8") as f:
            data = json.load(f)
            return data.get("items", [])
    except FileNotFoundError:
        print("Файл результата не найден.")
        return []
    finally:
        # Очистка временного файла
        if os.path.exists("temp_output.json"):
            os.remove("temp_output.json")

if __name__ == "__main__":
    # Пример: получить 2 страницы (40 комментариев) с видео
    comments = scrape_youtube_comments("dQw4w9WgXcQ", pages=2)
    
    print(f"Извлечено {len(comments)} комментариев.")
    for c in comments[:3]: # Показать первые 3
        print(f"- [{c['like_count']} likes] {c['author_name']}: {c['published_time_text']}")

Заключение

Надежный парсинг YouTube не требует постоянного использования тяжелых браузеров. Понимание того, что фронтенд YouTube общается через Innertube API, позволяет использовать быстрый HTTPS-транспорт (--transport auto), экономя ресурсы и время.

Браузерные движки и интеграция с 2Captcha должны рассматриваться как страховочный механизм на случай срабатывания challenge-проверок, а не как основной метод работы. Для задач мониторинга используйте режим video для точных метаданных и всегда проверяйте вывод на наличие признаков блокировки через метаданные выполнения.