[tubeR] Collecter des données sur Youtube
Références
CRAN: https://cran.r-project.org/web/packages/tuber/index.html
Tuto API tuber: https://www.storybench.org/how-to-download-youtube-data-in-r-using-tuber-and-purrr/
Tuto tuber: https://cran.r-project.org/web/packages/tuber/vignettes/tuber-ex.html
Limits: https://www.freakyjolly.com/youtube-data-api-v3-1m-units-limits-explained/
Introduction
La librairie TubeR permet de collecter les données de Youtube, mais demande au préalable d’avoir un compte sur google et d’activer l’API. Pour plus d’information, regardez le lien sur l’API.
Librairie
library(tuber)
La librairie possède 39 fonctions, mais nous allons nous concentrer sur les 6 suivantes:
Fonction | Utilité |
---|---|
yt_oauth() | Connecter R au compte youtube |
yt_search() | Outil principal de recherche de vidéos, chaînes et playlists |
list_channel_videos() | Liste les vidéos d’une chaîne |
get_channel_stats() | Liste des statistiques d’une chaîne |
get_stats() | Stats d’une vidéo |
get_all_comments() | Obtenir les commentaires d’une vidéo |
ls("package:tuber")
## [1] "delete_captions" "delete_channel_sections"
## [3] "delete_comments" "delete_playlist_items"
## [5] "delete_playlists" "delete_videos"
## [7] "get_all_channel_video_stats" "get_all_comments"
## [9] "get_captions" "get_channel_stats"
## [11] "get_comment_threads" "get_comments"
## [13] "get_playlist_items" "get_playlists"
## [15] "get_related_videos" "get_stats"
## [17] "get_subscriptions" "get_video_details"
## [19] "list_abuse_report_reasons" "list_caption_tracks"
## [21] "list_channel_activities" "list_channel_resources"
## [23] "list_channel_sections" "list_channel_videos"
## [25] "list_guidecats" "list_langs"
## [27] "list_my_channel" "list_my_videos"
## [29] "list_regions" "list_videocats"
## [31] "list_videos" "read_sbv"
## [33] "upload_caption" "upload_video"
## [35] "yt_authorized" "yt_oauth"
## [37] "yt_search" "yt_token"
## [39] "yt_topic_search"
Se connecter
Pour se connecter depuis R sur votre application youtube, vous devez utiliser l’id client de votre API et le code secret créés préalablement avec l’application faites sur l’API. [Pour plus d’informations, regarder le tuto sur l’API]:
Note: Ces informations doivent rester confidentielles, voilà pourquoi l’exemple est censuré.
client_id <- "XXXXXXXXX"
client_secret <- "XXXXXXXXX"
Ensuite, nous pouvons lancer la connexion:
yt_oauth(app_id = client_id,
app_secret = client_secret,
token = '')
Il faut suivre manuellement les étapes qui s’affichent à l’écran et aller jusqu’au bout. Il est possible que des messages demandant si vous êtes sûre de poursuivre la connexion apparaissent et c’est complètement normal. C’est parce que l’application vous permet de gérer votre compte aussi (donc faire des actions avec), donc youtube souhaites être sûre que vous savez que votre compte sera contrôlé depuis l’extérieur (par vous uniquement). [Pour plus d’informations, regarder le tuto sur l’API]
Note sur les comptes et les vidéos
Les principales informations que nous allons utiliser pour rechercher des données se trouvent dans les urls. Voici l’exemple du lien d’un compte:
https://www.youtube.com/channel/UCINb0wqPz-A0dV9nARjJlOQ
L’id d’une chaîne se trouve après le dernier “/”, dans notre cas l’id de la chaîne est “UCINb0wqPz-A0dV9nARjJlOQ”.
Le lien d’une playlist:
https://www.youtube.com/playlist?list=PLLoPYaJqlcK5xkoTBELtXQzNX94JuWAmJ
L’id de la playlist se trouve après se trouve après le signe “=”, donc l’id de notre playlist est “PLLoPYaJqlcK5xkoTBELtXQzNX94JuWAmJ”
Et le lien d’une vidéo:
https://www.youtube.com/watch?v=DggHeuhpFvg
Ici, l’id des vidéos se trouve après le signe “=”, donc l’id de cette vidéo est “DggHeuhpFvg”.
Les fonctions
yt_search()
Permet de chercher des informations sur youtube de manière efficace. Elle permet de chercher cherche des vidéos, des chaînes ou des playlistes et de préciser les termes recherchés, le nombre de résultat, une chaîne particulière, de préciser si on cherche un show, l’évènement (complet, en live ou à venir), la localisation (en longitude et latitude ainsi que le périmètre), la date de publication, la qualité de la vidéo, si la vidéo possède des sous-titres, etc. Pour plus d’information, il faut utiliser la fonction help() ou le “?” avec le nom de la fonction. Nous allons par exemple chercher toutes les vidéos avec le mots “beaver” depuis le mois de juin 2021:
Note 1: Dans notre cas, il n’est pas nécessaire de préciser “vidéo” dans le type, parce que la fonction recherche automatiquement les vidéos si aucune information n’est donnée dans type. Le type peut être remplacé par “channel” ou “playlist”.
Note 2: Le nombre d’éléments collectés est limité à 50 de base. Mais nous pouvons changer ce nombre en changeant le paramètre “max-results”. Par exemple “max-results = 50”.
youtube_1 <- yt_search(term = "beaver",
type = "video",
published_after = "2021-06-01T00:00:00Z")
dplyr::glimpse(youtube_1)
## Rows: 529
## Columns: 17
## $ video_id <chr> "y5tgr9-_vo4", "IYYUNxH6Yg8", "ieClBuOf8g4",~
## $ publishedAt <chr> "2021-06-16T22:53:22Z", "2021-06-15T22:45:00~
## $ channelId <chr> "UCP-iaFrmWcOG0o461wMicdg", "UCP-iaFrmWcOG0o~
## $ title <chr> "*SPOILERS* IS THIS WHAT HAPPENS TO REXY?!?!~
## $ description <chr> "Some news has broken concerning the latest ~
## $ thumbnails.default.url <chr> "https://i.ytimg.com/vi/y5tgr9-_vo4/default.~
## $ thumbnails.default.width <chr> "120", "120", "120", "120", "120", "120", "1~
## $ thumbnails.default.height <chr> "90", "90", "90", "90", "90", "90", "90", "9~
## $ thumbnails.medium.url <chr> "https://i.ytimg.com/vi/y5tgr9-_vo4/mqdefaul~
## $ thumbnails.medium.width <chr> "320", "320", "320", "320", "320", "320", "3~
## $ thumbnails.medium.height <chr> "180", "180", "180", "180", "180", "180", "1~
## $ thumbnails.high.url <chr> "https://i.ytimg.com/vi/y5tgr9-_vo4/hqdefaul~
## $ thumbnails.high.width <chr> "480", "480", "480", "480", "480", "480", "4~
## $ thumbnails.high.height <chr> "360", "360", "360", "360", "360", "360", "3~
## $ channelTitle <chr> "TheGamingBeaver", "TheGamingBeaver", "TheGa~
## $ liveBroadcastContent <chr> "none", "none", "none", "none", "none", "non~
## $ publishTime <chr> "2021-06-16T22:53:22Z", "2021-06-15T22:45:00~
Lorsqu’on précise un terme, il est recherché à la fois dans le titre de la chaîne, le titre de la vidéo et le titre de la description. Il est préférable de chercher des vidéos (pas forcément besoin de préciser le type) pour avoir plus d’informations.
Cette fonction est utile pour commencer une recherche, même s’il est possible de rechercher manuellement des liens.
Une recherche similaire peut être menée en utilisant la fonction yt_topic_search() qui permet en plus d’ajouter une thématique avec le paramètre “topic”.
get_channel_stats()
Pour obtenir les statistiques d’une chaîne (titre de la chaîne, nombre de vue, nombre d’abonnés et nombre de vidéos) sous forme d’une liste il suffit d’utiliser la fonction get_channel_stats():
youtube_2 <- get_channel_stats(channel_id = "UCINb0wqPz-A0dV9nARjJlOQ")
dplyr::glimpse(youtube_2)
## List of 5
## $ kind : chr "youtube#channel"
## $ etag : chr "SOuvyWXlGv2IG_seFhesbGmLUXo"
## $ id : chr "UCBV194XNr6CIQCCuw1v2rMQ"
## $ snippet :List of 7
## ..$ title : chr "dataslice"
## ..$ description: chr "High quality tutorials related to all things data"
## ..$ customUrl : chr "dataslice"
## ..$ publishedAt: chr "2020-05-05T05:07:53.938698Z"
## ..$ thumbnails :List of 3
## .. ..$ default:List of 3
## .. ..$ medium :List of 3
## .. ..$ high :List of 3
## ..$ localized :List of 2
## .. ..$ title : chr "dataslice"
## .. ..$ description: chr "High quality tutorials related to all things data"
## ..$ country : chr "US"
## $ statistics:List of 4
## ..$ viewCount : chr "165729"
## ..$ subscriberCount : chr "4100"
## ..$ hiddenSubscriberCount: logi FALSE
## ..$ videoCount : chr "20"
list_channel_videos()
Permet d’afficher la liste des vidéos d’une chaîne:
youtube_3 <- list_channel_videos(channel_id = "UCc8Virf32yXPVNO68bU6AuA")
dplyr::glimpse(youtube_3)
## Rows: 19
## Columns: 5
## $ kind <chr> "youtube#playlistItem", "youtube#playl~
## $ etag <chr> "cavdEpSxgdy-TnjMajW_wMwc-wA", "0YCtPs~
## $ id <chr> "VVVjOFZpcmYzMnlYUFZOTzY4YlU2QXVBLkRfU~
## $ contentDetails.videoId <chr> "D_P5OcF0xp0", "krV_S5hMqVk", "4kLHdzq~
## $ contentDetails.videoPublishedAt <chr> "2020-03-26T03:29:06Z", "2019-09-16T14~
get_stats()
Permet d’obtenir les statistiques d’une vidéo (titre, nombre de like, nombre de dislike, nombre de vue, nombre de commentaires):
youtube_4 <- get_stats(video_id = "Q5yVoTqD06M")
dplyr::glimpse(youtube_4)
## List of 6
## $ id : chr "Q5yVoTqD06M"
## $ viewCount : chr "31170"
## $ likeCount : chr "747"
## $ dislikeCount : chr "13"
## $ favoriteCount: chr "0"
## $ commentCount : chr "96"
get_all_comments()
Permet d’obtenir tous les commentaires d’une vidéo:
youtube_5 <- get_all_comments(video_id = "Q5yVoTqD06M")
dplyr::glimpse(youtube_5)
## Rows: 93
## Columns: 15
## $ videoId <chr> "Q5yVoTqD06M", "Q5yVoTqD06M", "Q5yVoTqD06M", "Q5~
## $ textDisplay <chr> "Watch Part 2 here! <a href=\"https://youtu.be/4~
## $ textOriginal <chr> "Watch Part 2 here! https://youtu.be/4A12xqQPJXU~
## $ authorDisplayName <chr> "dataslice", "Eloise Hitalia", "Leonardo Souza C~
## $ authorProfileImageUrl <chr> "https://yt3.ggpht.com/ytc/AAUvwnh4JuQbg2uUKHcYv~
## $ authorChannelUrl <chr> "http://www.youtube.com/channel/UCBV194XNr6CIQCC~
## $ authorChannelId.value <chr> "UCBV194XNr6CIQCCuw1v2rMQ", "UCD0yZnbyl04QlbpAW2~
## $ canRate <chr> "TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE", ~
## $ viewerRating <chr> "none", "none", "none", "none", "none", "none", ~
## $ likeCount <chr> "3", "0", "0", "0", "0", "0", "0", "0", "0", "0"~
## $ publishedAt <chr> "2021-01-16T16:40:50Z", "2021-06-16T20:21:26Z", ~
## $ updatedAt <chr> "2021-01-16T16:40:50Z", "2021-06-16T20:21:26Z", ~
## $ id <chr> "UgzSOC39vxd9TE69q994AaABAg", "UgxowQrhecdQ1Iv9E~
## $ parentId <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, ~
## $ moderationStatus <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, ~