Скрапинг данных с YouTube с помощью Python

Комментарии: 0

Скрапинг данных с YouTube может стать сложной задачей из-за динамичного контента и защитных механизмов против скрапинга со стороны YouTube. Тем не менее, используя определенные инструменты и техники, можно успешно извлекать нужную информацию. В этой статье представлен подробный процесс сбора данных с видео на YouTube, осуществляемый с помощью Python, Playwright и lxml, что позволит эффективно скрапить данные для анализа или других целей.

Настройка среды для скрапинга данных

Перед началом скрапинга данных с YouTube, необходимо установить следующие библиотеки с помощью pip:

pip install playwright 
pip install lxml

Также следует установить бинарные файлы браузера Playwright, чтобы обеспечить возможность автоматизации взаимодействия с веб-страницами:

playwright install

Для установки только бинарных файлов браузера Chromium выполните следующую команду:

playwright install chromium

Описание основных библиотек, которые понадобятся для работы:

  1. Playwright: библиотека для автоматизации браузеров, позволяющая управлять взаимодействием со страницами, без необходимости отображения графического интерфейса.
  2. lxml: библиотека для работы с XML и HTML в Python, поддерживающая XPath, что позволяет эффективно проводить запросы к документам.
  3. CSV Module: библиотека Python, используемая для сохранения извлеченных данных в формате CSV, облегчающая дальнейшую обработку и анализ данных.

Далее будет подробно расписан процесс скрапинга пошагово.

Шаг 1: Импорт необходимых библиотек

import asyncio
from playwright.async_api import Playwright, async_playwright
from lxml import html
import csv

Шаг 2: Автоматизация браузера в режиме “Headless”

Следующий код запускает браузер в режиме без отрисовки интерфейса с помощью Playwright, переходит по URL видео на YouTube и ждет полной загрузки страницы. Далее страница прокручивается, чтобы загрузить больше комментариев.

browser = await playwright.chromium.launch(headless=True)
context = await browser.new_context()
page = await context.new_page()

# Переход по URL видео на YouTube
await page.goto("Ссылка HTTPS", wait_until="networkidle")

# Прокрутка страницы вниз для загрузки большего количества комментариев
for _ in range(20):
    await page.mouse.wheel(0, 200)
    await asyncio.sleep(0.2)

# Выделяем время для загрузки дополнительного содержимого
await page.wait_for_timeout(1000)

Шаг 3: Парсинг HTML-контента

Извлеките HTML-контент страницы с помощью Playwright и проанализируйте его с помощью lxml.

# Извлечение контента страницы
page_content = await page.content()

# Парсинг HTML-контента
parser = html.fromstring(page_content)

Шаг 4: Извлечение данных

Извлеките необходимые данные (название видео, название канала, комментарии) с помощью выражений XPath. Соберите всю соответствующую информацию, включая метаданные видео и комментарии.

# Извлечение данных видео
title = parser.xpath('//div[@id="title"]/h1/yt-formatted-string/text()')[0]
channel = parser.xpath('//yt-formatted-string[@id="text"]/a/text()')[0]
channel_link = 'https://www.youtube.com' + parser.xpath('//yt-formatted-string[@id="text"]/a/@href')[0]
posted = parser.xpath('//yt-formatted-string[@id="info"]/span/text()')[2]
total_views = parser.xpath('//yt-formatted-string[@id="info"]/span/text()')[0]
total_comments = parser.xpath('//h2[@id="count"]/yt-formatted-string/span/text()')[0]
comments_list = parser.xpath('//yt-attributed-string[@id="content-text"]/span/text()')

Шаг 5: Сохранение данных

Сохраните извлеченные данные в файл CSV для удобного анализа и хранения.

# Сохранение данных в файл CSV
with open('youtube_video_data.csv', 'w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file)
    writer.writerow([“Название”, “Канал”, “Ссылка на канал”, “Дата публикации”, “Всего просмотров”, “Всего комментариев”, “Комментарии”])
    writer.writerow([title, channel, channel_link, posted, total_views, total_comments, ", ".join(comments_list)])

Интеграция прокси

Прокси имеют ключевое значение для успешного веб-скрапинга, особенно когда нужно собирать данные в больших объемах или на сайтах с системами защиты против автоматического сбора данных. Прокси помогают обойти эти ограничения,благодаря  ротации IP-адресов.

Настройка прокси:

  1. В Playwright параметр proxy в функции playwright.chromium.launch() задает маршрутизацию трафика браузера через выбранный прокси-сервер.
  2. Для использования прокси требуется указать его IP-адрес, порт, логин и пароль в настройках подключения.

browser = await playwright.chromium.launch(
        headless=True,
        proxy={"server": "http://your_proxy_ip:port", "username": "логин", "password": "пароль"}
    )

Преимущества использования прокси включают:

  • Маскировка IP-адреса: использование прокси позволяет скрывать ваш реальный IP-адрес, тем самым уменьшая риск блокировок со стороны целевых сервисов.
  • Распределение запросов: смена IP-адресов через прокси позволяет распределять запросы, создавая видимость трафика от различных пользователей.
  • Доступ к ограниченному контенту: прокси помогают обходить географические и другие региональные ограничения, предоставляя доступ к контенту, который может быть недоступен для определенных IP-адресов.

Эффективная настройка прокси повышает анонимность и снижает вероятность обнаружения ваших скрапинг-операций системами антибот защиты, такими как на YouTube.

Финальная версия кода

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

import asyncio
from playwright.async_api import Playwright, async_playwright
from lxml import html
import csv

# Асинхронная функция для работы с Playwright и извлечения данных
async def run(playwright: Playwright) -> None:
    # Запуск браузера в режиме “Headless” с настройками прокси
    browser = await playwright.chromium.launch(
        headless=True,
        proxy={"server": "http://your_proxy_ip:port", "username": "логин", "password": "пароль"}
    )
    context = await browser.new_context()
    page = await context.new_page()

    # Переход на URL видео YouTube
    await page.goto("HTTPS ссылка")

    # Прокрутка страницы для загрузки большего количества комментариев
    for _ in range(20):
        await page.mouse.wheel(0, 200)
        await asyncio.sleep(0.2)
    
    # Ожидание загрузки дополнительного контента
    await page.wait_for_timeout(1000)
    
    # Извлечение содержимого страницы
    page_content = await page.content()

    # Закрытие браузера
    await context.close()
    await browser.close()

    # Парсинг HTML содержимого
    parser = html.fromstring(page_content)

    # Извлечение данных видео
    title = parser.xpath('//div[@id="title"]/h1/yt-formatted-string/text()')[0]
    channel = parser.xpath('//yt-formatted-string[@id="text"]/a/text()')[0]
    channel_link = 'https://www.youtube.com' + parser.xpath('//yt-formatted-string[@id="text"]/a/@href')[0]
    posted = parser.xpath('//yt-formatted-string[@id="info"]/span/text()')[2]
    total_views = parser.xpath('//yt-formatted-string[@id="info"]/span/text()')[0]
    total_comments = parser.xpath('//h2[@id="count"]/yt-formatted-string/span/text()')[0]
    comments_list = parser.xpath('//yt-attributed-string[@id="content-text"]/span/text()')

    # Сохранение данных в CSV-файл
    with open('youtube_video_data.csv', 'w', newline='', encoding='utf-8') as file:
        writer = csv.writer(file)
        writer.writerow([“Название”, “Канал”, “Ссылка на канал”, “Дата публикации”, “Всего просмотров”, “Всего комментариев”, “Комментарии”])
        writer.writerow([title, channel, channel_link, posted, total_views, total_comments, ", ".join(comments_list)])

# Запуск асинхронной функции
async def main():
    async with async_playwright() as playwright:
        await run(playwright)

asyncio.run(main())

Стоит отметить важность правильной настройки среды для скрапинга данных с YouTube, особенно акцентируя внимание на использовании прокси для обхода ограничений платформы. Рекомендуется особо внимательно подходить к выбору прокси-серверов, чтобы максимально снизить риски блокировки и обеспечить анонимность операций. Наиболее подходящими станут статические ISP прокси, поскольку они обеспечивают высокую скорость соединения и стабильность работы. Резидентские прокси-серверы предоставляют динамические IP-адреса, которые обладают высоким показателем траст-фактора и редко определяются системами безопасности YouTube.Также важно соблюдать этические нормы при сборе данных, чтобы избежать нарушений правил использования сервиса.

Комментарии:

0 комментариев