it
English
Español
中國人
Tiếng Việt
Deutsch
Українська
Português
Français
भारतीय
Türkçe
한국인
Gaeilge
اردو
Indonesia
Polski 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.
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.
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:
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.
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.
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.
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)
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.
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}")
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.
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()
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."
}
]
}
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