Come effettuare lo scrape di YouTube con Python

Commenti: 0

Lo scraping di dati da YouTube può essere impegnativo a causa del suo contenuto dinamico e delle misure anti-scraping. Tuttavia, con gli strumenti e le tecniche giuste, è possibile estrarre in modo efficiente informazioni utili. In questo articolo vi illustreremo il processo di scraping dei dati video di YouTube utilizzando Python, Playwright e lxml.

Impostazione dell'ambiente

Installare le librerie necessarie utilizzando pip:

pip install playwright 
pip install lxml

Installare i binari del browser Playwright:

playwright install

Per installare semplicemente i binari del browser Chromium, utilizzare il seguente comando:

playwright install chromium

Per il web scraping dei dati di YouTube con Python, sono necessarie principalmente le seguenti librerie:

  1. Playwright: Una potente libreria per automatizzare i browser headless, consentendovi di interagire con le pagine web come se foste un utente reale;
  2. lxml: Una libreria veloce e ricca di funzionalità per l'elaborazione di XML e HTML in Python, che supporta XPath per l'interrogazione dei documenti;
  3. Modulo CSV: Una libreria Python integrata per salvare i dati estratti in un file CSV.

Fase 1: Importare le librerie necessarie

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

Fase 2: automazione del browser senza testa

Avviare un browser headless con Playwright, navigare verso l'URL del video di YouTube e attendere il caricamento completo della pagina.

Scorrere la pagina per caricare altri commenti.

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

# Navigazione verso l'URL del video di YouTube
await page.goto("https://www.youtube.com/watch?v=Ct8Gxo8StBU", wait_until="networkidle")

# Scorrere verso il basso per caricare altri commenti
for _ in range(20):
    await page.mouse.wheel(0, 200)
    await asyncio.sleep(0.2)

# Dare un po' di tempo per il caricamento dei contenuti aggiuntivi
await page.wait_for_timeout(1000)

Fase 3: analisi del contenuto HTML

Estrarre il contenuto HTML della pagina con Playwright e analizzarlo con lxml.

# Estrazione del contenuto della pagina
page_content = await page.content()

# Parsing del contenuto HTML
parser = html.fromstring(page_content)

Fase 4: Estrazione dei dati

Estrarre i dati richiesti (ad esempio, titolo, canale, commenti) utilizzando le espressioni XPath.

Raccogliere tutti i dati rilevanti, compresi i metadati del video e i commenti.

# Estrazione dei dati video
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()')

Fase 5: Salvataggio dei dati

Salvare i dati estratti in un file CSV per facilitarne l'analisi e l'archiviazione.

# Salvataggio dei dati in un file 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)])

Implementazione del proxy

I proxy svolgono un ruolo cruciale nello scraping del web, soprattutto quando si tratta di estrazione di dati su larga scala o di siti con severe misure anti-bot come YouTube. Ecco come vengono implementati i proxy nello script di Playwright:

Impostazione del proxy:

  1. Il parametro proxy in playwright.chromium.launch() è usato per instradare tutto il traffico del browser attraverso un server proxy specificato.
  2. È necessario configurare i dettagli del server proxy, compresi l'indirizzo del server, il nome utente e la password.

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

Vantaggi dell'uso dei proxy:

  • Mascheramento dell'IP: i proxy nascondono il vostro indirizzo IP originale, riducendo la probabilità di essere bloccati.
  • Distribuzione delle richieste: ruotando i proxy, è possibile distribuire le richieste su diversi indirizzi IP, simulando il traffico di più utenti.
  • Accesso a contenuti limitati: i proxy possono aiutare a bypassare le restrizioni regionali o ad accedere a contenuti che potrebbero essere limitati a determinati intervalli IP.

Questa implementazione garantisce che le attività di scraping abbiano meno probabilità di essere rilevate e bloccate dai meccanismi anti-bot di YouTube.

Implementazione completa del codice

Di seguito è riportato il codice completo per lo scraping dei dati video di YouTube utilizzando Playwright e lxml, compresa l'implementazione del proxy.

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

# Funzione asincrona per eseguire Playwright ed estrarre i dati
async def run(playwright: Playwright) -> None:
    # Avvio del browser headless con le impostazioni del 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()

    # Navigazione verso l'URL del video di YouTube
    await page.goto("https://www.youtube.com/watch?v=Ct8Gxo8StBU", wait_until="networkidle")

    # Scorrere verso il basso per caricare altri commenti
    for _ in range(20):
        await page.mouse.wheel(0, 200)
        await asyncio.sleep(0.2)
    
    # Dare un po' di tempo per il caricamento dei contenuti aggiuntivi
    await page.wait_for_timeout(1000)
    
    # Estrazione del contenuto della pagina
    page_content = await page.content()

    # Chiusura del browser
    await context.close()
    await browser.close()

    # Parsing del contenuto HTML
    parser = html.fromstring(page_content)

    # Estrazione dei dati video
    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()')

    # Salvataggio dei dati in un file 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)])

# Esecuzione della funzione asincrona
async def main():
    async with async_playwright() as playwright:
        await run(playwright)

asyncio.run(main())

Ecco un tutorial passo passo sull'uso di Python, Playwright e lxml per lo scraping di vari dati di video di YouTube, compresi i commenti. Ciò avviene utilizzando dei proxy ed eseguendo del codice per simulare il comportamento dei browser, al fine di eseguire lo scraping di dati dinamici in modo efficace e rispettando le migliori pratiche di scraping. Se avete bisogno di informazioni per l'analisi o per creare insiemi di dati, questi metodi vi aiuteranno a superare le difficoltà incontrate sulla piattaforma YouTube.

Commenti:

0 Commenti