Comment récupérer les données vitales de YouTube avec Python

Commentaires: 0

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.

Comprendre la structure des données pour scraper Youtube avec Python

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.

Utiliser des proxy pour éviter d'être détecté lors de l'exploration de YouTube

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 :

  1. Les proxys résidentiels sont connectés à de véritables adresses IP et sont utilisés comme connexions authentiques pour les sites web. Les proxys sont la meilleure option pour récupérer les données de Youtube, où la confiance est nécessaire dans une large mesure pour ne pas se faire prendre. Ils permettent au scrapeur de se comporter comme un véritable utilisateur, ce qui réduit les risques d'être détecté comme un robot.
  2. Les serveurs mandataires des fournisseurs d'accès à Internet (FAI) se situent à mi-chemin entre les adresses IP résidentielles et les serveurs mandataires des centres de données. Ils sont fournis par les fournisseurs d'accès à Internet, qui émettent des adresses IP authentiques, qui sont notoirement difficiles à identifier comme proxies. Cette qualité rend les proxys ISP très efficaces lorsqu'il s'agit de récupérer des résultats de recherche sur Youtube, ce qui nécessite à la fois authenticité et performances exceptionnelles.
  3. Même si les centres de données offrent les vitesses les plus élevées, ils peuvent être facilement identifiés par des plateformes comme YouTube, car ils proviennent de grands centres de données. Le risque d'être bloqué pendant le scraping est élevé, même s'ils sont efficaces et faciles à utiliser. Ces types de serveurs conviennent mieux lorsque la nécessité d'un traitement rapide des données l'emporte sur les risques posés par la détection.
  4. Les proxys mobiles constituent la solution la plus légitime, car ils acheminent les connexions par l'intermédiaire d'appareils mobiles sur des réseaux cellulaires. Leur utilisation pour les tâches de scraping est la plus efficace car ils sont moins susceptibles d'être bloqués, étant donné que les IP mobiles font souvent l'objet d'une rotation par les fournisseurs de services, ce qui rend les proxys mobiles beaucoup moins susceptibles d'être signalés. Toutefois, il convient de noter que leur vitesse peut être nettement inférieure à celle des autres types de proxys.

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.

Création d'un scraper pour extraire des données de YouTube

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.

Étape 1 : Importation des bibliothèques et des paquets

À 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.

Étape 2 : Configuration de Selenium Chrome Driver

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)

Étape 3 : Comment récupérer des pages de vidéos Youtube

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.

Question de commentaire dynamique

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}")

Étape 4 : Écrire les données recueillies dans un fichier 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}")

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.

Code complet

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()

Résultats

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."
    }
  ]
}

Comment faire du scrape sur Youtube : Réflexions finales

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 Commentaires