import re from googleapiclient.discovery import build from googleapiclient.errors import HttpError from datetime import datetime # Votre clé API pour YouTube Data API api_key = 'ici votre clé API YouTube' # Remplacez par votre clé API # URL de votre vidéo YouTube ou YouTube Shorts url_video = 'https://youtube.com/shorts/WraeFTmQ-Sg?si=748QYhUIU0760x6V' # Remplacez par l'URL de votre choix # Extraction de l'ID de la vidéo à partir de l'URL, compatible avec les URLs de YouTube et YouTube Shorts match = re.search(r"((?<=[?&]v=)|(?<=/videos/)|(?<=/shorts/))([a-zA-Z0-9_-]+)", url_video) if not match: raise ValueError("L'URL de la vidéo ne semble pas valide.") video_id = match.group(2) # Modification ici pour capturer le bon groupe # Initialisation du client YouTube API youtube = build('youtube', 'v3', developerKey=api_key) def remove_emojis(text): emoji_pattern = re.compile("[" u"\U0001F600-\U0001F64F" # emoticons u"\U0001F300-\U0001F5FF" # symbols & pictographs u"\U0001F680-\U0001F6FF" # transport & map symbols u"\U0001F700-\U0001F77F" # alchemical symbols u"\U0001F780-\U0001F7FF" # Geometric Shapes Extended u"\U0001F800-\U0001F8FF" # Supplemental Arrows-C u"\U0001F900-\U0001F9FF" # Supplemental Symbols and Pictographs u"\U0001FA00-\U0001FA6F" # Chess Symbols u"\U0001FA70-\U0001FAFF" # Symbols and Pictographs Extended-A u"\U00002702-\U000027B0" # Dingbats u"\U000024C2-\U0001F251" "]+", flags=re.UNICODE) return emoji_pattern.sub(r'', text) # Supprime les emojis du texte def get_video_details(video_id): response = youtube.videos().list( part="snippet", id=video_id ).execute() if not response['items']: return None, None # Si aucune vidéo n'est trouvée video_details = response['items'][0]['snippet'] title = remove_emojis(video_details['title']) # Supprime les emojis du titre published_at = video_details['publishedAt'] return title, published_at def fetch_comments(video_id, max_results=100): # Fonction pour récupérer les commentaires de la vidéo comments = [] try: response = youtube.commentThreads().list( part="snippet", videoId=video_id, textFormat="plainText", maxResults=max_results, order="time" # Récupère également les réponses aux commentaires, triées par date ).execute() while response: for item in response['items']: # Récupérer le commentaire de niveau supérieur (niveau 1) comment = item['snippet']['topLevelComment']['snippet']['textDisplay'] comment = remove_emojis(comment).lower() # Nettoyer les emojis et passer en minuscules author = item['snippet']['topLevelComment']['snippet']['authorDisplayName'] author = author.replace("@", "") # Supprimer le symbole "@" devant le nom de l'utilisateur published_at = item['snippet']['topLevelComment']['snippet']['publishedAt'] published_date = datetime.strptime(published_at, '%Y-%m-%dT%H:%M:%SZ').date() comments.append(f'{author} - {published_date}\n{comment}\n\n') # Récupérer les réponses aux commentaires (niveau 2) # Décommentez les lignes suivantes pour récupérer également les réponses aux commentaires # reply_response = youtube.comments().list( # part="snippet", # parentId=item['id'], # ID du commentaire de niveau supérieur # textFormat="plainText" # ).execute() # Décommentez les lignes suivantes pour récupérer également les réponses aux commentaires # for reply_item in reply_response['items']: # reply_comment = reply_item['snippet']['textDisplay'] # reply_comment = remove_emojis(reply_comment).lower() # Nettoyer les emojis et passer en minuscules # reply_author = reply_item['snippet']['authorDisplayName'] # reply_author = reply_author.replace("@", "") # Supprimer le symbole "@" devant le nom de l'utilisateur # reply_published_at = reply_item['snippet']['publishedAt'] # reply_published_date = datetime.strptime(reply_published_at, '%Y-%m-%dT%H:%M:%SZ').date() # comments.append(f'Reply : {reply_author} - {reply_published_date}\n{reply_comment}\n\n') if 'nextPageToken' in response: response = youtube.commentThreads().list( part="snippet", videoId=video_id, pageToken=response['nextPageToken'], textFormat="plainText", maxResults=max_results ).execute() else: break except HttpError as e: print(f"An HTTP error {e.resp.status} occurred:\n{e.content}") return comments def get_channel_name(video_id): # Fonction pour récupérer le nom de la chaîne YouTube à partir de l'ID de la vidéo response = youtube.videos().list( part="snippet", id=video_id ).execute() if not response['items']: return None # Si aucune vidéo n'est trouvée, retourne None pour le nom de la chaîne channel_title = response['items'][0]['snippet']['channelTitle'] return channel_title def save_data_to_file(title, published_at, channel_name, comments, filename='youtube_comments.txt'): # Fonction pour sauvegarder les données dans un fichier texte with open(filename, 'w', encoding='utf-8') as file: published_date = datetime.strptime(published_at, '%Y-%m-%dT%H:%M:%SZ').date() file.write(f'Channel: {channel_name}\nTitle: {title.replace("Published at:", "").strip()} - {published_date.strftime("%d-%m-%Y")}\n\nComments:\n\n') for comment in comments: file.write(comment) # Récupère les détails de la vidéo title, published_at = get_video_details(video_id) channel_name = get_channel_name(video_id) # Vérifie si les détails de la vidéo sont disponibles if title is None or published_at is None or channel_name is None: print("Failed to fetch video details.") else: # Récupère les commentaires de la vidéo comments = fetch_comments(video_id) # Sauvegarde les données dans un fichier save_data_to_file(title, published_at, channel_name, comments) # Affiche un message de confirmation print(f'{len(comments)} Les commentaires sont sauvegardés dans le fichier youtube_comments.txt along with video details.')
En conclusion, bien que le script puisse nécessiter des ajustements pour une utilisation optimale avec IRaMuTeQ, il reste un outil précieux pour collecter des données à partir des commentaires YouTube.
Sa flexibilité permet de s’adapter aux besoins spécifiques de chaque projet de recherche en Sciences humaines.
[…] Première étape : l’extraction des commentaires depuis YouTube. Pour ceux qui s’intéressent aux aspects techniques de cette procédure, je vous invite à consulter mon article précédent où j’explore ce sujet en détail. […]
[…] de commentaires YouTube : Cet outil permet de récupérer les commentaires des vidéos YouTube pour les analyser dans un second […]