Скрапінг даних з 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 Коментаріїв