Jak skrobać YouTube za pomocą Pythona

Komentarze: 0

Skrobanie danych z YouTube może być trudne ze względu na jego dynamiczną zawartość i środki zapobiegające skrobaniu. Jednak dzięki odpowiednim narzędziom i technikom można skutecznie wyodrębnić przydatne informacje. W tym artykule przeprowadzimy Cię przez proces skrobania danych wideo z YouTube przy użyciu Python, Playwright i lxml.

Konfiguracja środowiska

Zainstaluj niezbędne biblioteki za pomocą pip:

pip install playwright 
pip install lxml

Zainstaluj pliki binarne przeglądarki Playwright:

playwright install

Aby po prostu zainstalować pliki binarne przeglądarki Chromium, użyj następującego polecenia:

playwright install chromium

Do skrobania danych z YouTube za pomocą Pythona potrzebne będą przede wszystkim następujące biblioteki:

  1. Playwright: Potężna biblioteka do automatyzacji przeglądarek bezgłowych, umożliwiająca interakcję ze stronami internetowymi tak, jakbyś był prawdziwym użytkownikiem;
  2. lxml: Szybka i bogata w funkcje biblioteka do przetwarzania XML i HTML w Pythonie, obsługująca XPath do odpytywania dokumentów;
  3. Moduł CSV: Wbudowana biblioteka Pythona do zapisywania wyodrębnionych danych do pliku CSV.

Krok 1: Import wymaganych bibliotek

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

Krok 2: Bezgłowa automatyzacja przeglądarki

Uruchom bezgłową przeglądarkę z Playwright, przejdź do adresu URL wideo YouTube i poczekaj na pełne załadowanie strony.

Przewiń stronę, aby załadować więcej komentarzy.

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

# Przejście do adresu URL filmu w serwisie YouTube
await page.goto("https://www.youtube.com/watch?v=Ct8Gxo8StBU", wait_until="networkidle")

# Przewijanie w dół, aby załadować więcej komentarzy
for _ in range(20):
    await page.mouse.wheel(0, 200)
    await asyncio.sleep(0.2)

# Daje trochę czasu na załadowanie dodatkowej zawartości
await page.wait_for_timeout(1000)

Krok 3: Parsowanie zawartości HTML

Wyodrębnij zawartość HTML strony za pomocą Playwright i przeanalizuj ją za pomocą lxml.

# Wyodrębnianie zawartości strony
page_content = await page.content()

# Analizowanie zawartości HTML
parser = html.fromstring(page_content)

Krok 4: Ekstrakcja danych

Wyodrębnij wymagane punkty danych (np. tytuł, kanał, komentarze) za pomocą wyrażeń XPath.

Zbierz wszystkie istotne dane, w tym metadane wideo i komentarze.

# Wyodrębnianie danych wideo
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()')

Krok 5: Zapisywanie danych

Zapisz wyodrębnione dane w pliku CSV w celu łatwej analizy i przechowywania.

# Zapisywanie danych do pliku CSV
with open('youtube_video_data.csv', 'w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file)
    writer.writerow(["Title", "Channel", "Channel Link", "Posted", "Total Views", "Total Comments", "Comments"])
    writer.writerow([title, channel, channel_link, posted, total_views, total_comments, ", ".join(comments_list)])

Implementacja proxy

Serwery proxy odgrywają kluczową rolę w skrobaniu stron internetowych, szczególnie w przypadku ekstrakcji danych na dużą skalę lub witryn z surowymi środkami antybotowymi, takimi jak YouTube. Oto jak proxy są zaimplementowane w skrypcie Playwright:

Konfiguracja serwera proxy:

  1. Parametr proxy w playwright.chromium.launch() służy do kierowania całego ruchu przeglądarki przez określony serwer proxy.
  2. Szczegóły serwera proxy, w tym adres serwera, nazwa użytkownika i hasło, muszą być skonfigurowane.

browser = await playwright.chromium.launch(
        headless=True,
        proxy={"server": "http://your_proxy_ip:port", "username": "your_username", "password": "your_password"}
    )

Korzyści z używania proxy:

  • Maskowanie adresu IP: serwery proxy ukrywają oryginalny adres IP, zmniejszając prawdopodobieństwo zablokowania.
  • Dystrybucja żądań: poprzez rotację serwerów proxy można rozdzielać żądania na różne adresy IP, naśladując ruch od wielu użytkowników.
  • Dostęp do treści o ograniczonym dostępie: serwery proxy mogą pomóc ominąć ograniczenia regionalne lub uzyskać dostęp do treści, które mogą być ograniczone do określonych zakresów adresów IP.

Ta implementacja zapewnia mniejsze prawdopodobieństwo wykrycia i zablokowania działań związanych ze skrobaniem przez mechanizmy antybotowe YouTube.

Kompletna implementacja kodu

Poniżej znajduje się kompletny kod do skrobania danych wideo z YouTube przy użyciu Playwright i lxml, w tym implementacja proxy.

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

# Funkcja asynchroniczna do uruchamiania Playwright i wyodrębniania danych
async def run(playwright: Playwright) -> None:
    # Uruchamianie przeglądarki bezgłowej z ustawieniami proxy
    browser = await playwright.chromium.launch(
        headless=True,
        proxy={"server": "http://your_proxy_ip:port", "username": "your_username", "password": "your_password"}
    )
    context = await browser.new_context()
    page = await context.new_page()

    # Przejście do adresu URL filmu w serwisie YouTube
    await page.goto("https://www.youtube.com/watch?v=Ct8Gxo8StBU", wait_until="networkidle")

    # Przewijanie w dół, aby załadować więcej komentarzy
    for _ in range(20):
        await page.mouse.wheel(0, 200)
        await asyncio.sleep(0.2)
    
    # Daje trochę czasu na załadowanie dodatkowej zawartości
    await page.wait_for_timeout(1000)
    
    # Wyodrębnianie zawartości strony
    page_content = await page.content()

    # Zamykanie przeglądarki
    await context.close()
    await browser.close()

    # Analizowanie zawartości HTML
    parser = html.fromstring(page_content)

    # Wyodrębnianie danych wideo
    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()')

    # Zapisywanie danych do pliku CSV
    with open('youtube_video_data.csv', 'w', newline='', encoding='utf-8') as file:
        writer = csv.writer(file)
        writer.writerow(["Title", "Channel", "Channel Link", "Posted", "Total Views", "Total Comments", "Comments"])
        writer.writerow([title, channel, channel_link, posted, total_views, total_comments, ", ".join(comments_list)])

# Uruchamianie funkcji asynchronicznej
async def main():
    async with async_playwright() as playwright:
        await run(playwright)

asyncio.run(main())

Oto samouczek krok po kroku dotyczący korzystania z Pythona, Playwright i lxml do skrobania różnych danych wideo z YouTube, w tym komentarzy. Odbywa się to poprzez wykorzystanie serwerów proxy i uruchomienie kodu symulującego zachowanie przeglądarek w celu skutecznego skrobania dynamicznych danych przy jednoczesnym przestrzeganiu najlepszych praktyk w zakresie skrobania. Jeśli potrzebujesz informacji do analizy lub tworzenia zestawów danych, takie metody pomogą Ci przezwyciężyć trudności napotykane na platformie YouTube.

Komentarze:

0 komentarze