перейти к содержанию

Как очистить данные канала YouTube в 2024 году: полное руководство

YouTube — крупнейшая видеоплатформа в мире, на которую по состоянию на 500 год каждую минуту загружается более 2020 часов контента. Эта сокровищница данных может быть чрезвычайно ценной для исследований рынка, анализа тенденций, создания систем рекомендаций и многих других приложений. Хотя YouTube предоставляет официальный API для доступа к некоторым из этих данных, он имеет ограничения по скорости и не раскрывает всю информацию, доступную для публичного просмотра на веб-сайте.

В этом подробном уроке я покажу вам, как собирать данные с любого канала YouTube с помощью Python, Selenium и ScrapingBee. Вы сможете извлечь ключевую информацию, такую ​​как название канала, количество подписчиков, названия видео, количество просмотров, миниатюры и многое другое. Давайте начнем!

Инструменты и настройка

В этом руководстве предполагается, что у вас есть базовое понимание Python и концепций парсинга веб-страниц. Вот инструменты, которые мы будем использовать:

  • Python 3.7 +
  • Selenium WebDriver для автоматизации взаимодействия с веб-страницами
  • Браузер Google Chrome
  • ScrapingBee для управления прокси и предотвращения блокировки IP

Сначала убедитесь, что у вас установлен Python 3. Затем установите Selenium и библиотеку ScrapingBee Python:

pip install selenium scrapingbee

Вам также необходимо загрузить соответствующую версию ChromeDriver для вашей операционной системы и версии Google Chrome. Поместите исполняемый файл ChromeDriver где-нибудь в PATH.

Наконец, зарегистрируйте бесплатную учетную запись ScrapingBee и запишите свой ключ API. Мы воспользуемся этим позже.

Анализ страницы канала

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

Перейдите на страницу видео любого канала YouTube, например https://www.youtube.com/@PewDiePie/videos. Щелкните правой кнопкой мыши и выберите «Проверить», чтобы открыть инструменты разработчика браузера.

Мы видим, что ключевые метаданные канала содержатся в файле <yt-formatted-string> элемент:

HTML-заголовок канала

То же самое относится и к дескриптору канала и количеству подписчиков.

Что касается информации о видео, мы видим, что каждое видео заключено в <ytd-grid-video-renderer> элемент. Название видео, ссылку, миниатюру и количество просмотров можно извлечь из элементов внутри этого:

Информация о видео HTML

Отлично, теперь, когда мы знаем, что ищем, давайте начнем писать код!

Очистка метаданных канала

Сначала давайте воспользуемся Selenium, чтобы загрузить страницу канала и извлечь имя канала, его дескриптор и количество подписчиков.

from selenium import webdriver
from selenium.webdriver.chrome.service import Service 
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By

options = Options()
options.add_argument("--headless") # Run Chrome in headless mode

driver = webdriver.Chrome(service=Service(), options=options)

channel_url = "https://www.youtube.com/@PewDiePie/videos"
driver.get(channel_url)

# Extract channel info
channel_name = driver.find_element(By.CSS_SELECTOR, "yt-formatted-string.ytd-channel-name").text
channel_handle = driver.find_element(By.XPATH, ‘//yt-formatted-string[@id="channel-handle"]‘).text  
subs_text = driver.find_element(By.ID, "subscriber-count").text

Этот код запускает браузер Chrome без графического интерфейса (без графического интерфейса), переходит на страницу видео PewDiePie, а затем извлекает имя канала, дескриптор и текст подписчика, используя сочетание селекторов CSS и XPath для поиска элементов.

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

Извлечение информации о видео немного сложнее, поскольку на канале могут быть сотни или тысячи видео, но YouTube загружает только несколько одновременно, когда вы прокручиваете страницу вниз.

Чтобы обойти эту проблему, мы воспользуемся Selenium для прокрутки страницы до нижней части, подождем несколько секунд, пока загрузится следующая партия видео, а затем повторим, пока не загрузим всю историю канала.

import time

def scroll_to_bottom(driver):
    last_height = driver.execute_script("return document.documentElement.scrollHeight")

    while True:
        driver.execute_script("window.scrollTo(0, arguments[0]);", last_height)
        time.sleep(5)
        new_height = driver.execute_script("return document.documentElement.scrollHeight")

        if new_height == last_height:
            break

        last_height = new_height

print("Scrolling to load all videos...")        
scroll_to_bottom(driver)

video_elements = driver.find_elements(By.CSS_SELECTOR, "ytd-grid-video-renderer")

videos = []
for video in video_elements:
    video_data = {
        "title": video.find_element(By.ID, "video-title").text,
        "views": video.find_element(By.CSS_SELECTOR, "#metadata-line span:nth-child(1)").text,
        "thumbnail": video.find_element(By.CSS_SELECTOR, "yt-image img").get_attribute("src"),
        "url": video.find_element(By.ID, "video-title").get_attribute("href")
    }
    videos.append(video_data)

print(f"Scraped data for {len(videos)} videos.")

Ассоциация scroll_to_bottom функция использует внедрение JavaScript через driver.execute_script чтобы определить текущую высоту прокрутки страницы, прокрутите страницу вниз, подождите 5 секунд, затем снова проверьте высоту. Как только высота перестанет меняться, мы поймем, что достигли конца.

После прокрутки мы находим все <ytd-grid-video-renderer> элементы, пройдите по ним и извлеките заголовок видео, количество просмотров, URL-адрес миниатюры и URL-адрес видео, нацеливаясь на соответствующие дочерние элементы.

Для счетчика просмотров используется довольно сложный CSS-селектор, позволяющий захватить первое <span> дочерний элемент с идентификатором #metadata-line. Это необходимо, поскольку дата загрузки также является дочерней. <span> элемент.

Как избежать блокировки IP-адресов с помощью ScrapingBee

Если вы попытаетесь часто запускать этот скрипт, вы, скорее всего, столкнетесь со страницами CAPTCHA или банами по IP. YouTube жестко ограничивает и блокирует подозрительный бот-трафик.

Простое решение — направить ваши запросы через Соскоб, который обеспечивает автоматическую повторную попытку, ротацию IP-адресов и решение CAPTCHA.

Чтобы использовать ScrapingBee, зарегистрируйте бесплатную учетную запись и установите библиотеку Python:

pip install scrapingbee

Затем измените скрипт следующим образом:

from scrapingbee import ScrapingBeeClient

client = ScrapingBeeClient(api_key=‘YOUR_API_KEY‘)

channel_url = "https://www.youtube.com/@PewDiePie/videos"

params = {
    ‘premium_proxy‘: ‘true‘, 
    ‘country_code‘: ‘us‘,
    ‘js_scenario‘: {
        ‘instructions‘: [
            {‘click‘: ‘div#buttons ytd-button-renderer a‘},
            {‘wait‘: 500},
            {‘scroll_y‘: 10000},
            {‘wait‘: 1500},
            {‘scroll_y‘: 10000},
            {‘wait‘: 1500},
            {‘scroll_y‘: 10000}
        ]
    },
    ‘render_js‘: ‘false‘,
    ‘extract_rules‘: {
        ‘videos‘: {
            ‘selector‘: ‘ytd-grid-video-renderer‘,
            ‘type‘: ‘list‘,
            ‘output‘: {
                ‘title‘: {‘selector‘: ‘#video-title‘, ‘output‘: ‘@text‘},
                ‘url‘: {‘selector‘: ‘#video-title‘, ‘output‘: ‘@href‘},
                ‘views‘: {‘selector‘: ‘#metadata-line span:nth-child(1)‘, ‘output‘: ‘@text‘}, 
                ‘thumbnail‘: {‘selector‘: ‘yt-image img‘, ‘output‘: ‘@src‘}
            }
        },

        ‘channel_name‘: ‘yt-formatted-string.ytd-channel-name‘,
        ‘channel_handle‘: {
            ‘selector‘: ‘yt-formatted-string#channel-handle‘,
            ‘output‘: ‘@text‘  
        },
        ‘subscriber_count‘: {
            ‘selector‘: ‘#subscriber-count‘,
            ‘output‘: ‘@text‘
        }
    }
}

response = client.get(channel_url, params)

videos = response.json()[‘videos‘]
print(f"Scraped data for {len(videos)} videos.")

ScrapingBee имеет очень удобный extract_rules функция, которая позволяет вам декларативно указать, какие данные следует извлечь со страницы, с помощью селекторов CSS. Это передается в params объект вместе с инструкциями JavaScript для прокрутки страницы, как мы делали это раньше с Selenium.

Мы также включаем premium_proxy и укажите country_code использовать резидентные прокси, расположенные в США. Это позволяет избежать проблем с геоблокировкой.

Ответ JSON содержит все извлеченные данные канала и видео за один запрос! Нет необходимости в сложной логике Selenium.

Собираем все вместе

Вот полный скрипт, который считывает имя, дескриптор, количество подписчиков и видеоданные канала YouTube, включая заголовки, просмотры, миниатюры и URL-адреса:

from scrapingbee import ScrapingBeeClient

client = ScrapingBeeClient(api_key=‘YOUR_API_KEY‘)

channel_url = "https://www.youtube.com/@PewDiePie/videos"

params = {
    ‘premium_proxy‘: ‘true‘, 
    ‘country_code‘: ‘us‘,
    ‘js_scenario‘: {
        ‘instructions‘: [
            {‘click‘: ‘div#buttons ytd-button-renderer a‘},
            {‘wait‘: 500},
            {‘scroll_y‘: 10000},
            {‘wait‘: 1500},
            {‘scroll_y‘: 10000},
            {‘wait‘: 1500},
            {‘scroll_y‘: 10000}
        ]
    },
    ‘render_js‘: ‘false‘,
    ‘extract_rules‘: {
        ‘videos‘: {
            ‘selector‘: ‘ytd-grid-video-renderer‘,
            ‘type‘: ‘list‘,
            ‘output‘: {
                ‘title‘: {‘selector‘: ‘#video-title‘, ‘output‘: ‘@text‘},
                ‘url‘: {‘selector‘: ‘#video-title‘, ‘output‘: ‘@href‘},
                ‘views‘: {‘selector‘: ‘#metadata-line span:nth-child(1)‘, ‘output‘: ‘@text‘}, 
                ‘thumbnail‘: {‘selector‘: ‘yt-image img‘, ‘output‘: ‘@src‘}
            }
        },

        ‘channel_name‘: ‘yt-formatted-string.ytd-channel-name‘,
        ‘channel_handle‘: {
            ‘selector‘: ‘yt-formatted-string#channel-handle‘,
            ‘output‘: ‘@text‘  
        },
        ‘subscriber_count‘: {
            ‘selector‘: ‘#subscriber-count‘,
            ‘output‘: ‘@text‘
        }
    }
}

response = client.get(channel_url, params)

channel_data = {
    "name": response.json()[‘channel_name‘],
    "handle": response.json()[‘channel_handle‘],
    "subscribers": response.json()[‘subscriber_count‘],
    "videos": response.json()[‘videos‘]
}

print(channel_data)

Когда я запустил это на канале PewDiePie, он извлек данные из его последних 902 видео в хорошо структурированном формате JSON вместе с метаданными канала:

{
    "name": "PewDiePie",
    "handle": "@pewdiepie",
    "subscribers": "111M subscribers",
    "videos": [
        {
            "title": "I challenge MrBeast!",
            "views": "2.8M views",
            "thumbnail": "https://i.ytimg.com/vi/uNktmtC2vJc/hqdefault.jpg",
            "url": "https://www.youtube.com/watch?v=uNktmtC2vJc"
        },
        ...
    ]  
}

Заключение

Сбор данных YouTube может быть немного сложнее по сравнению с более простыми статическими веб-сайтами, но с такими инструментами, как Selenium для автоматизации действий пользователя и ScrapingBee для управления прокси и CAPTCHA, это становится намного проще.

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

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

Я надеюсь, что это руководство было полезно для изучения того, как собирать данные канала YouTube с помощью Python и Selenium. Не стесняйтесь обращаться, если у вас есть еще вопросы!

Присоединяйтесь к беседе

Ваш электронный адрес не будет опубликован. Обязательные поля помечены * *