Come raschiare i dati vitali di YouTube con Python

Commenti: 0

I creatori di contenuti di YouTube devono analizzare l'andamento di ogni video, il che include sia l'analisi dei commenti che dei contenuti del creatore in relazione ad altri video della stessa categoria o di una categoria diversa.

Passare manualmente in rassegna tutti i video può essere faticoso e difficile. È in questo scenario che uno script speciale può rivelarsi utile. In questa guida vi mostreremo come effettuare lo scraping di YouTube e creare uno script di questo tipo che ha lo scopo di automatizzare il processo di raccolta dei dati che di solito viene effettuato manualmente.

Comprendere la struttura dei dati per scansionare Youtube con Python

Prima di capire come effettuare lo scraping di YouTube, è necessario comprenderne la struttura. Ha tantissime funzioni disponibili che offrono una serie infinita di tipi di dati tra cui scegliere, relativi alle attività degli utenti e alle statistiche dei video. Alcuni parametri chiave della piattaforma includono i titoli e le descrizioni dei video, i tag aggiunti, la quantità di visualizzazioni, i like e i commenti, nonché le informazioni sul canale e sulla playlist. Questi elementi sono importanti per i creatori e gli addetti al marketing dei contenuti per valutare le performance dei video e per studiare come formulare i contenuti video.

Con l'API dei dati di YouTube, gli sviluppatori possono accedere alla maggior parte delle metriche in modo programmatico. L'API consente anche di accedere al conteggio degli abbonati e ai video presenti sul canale, fornendo una buona quantità di dati per scopi di analisi e integrazione.

Tuttavia, potrebbero esserci alcuni elementi particolari impossibili da ottenere attraverso le API e quindi recuperabili solo tramite web scraping. Ad esempio, per ottenere alcune metriche dettagliate sull'impegno degli spettatori, come il sentiment dei loro commenti o l'ora specifica in cui si sono impegnati, sarebbe necessario effettuare uno scraping delle pagine di Youtube. Questa tecnica è di solito più complicata e può comportare dei rischi a causa della continua evoluzione della resa dei contenuti delle piattaforme e delle loro rigide normative sullo scraping dei dati.

Nei blocchi seguenti vi mostreremo come costruire uno script e come raschiare i dati da Youtube in Python in modo efficiente.

Usare i proxy per evitare il rilevamento durante lo scraping di YouTube

Per poter raschiare i video di Youtube con Python, l'uso dei proxy è essenziale per eludere i divieti IP e i metodi di prevenzione dell'attraversamento dei bot. Ecco alcuni tipi e le loro descrizioni:

  1. I proxy residenziali sono collegati a indirizzi IP reali e vengono utilizzati come connessioni autentiche per i siti web. Per lo scraping dei dati di Youtube, dove la fiducia è richiesta in larga misura per non essere scoperti, i proxy sono l'opzione migliore. Essi consentono allo scraper di comportarsi come un utente autentico, riducendo così al minimo le possibilità di essere individuato come bot.
  2. I proxy ISP rappresentano la via di mezzo tra gli IP residenziali e i proxy dei centri dati. Sono forniti dai provider di servizi Internet, che emettono indirizzi IP autentici, notoriamente difficili da segnalare come proxy. Questa qualità rende i proxy ISP molto efficaci nei casi in cui è necessario effettuare lo scraping dei risultati di ricerca di Youtube, che richiedono sia l'autenticità che prestazioni eccezionali.
  3. Anche se i Datacenter vantano le velocità più elevate, possono essere facilmente identificati da piattaforme come YouTube perché provengono da grandi centri dati. Il rischio di essere bloccati durante lo scraping è elevato, anche se sono efficienti e facili da usare. Questi tipi sono i migliori quando l'esigenza di una rapida elaborazione dei dati supera i rischi legati al rilevamento.
  4. I proxy mobili forniscono la soluzione più legittima grazie all'instradamento delle connessioni attraverso dispositivi mobili su reti cellulari. Il loro utilizzo per le attività di scraping è il più efficace in quanto è meno probabile che vengano bloccati, in quanto gli IP mobili vengono spesso ruotati dai provider di servizi, rendendo i proxy mobili molto meno probabili di essere segnalati. Tuttavia, è necessario notare che la loro velocità potrebbe essere molto inferiore rispetto ad altri tipi.

Utilizzando strategicamente questi tipi, è possibile effettuare lo scraping di dati da Youtube senza essere individuati, consentendo l'accesso continuo ai dati nel rispetto dei Termini di servizio della piattaforma. Inoltre, comprenderli correttamente vi aiuterà molto quando avrete bisogno di trovare una proxy per lo scraping.

Creare uno scraper per estrarre dati da YouTube

Cominciamo con la creazione di uno script per lo scraping di Youtube; ci sono alcuni pacchetti che devono essere installati. Per prima cosa installeremo Selenium-wire, che è un'estensione proxy di Selenium e contiene alcune classi e moduli chiave. Per installare questi pacchetti, utilizzare la seguente stringa di comando nella propria interfaccia di comando:


pip install selenium-wire selenium blinker==1.7.0

Passiamo ora ad analizzare le importazioni.

Passo 1: Importare librerie e pacchetti

A questo punto, è necessario caricare le librerie e i pacchetti mirati agli elementi web per i quali sono stati scritti gli script. Inoltre, occorre includere i moduli per l'elaborazione dei dati e la gestione del tempo di esecuzione, per garantire un'esecuzione efficiente dello script.


from selenium.webdriver.chrome.options import Options
from seleniumwire import webdriver as wiredriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
import json
import time

Il modulo json aiuta a convertire i dati di scraping in dati JSON correttamente formattati per una migliore presentazione e a mascherare il nostro indirizzo IP. Tuttavia, il modulo time viene utilizzato per offuscare le azioni e introdurre la casualità nel caso in cui venga rilevato un comportamento troppo prevedibile.

Inoltre, aiuta anche ad assicurarsi che gli elementi necessari da estrarre dai dati siano già presenti nella pagina. Il resto delle importazioni è costituito dalle classi o dai sottomoduli necessari, che svolgono diverse funzioni che saranno discusse in seguito in altre parti del codice.

Passo 2: Impostazione del driver di Selenium Chrome

Quando un'istanza di Selenium viene attivata da uno script scritto in Python, lo script da solo utilizzerà il nostro IP per qualsiasi operazione gli venga richiesta. Questo può essere molto problematico per alcuni siti come YouTube, che effettuano lo scraping delle informazioni dal loro sito. È consigliabile esaminare il file robots del sito per comprenderlo meglio. Di conseguenza, potreste subire le conseguenze di un divieto temporaneo del vostro IP quando cercate di scrappare i canali di Youtube, ad esempio.

Per mitigare tutte queste sfide, dobbiamo fare diverse cose. Innanzitutto, dobbiamo memorizzare i dettagli del proxy che utilizzeremo come base di tre variabili. Poi definiamo una variabile di opzioni, chrome_options, che sarà passata all'istanza selenium.Chrome() per informare quale proxy deve essere usato durante lo scraping. Le informazioni sul proxy vengono impostate passando gli argomenti richiesti in chrome_options. Ecco come eseguire lo scraping di Youtube con lo script proxy:


# Specificare l'indirizzo del server proxy con nome utente e password
proxy_address = ""
proxy_username = ""
proxy_password = ""
# Impostare le opzioni di Chrome con il proxy e l'autenticazione
chrome_options = Options()
chrome_options.add_argument(f'--proxy-server={proxy_address}')
chrome_options.add_argument(f'--proxy-auth={proxy_username}:{proxy_password}')
# Creare un'istanza di WebDriver con selenium-wire
driver = wiredriver.Chrome(options=chrome_options)

Passo 3: Come raschiare le pagine dei video di Youtube

Impostare una variabile chiamata "youtube_url_to_scrape" per mantenere l'indirizzo della homepage di YouTube. Questa variabile è usata nel metodo "driver.get()" di Selenium, in modo che sappia a quale pagina web specifica andare per lo scraping. Questa azione causerà l'apertura di una nuova finestra di Chrome quando lo script viene eseguito.


youtube_url_to_scrape = ""
# Eseguire l'automazione Selenium con le funzionalità avanzate di selenium-wire
driver.get(youtube_url_to_scrape)

Di seguito, descriviamo la funzione "extract _information()", che esegue l'estrazione di informazioni dalla pagina in base al suo nome.

Ci siamo assicurati che tutti gli elementi della pagina siano caricati. Ciò avviene utilizzando l'API WebDriver insieme a WebDriverWait per sospendere lo script fino a quando l'elemento rappresentato dal pulsante "more" di esempio è disponibile e cliccato. Quando lo è, Selenium esegue un clic JavaScript per la descrizione completa del video.

Problema dei commenti dinamici

Per rimediare, stiamo implementando una soluzione per eliminare qualsiasi problema correlato. Utilizzando la classe Actions e il modulo Time, scorriamo verso il basso due volte ogni 10 secondi, assicurandoci di raschiare il maggior numero possibile di commenti di YouTube. Questo assicura che non ci siano problemi legati ai contenuti caricati dinamicamente.


def extract_information() -> dict:
   try:
       element = WebDriverWait(driver, 15).until(
           EC.presence_of_element_located((By.XPATH, '//*[@id="expand"]'))
       )

       element.click()

       time.sleep(10)
       actions = ActionChains(driver)
       actions.send_keys(Keys.END).perform()
       time.sleep(10)
       actions.send_keys(Keys.END).perform()
       time.sleep(10)

Con Selenium WebDriver, esistono diversi modi per cercare gli elementi. Si può cercare per ID, per CLASS_NAME, per XPATH, tra gli altri. Per questo tutorial su come raschiare i dati da Youtube in Python, li combineremo tra loro e non con un solo metodo.

XPATH è un sistema più complesso per trovare le variabili da raschiare, perché sembra più orientato ai modelli. È considerato il più difficile, ma non quando si tratta di Chrome, almeno.

Quando si esamina il codice, è sufficiente fare clic e selezionare l'opzione copia XPATH, che può essere eseguita facendo clic con il pulsante destro del mouse nella parte di ispezione di Chrome. Dopo aver acquisito l'XPATH, si può facilmente utilizzare il metodo 'find_elements' per cercare tutti i componenti che contengono i dettagli pertinenti, come il titolo del video, la descrizione, ecc.

È importante ricordare che alcune caratteristiche della pagina web potrebbero avere proprietà duplicate ed è per questo che utilizzando la tecnica di base "find_elements()" si otterrà un elenco invece di una stringa. In questo scenario, è necessario controllare l'elenco e identificare quale indice contiene le informazioni richieste e quale testo deve essere recuperato.

Infine, viene restituita una variabile di dizionario denominata "data", che racchiude tutte le informazioni raccolte durante lo scraping, ergo, un elemento essenziale per la sezione successiva.


    video_title = driver.find_elements(By.XPATH, '//*[@id="title"]/h1')[0].text

   owner = driver.find_elements(By.XPATH, '//*[@id="text"]/a')[0].text

   total_number_of_subscribers = \
       driver.find_elements(By.XPATH, "//div[@id='upload-info']//yt-formatted-string[@id='owner-sub-count']")[
           0].text

   video_description = driver.find_elements(By.XPATH,                                  '//*[@id="description-inline-expander"]/yt-attributed-string/span/span')
   result = []
   for i in video_description:
       result.append(i.text)
   description = ''.join(result)

   publish_date = driver.find_elements(By.XPATH, '//*[@id="info"]/span')[2].text
   total_views = driver.find_elements(By.XPATH, '//*[@id="info"]/span')[0].text

   number_of_likes = driver.find_elements(By.XPATH,                                   '//*[@id="top-level-buttons-computed"]/segmented-like-dislike-button-view-model/yt-smartimation/div/div/like-button-view-model/toggle-button-view-model/button-view-model/button/div')[
       1].text

   comment_names = driver.find_elements(By.XPATH, '//*[@id="author-text"]/span')
   comment_content = driver.find_elements(By.XPATH, '//*[@id="content-text"]/span')
   comment_library = []

   for each in range(len(comment_names)):
       name = comment_names[each].text
       content = comment_content[each].text
       indie_comment = {
           'name': name,
           'comment': content
       }
       comment_library.append(indie_comment)

   data = {
       'owner': owner,
       'subscribers': total_number_of_subscribers,
       'video_title': video_title,
       'description': description,
       'date': publish_date,
       'views': total_views,
       'likes': number_of_likes,
       'comments': comment_library
   }

   return data

except Exception as err:
   print(f"Error: {err}")

Passo 4: scrivere i dati raccolti in un file JSON


def organize_write_data(data:dict):
    output = json.dumps(data, indent=2, ensure_ascii=False).encode("ascii", "ignore").decode("utf-8")
    try:
        with open("output.json", 'w', encoding='utf-8') as file:
            file.write(output)
    except Exception as err:
        print(f"Error encountered: {err}")

Una funzione definita dall'utente, denominata "organize_write_data", è progettata per accettare i "dati" in uscita dall'operazione precedente. Il suo compito principale è quello di strutturare i dati nel formato JSON e scriverli in un file chiamato output.json, assicurandosi che vengano seguite le procedure corrette durante la fase di scrittura sul file.

Codice completo

Ora abbiamo capito come effettuare lo scraping di Youtube in modo corretto. Ecco il codice completo del nostro programma di scraping:


from selenium.webdriver.chrome.options import Options
from seleniumwire import webdriver as wiredriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
import json
import time

# Specificare l'indirizzo del server proxy con nome utente e password
proxy_address = ""
proxy_username = ""
proxy_password = ""

# Impostare le opzioni di Chrome con il proxy e l'autenticazione
chrome_options = Options()
chrome_options.add_argument(f'--proxy-server={proxy_address}')
chrome_options.add_argument(f'--proxy-auth={proxy_username}:{proxy_password}')

# Creare un'istanza di WebDriver con selenium-wire
driver = wiredriver.Chrome(options=chrome_options)

youtube_url_to_scrape = ""

# Eseguire l'automazione Selenium con le funzionalità avanzate di selenium-wire
driver.get(youtube_url_to_scrape)


def extract_information() -> dict:
   try:
       element = WebDriverWait(driver, 15).until(
           EC.presence_of_element_located((By.XPATH, '//*[@id="expand"]'))
       )
       element.click()

       time.sleep(10)
       actions = ActionChains(driver)
       actions.send_keys(Keys.END).perform()
       time.sleep(10)
       actions.send_keys(Keys.END).perform()
       time.sleep(10)

       video_title = driver.find_elements(By.XPATH, '//*[@id="title"]/h1')[0].text

       owner = driver.find_elements(By.XPATH, '//*[@id="text"]/a')[0].text
       total_number_of_subscribers = \
           driver.find_elements(By.XPATH, "//div[@id='upload-info']//yt-formatted-string[@id='owner-sub-count']")[
               0].text

       video_description = driver.find_elements(By.XPATH,
                                                '//*[@id="description-inline-expander"]/yt-attributed-string/span/span')
       result = []
       for i in video_description:
           result.append(i.text)
       description = ''.join(result)

       publish_date = driver.find_elements(By.XPATH, '//*[@id="info"]/span')[2].text
       total_views = driver.find_elements(By.XPATH, '//*[@id="info"]/span')[0].text

       number_of_likes = driver.find_elements(By.XPATH,
                                              '//*[@id="top-level-buttons-computed"]/segmented-like-dislike-button-view-model/yt-smartimation/div/div/like-button-view-model/toggle-button-view-model/button-view-model/button/div')[
           1].text

       comment_names = driver.find_elements(By.XPATH, '//*[@id="author-text"]/span')
       comment_content = driver.find_elements(By.XPATH,
                                              '//*[@id="content-text"]/span')
       comment_library = []

       for each in range(len(comment_names)):
           name = comment_names[each].text
           content = comment_content[each].text
           indie_comment = {
               'name': name,
               'comment': content
           }
           comment_library.append(indie_comment)

       data = {
           'owner': owner,
           'subscribers': total_number_of_subscribers,
           'video_title': video_title,
           'description': description,
           'date': publish_date,
           'views': total_views,
           'likes': number_of_likes,
           'comments': comment_library
       }

       return data

   except Exception as err:
       print(f"Error: {err}")


# Registrare i dati in JSON
def organize_write_data(data: dict):
   output = json.dumps(data, indent=2, ensure_ascii=False).encode("ascii", "ignore").decode("utf-8")
   try:
       with open("output.json", 'w', encoding='utf-8') as file:
           file.write(output)
   except Exception as err:
       print(f"Error encountered: {err}")


organize_write_data(extract_information())
driver.quit()

Risultati

Ora sappiamo anche come raschiare i commenti di Youtube con Python. L'output appare come questo:


{
  "owner": "Suzie Taylor",
  "subscribers": "165K subscribers",
  "video_title": "I Spent $185,000 From MrBeast",
  "description": "@MrBeast blessed me with $185,000, after SURVIVING 100 DAYS trapped with a STRANGER. Now I want to bless you!\nGive This A Like if you Enjoyed :))\n-\nTo Enter The Giveaway: \nFollow me on Instagram: https://www.instagram.com/sooztaylor/...\nSubscribe to me on Youtube: \n   / @suzietaylor  \nI am picking winners for the giveaway ONE WEEK from today (December 23rd) \n-\nThank you everyone for all of your love already. This is my dream!",
  "date": "Dec 16, 2023",
  "views": "4,605,785 ",
  "likes": "230K",
  "comments": [
    {
      "name": "",
      "comment": "The right person got the money "
    },
    {
      "name": "@Scottster",
      "comment": "Way to go Suzie, a worthy winner! Always the thought that counts and you put a lot into it!"
    },
    {
      "name": "@cidsx",
      "comment": "I'm so glad that she's paying it forward! She 100% deserved the reward"
    },
    {
      "name": "@Basicskill720",
      "comment": "This is amazing Suzie. Way to spread kindness in this dark world. It is much needed !"
    },
    {
      "name": "@eliasnull",
      "comment": "You are such a blessing Suzie! The world needs more people like you."
    },
    {
      "name": "@iceline22",
      "comment": "That's so awesome you're paying it forward! You seem so genuine, and happy to pass along your good fortune! Amazing! Keep it up!"
    },
    {
      "name": "",
      "comment": "Always nice to see a Mr. Beast winner turn around and doing nice things for others. I know this was but a small portion of what you won and nobody expects you to not take care of yourself with that money, but to give back even in small ways can mean so much. Thank you for doing this."
    }
  ]
}

Come raschiare Youtube: Pensieri finali

La capacità di sfruttare le informazioni del database di YouTube è incredibilmente preziosa quando si utilizzano script di automazione o proxy che aiutano a rispettare le regole della piattaforma. L'approccio principale su come raschiare Youtube descritto sopra sarà utile per raccogliere dati in modo responsabile, evitando di essere bannati o limitati dalla piattaforma.

Commenti:

0 Commenti