fr
English
Español
中國人
Tiếng Việt
Deutsch
Українська
Português
भारतीय
Türkçe
한국인
Italiano
Gaeilge
اردو
Indonesia
Polski Les créateurs de contenu sur YouTube doivent analyser les performances de chaque vidéo, ce qui inclut l'analyse des commentaires et du contenu du créateur par rapport aux autres vidéos de la même catégorie ou d'une catégorie différente.
Parcourir toutes les vidéos manuellement peut s'avérer épuisant et difficile. C'est dans ce cas de figure qu'un script spécial peut s'avérer utile. Dans ce guide, nous allons vous montrer comment gratter YouTube et créer un tel script qui vise à automatiser le processus de collecte de données qui est généralement effectué manuellement.
Avant de savoir comment récupérer les données de YouTube, il faut comprendre sa structure. Il dispose d'un très grand nombre de fonctionnalités qui offrent un choix infini de types de données relatives aux activités des utilisateurs et aux statistiques des vidéos. Parmi les paramètres clés de la plateforme figurent les titres et descriptions des vidéos, les balises ajoutées, le nombre de vues, de likes et de commentaires, ainsi que les informations relatives à la chaîne et à la liste de lecture. Ces éléments sont importants pour les spécialistes du marketing de contenu et les créateurs, car ils leur permettent d'évaluer les performances des vidéos et d'élaborer des stratégies de formulation du contenu vidéo.
Grâce à l'API de données YouTube, les développeurs peuvent accéder à la plupart des indicateurs de manière programmatique. L'API permet également d'accéder au nombre d'abonnés ainsi qu'aux vidéos de la chaîne, ce qui fournit une bonne quantité de données à des fins d'analyse et d'intégration.
Cependant, certains éléments particuliers sont impossibles à obtenir par l'intermédiaire de l'API et ne peuvent donc être récupérés qu'au moyen d'un "web scraping". Par exemple, pour obtenir une mesure détaillée de l'engagement des spectateurs, telle que le sentiment de leurs commentaires ou l'heure précise à laquelle ils se sont engagés, il faudrait recourir à des méthodes de "web scraping" des pages de Youtube. Cette technique est généralement plus compliquée et peut présenter des risques en raison de l'évolution constante du contenu des plateformes et de leurs réglementations strictes en matière de récupération de données.
Dans les blocs suivants, nous allons vous montrer comment construire un script et comment récupérer des données de Youtube en Python de manière efficace.
Afin de récupérer des vidéos Youtube avec Python, l'utilisation de proxies est essentielle pour éviter les bannissements d'IP et les méthodes de prévention de traversée des bots. Voici quelques types de proxies et leur description :
En utilisant ces types de manière stratégique, il est possible de récupérer des données de Youtube sans être détecté, ce qui permet un accès continu aux données tout en respectant les conditions d'utilisation de la plateforme. De plus, les comprendre correctement vous aidera beaucoup lorsque vous aurez besoin de trouver un proxy pour le scraping.
Commençons par la création du script pour scraper Youtube, il y a quelques paquets qui doivent être installés. Nous allons d'abord installer Selenium-wire qui est une extension proxy de Selenium et qui possède quelques classes et modules clés. Utilisez la chaîne de commande suivante dans votre interface de commande pour installer ces paquets :
pip install selenium-wire selenium blinker==1.7.0
Intéressons-nous maintenant aux importations.
À ce stade, nous devons charger les bibliothèques et les paquets destinés aux éléments web pour lesquels les scripts ont été écrits. En outre, nous devons inclure des modules pour le traitement des données et la gestion du temps d'exécution afin de garantir une exécution efficace du 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
Le module json permet de convertir les données récupérées en données JSON correctement formatées pour une meilleure présentation et de masquer notre adresse IP. Cependant, le module time est utilisé pour obscurcir les actions et introduire de l'aléatoire au cas où un comportement trop prévisible serait détecté.
En outre, cela permet de s'assurer que les éléments nécessaires à l'extraction des données se trouvent déjà sur la page. Le reste des importations sont les classes ou les sous-modules nécessaires qui font différentes choses qui seront discutées plus tard dans d'autres parties du code.
Lorsqu'une instance Selenium est déclenchée à partir d'un script écrit en Python, le script utilise lui-même notre IP pour toutes les tâches qu'il doit effectuer. Cela peut s'avérer très problématique pour certains sites comme YouTube, qui récupèrent des informations sur leur site. Il est conseillé d'examiner le fichier robots du site web pour mieux le comprendre. En conséquence, vous pourriez subir les conséquences d'une interdiction temporaire de votre IP lorsque vous essayez de récupérer des chaînes de Youtube, par exemple.
Afin d'atténuer tous ces défis, il y a plusieurs choses à faire. Tout d'abord, nous devons stocker les détails du proxy que nous allons utiliser comme base de trois variables. Ensuite, nous définissons une variable d'options, chrome_options, qui sera transmise à l'instance selenium.Chrome() pour indiquer quel proxy doit être utilisé lors du scraping. L'information sur le proxy est définie en passant les arguments requis dans chrome_options. Voici comment scraper Youtube avec le script proxies :
# Spécifier l'adresse du serveur proxy avec le nom d'utilisateur et le mot de passe
proxy_address = ""
proxy_username = ""
proxy_password = ""
# Configurer les options de Chrome avec le proxy et l'authentification
chrome_options = Options()
chrome_options.add_argument(f'--proxy-server={proxy_address}')
chrome_options.add_argument(f'--proxy-auth={proxy_username}:{proxy_password}')
# Créer une instance de WebDriver avec selenium-wire
driver = wiredriver.Chrome(options=chrome_options)
Créez une variable appelée "youtube_url_to_scrape" pour conserver l'adresse de la page d'accueil de YouTube. Cette variable est utilisée dans la méthode "driver.get()" de Selenium, afin qu'il sache à quelle page web spécifique se rendre à des fins de scraping. Cette action entraînera l'ouverture d'une nouvelle fenêtre Chrome lors de l'exécution du script.
youtube_url_to_scrape = ""
# Réalisez vos automatisations Selenium avec les capacités améliorées de selenium-wire
driver.get(youtube_url_to_scrape)
Nous décrivons ensuite la fonction "extract _information()", qui permet d'extraire des informations de la page en fonction de son nom.
Nous nous sommes assurés que tous les éléments de la page sont chargés. Pour ce faire, nous avons utilisé l'API WebDriver et WebDriverWait pour suspendre le script jusqu'à ce que l'élément représenté par le bouton "more" de l'échantillon soit disponible et cliqué. Lorsque c'est le cas, Selenium effectue un clic JavaScript pour obtenir la description complète de la vidéo.
Pour y remédier, nous mettons en œuvre une solution pour éliminer tout problème connexe. À l'aide de la classe Actions et du module Time, nous faisons défiler la page deux fois toutes les 10 secondes, en veillant à récupérer le plus grand nombre possible de commentaires YouTube. Cela permet de s'assurer qu'il n'y a pas de problèmes liés à un contenu chargé dynamiquement.
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)
Avec Selenium WebDriver, il existe plusieurs façons de rechercher des éléments. On peut chercher par ID, par CLASS_NAME, par XPATH, entre autres. Pour ce tutoriel, comment récupérer des données de Youtube en Python, nous allons les combiner et ne pas nous contenter d'une seule méthode.
XPATH est un système plus complexe de recherche de variables à gratter, car il semble davantage axé sur les modèles. Il est considéré comme le plus difficile, mais pas lorsqu'il s'agit de Chrome.
Lorsque l'on examine le code, il suffit de cliquer sur l'option copier XPATH et de la sélectionner, ce qui peut être fait en cliquant avec le bouton droit de la souris sur le code dans la partie inspection de Chrome. Après avoir acquis XPATH, la méthode "find_elements" peut facilement être utilisée pour rechercher tous les composants qui contiennent les détails pertinents tels que le titre de la vidéo, la description, etc.
Il est important de mentionner que certains éléments de la page web peuvent avoir des propriétés dupliquées et c'est pourquoi l'utilisation de la technique de base "find_elements()" vous donnera une liste au lieu d'une chaîne. Dans ce scénario, vous devez vérifier la liste et identifier l'index qui contient les informations requises et le texte qui doit être extrait.
En conclusion, une variable de dictionnaire nommée "data" est renvoyée, encapsulant toutes les informations recueillies lors du scraping, et donc essentielle pour la section suivante.
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}")
Une fonction définie par l'utilisateur et nommée "organize_write_data" est conçue pour accepter les "données" issues de l'opération précédente. Son travail principal consiste à structurer les données au format JSON et à les écrire dans un fichier appelé output.json, tout en s'assurant que les procédures correctes sont suivies lors de l'étape d'écriture dans le fichier.
Maintenant, nous comprenons comment scraper Youtube correctement. Jusqu'à présent, voici le code complet de notre programme de 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
# Spécifier l'adresse du serveur proxy avec le nom d'utilisateur et le mot de passe
proxy_address = ""
proxy_username = ""
proxy_password = ""
# Configurer les options de Chrome avec le proxy et l'authentification
chrome_options = Options()
chrome_options.add_argument(f'--proxy-server={proxy_address}')
chrome_options.add_argument(f'--proxy-auth={proxy_username}:{proxy_password}')
# Créer une instance de WebDriver avec selenium-wire
driver = wiredriver.Chrome(options=chrome_options)
youtube_url_to_scrape = ""
# Réalisez vos automatisations Selenium avec les capacités améliorées de 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}")
# Enregistrer les données en 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()
Nous savons également comment récupérer les commentaires de Youtube avec Python maintenant. Le résultat ressemble à ceci :
{
"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 possibilité d'exploiter les informations de la base de données de YouTube est extrêmement précieuse lors de l'utilisation de scripts d'automatisation ou de proxy qui aident à rester en conformité avec les règles de la plateforme. L'approche principale sur la façon de gratter Youtube que nous avons décrite ci-dessus sera utile pour la récolte responsable de données tout en évitant d'être banni ou limité par la plateforme.
Commentaires: 0