Appendice : récupérer (presque) l’intégralité des textes d’un rappeur sur Rapgenius

En complément de notre code sur la récupération des morceaux utilisant une expression donnée dans Rapgenius, nous allons ici voir comment récupérer l’intégralité des morceaux d’un artiste disponible sur le site. C’est un peu plus simple, puisqu’il n’y a pas de travail de transformation des textes. En revanche, certaines problématiques sont un peu différentes et nécessitent une adaptation du code. 

Les paquets dont on a besoin : si on ne les a pas install.packages(« nomdupaquet »)

library(xml2)
library(rvest)
library(utils)
library(rjson)
library(bitops)
library(RCurl)

Comme pour la recherche d’expression, la routine est la même pour dire à RapGenius de chercher un artiste (en fait c’est un peu différent, car on peut chercher directement sur les artistes, mais on a décidé ici de prendre « Booba » comme un mot clé).

token<-« XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX »

#le token d’autorisation de l’API rapgenius

urlr<-« https://api.genius.com/search?q= »   #l’URL qui permet de faire des recherches sur rapgenius

nresult<- « &per_page=1000 » # le nombre de résultats qu’on veut (sinon limité à 20)

request<-URLencode((« Booba »))  #la recherche qu’on veut mener

urlf<-paste(urlr,request,nresult, »&access_token= »,token,sep= » ») # on met ensemble pour avoir le vrai URL

json<- getURL(urlf) # on récupère la requête sous format json

resul<- fromJSON(json) # on la décode

On crée une base de données vide pour le moment :

TEXT<-data.frame()

Boucle pour remplir la dataframe. On commence par les morceaux dont l’artiste principal est Booba :

for (i in 1:length(resul$response$hits)) { #length : le nombre de résultats qu’on veut (si ça galère faire la boucle en plusieurs fois)

 
  if (resul$response$hits[[i]]$result$primary_artist$name== »Booba ») {
    url<-(resul$response$hits[[i]]$result$url) #pour chaque résultat, on récupère l’URL du morceau
    html<- read_html(url, encoding= »UTF-8″) #on le lit en UTF-8
    lyricshtml<-html_node(html, « div.lyrics ») #on recherche le bon « noeud » celui où il y a les paroles
    txt<-html_text(lyricshtml) # on transforme ce qu’il y a dans le noeud pour que ce soit lisible
    TEXT[i,1]<- resul$response$hits[[i]]$result$primary_artist$name #le nom de l’artiste dans la première colonne
    TEXT[i,2]<- resul$response$hits[[i]]$result$title #le titre du morceau dans la deuxième
    TEXT[i,3]<-txt #le texte dans la troisième colonne
    TEXT[i,3]<-iconv(TEXT[i,3], from= »UTF-8″, to= »ASCII//TRANSLIT ») #on enlève les accents
    TEXT[i,2]<-iconv(TEXT[i,2], from= »UTF-8″, to= »ASCII//TRANSLIT »)
    TEXT[i,1]<-iconv(TEXT[i,1], from= »UTF-8″, to= »ASCII//TRANSLIT »)
   
  } else { #Si le nom de l’artiste n’est pas Booba, on met le nom de l’artiste et du morceau mais pas le texte
    TEXT[i,1]<- resul$response$hits[[i]]$result$primary_artist$name
    TEXT[i,2]<- resul$response$hits[[i]]$result$title
    TEXT[i,3]<- NA
   
  }
}

Maintenant, on remplit la base de données quand l’artiste référencé est Lunatic :

for (i in 1:length(resul$response$hits)) { #length : le nombre de résultats qu’on veut (si ça galère faire la boucle en plusieurs fois)

  if (resul$response$hits[[i]]$result$primary_artist$name== »Lunatic ») {

url<-(resul$response$hits[[i]]$result$url)    

html<- read_html(url, encoding= »UTF-8″)    

lyricshtml<-html_node(html, « div.lyrics »)    

txt<-html_text(lyricshtml)    

TEXT[i,1]<- resul$response$hits[[i]]$result$primary_artist$name   

TEXT[i,2]<- resul$response$hits[[i]]$result$title    

TEXT[i,3]<-txt     TEXT[i,3]<-iconv(TEXT[i,3], from= »UTF-8″, to= »ASCII//TRANSLIT »)    

TEXT[i,2]<-iconv(TEXT[i,2], from= »UTF-8″, to= »ASCII//TRANSLIT »)    

TEXT[i,1]<-iconv(TEXT[i,1], from= »UTF-8″, to= »ASCII//TRANSLIT »)    

  } else {

print(url) #on peut lui dire de faire n’importe quoi tant que ça ne modifie pas la dataframe  

}

}

A ce moment-là on peut regarder combien on a de NA dans notre dataframe, normalement zéro pour les deux premières colonnes et beaucoup pour la troisième. Cela permet de vérifier que notre boucle a fonctionné. Puis on renomme les colonnes.

table(is.na(TEXT[,1]))
 FALSE
  959

#Première colonne : aucun NA

table(is.na(TEXT[,3]))
FALSE  TRUE
232   727

#Troisième colonne (texte) : beaucoup de NA

colnames(TEXT)<- c(« Artiste », « Titre », « Texte »)

Ainsi, sur les 959 résultats de la requête, on a 232 morceaux avec Booba ou Lunatic, et plus de 700 « autres » où Booba est mentionné (soit par un autre rappeur, soit parce qu’il rappe en featuring : ainsi un morceau comme Pucc Fiction, avec Oxmo Puccino n’est pas dans la base car il est référencé comme un morceau d’Oxmo.

Il n’y a pas besoin de modifier les textes, puisque c’est les textes entiers que l’on veut. En réalité, il faudrait ne garder que les couplets de Booba quand le morceau est un featuring (mais nous verrons ça plus tard).

setwd(« C:/Users/User-pc/Documents/Sociologie/Quanti/Rapgenius ») #le répertoire de sauvegarde

write.table(TEXT, file= »booba.txt »)  #on l’écrit en texte avec les sauts de ligne

Ici on a une base avec tous les textes de Booba + Lunatic + les artistes et morceaux qui ne sont d’aucun des deux (sans les textes, juste pour savoir ce qu’il faudrait rajouter). On l’écrit en texte, comme ça on a un document Word avec les textes les uns à la suite des autres. Plusieurs formats de cette base peuvent cependant être intéressants. Par exemple, on peut ne pas vouloir garder les « NA » :

f2 <- TEXT[ !is.na( TEXT$Artiste ) , ] #on crée une nouvelle base en ne gardant que Lunatic et Booba

f2 <- subset( TEXT, !is.na( Artiste ) )

f2 <- na.omit( TEXT ) write.table(f2, file= »boobaluna.txt ») #on a la base en texte

On peut aussi vouloir la base en CSV pour la lire avec Excel, et éventuellement faire des analyses lexicales ultérieures dessus. POur cela il vaut mieux enlever les sauts de ligne.

TEXT[,3]<-gsub(« [\r\n] »,  » / « , TEXT[,3]) #on enlève les sauts de ligne

write.csv2(TEXT, file= »booba.csv ») #on a sous forme de tableau

f2[,3]<-gsub(« [\r\n] »,  » / « , f2[,3]) #on enlève les sauts de ligne

write.csv2(f2, file= »boobaluna.csv ») #on a sous forme de tableau

Voilà, on a donc quatre bases de données différentes, en fonction de l’utilisation que l’on veut en faire.

Si on a fait une fausse manipulation et qu’il faut remettre les sauts de ligne, la commande est la suivante : f2[,3]<-gsub(« / », « \r\n », f2[,3])

C’est la fin de ce tutoriel ! Il y aurait encore beaucoup à dire, pour avoir des résultats plus propres, mais c’est une bonne base de travail !

Corentin

Allez, un dernier PS, promis :

Voilà la liste des morceaux récupérés avec leur texte (qu’on ne met pas ici)

Booba Booba2 Booba3 Booba4 Lunatic
3G O.G Izi Life Bad Boy Street La lettre
Attila Jimmy Deux Fois Fast Life Liberation time (remix) Si tu kiffes pas
Validee Rats des villes Ouais Ouais 03/02/2015 Pas l’temps pour les regrets
LVMH Vaisseau mere Je sais (Freestyle Rihanna) Tony Coulibali Le crime paie
G-Love Game Over Tout C’Qu’On Connait Ouest Side (Pochette) Le silence n’est pas un oubli
Move Lang Gun In Hand Commis d’Office Clash MC Jean Gab’1 Hommes De L’Ombre
Tony Sosa Criminelle league Interlude Banlieue Civilise
D.U.C 1.8.7 Inedit On donne ca a l’ancienne Mauvais Oeil
Mon Pays Caesar Palace Nouvelle Ecole Freestyle Radio H.L.M 3
Kalash Repose En Paix Kojak Tout et tout d’suite Groupe sanguin
Scarface Pigeons Soldats Cash Flow Le son qui met la pression
Tombe Pour Elle Tallac De Mauvaise Augure Je me souviens (Freestyle) 92I
Temps Mort 2.0 Tout C’Que J’ai 100-8 Zoo Tallac (Remix) Sang d’encre
OKLM Avant De Partir La Vie en rouge Fuck Around Les vrais savent
Les Meilleurs B2oba Au fond de la classe Outro Avertisseurs
Bellucci Couleur Ebene On Controle La Zone Intro Mix-Tape Evolution Tetes brulees
Pitbull Independants Me-Ca Cannes 2014 B.O. (Banlieue Ouest)
Billets Violets Pourvu qu’elles m’aiment Hors-Saison OKLM (Remix) L’effort de paix
A.C. Milan A4 Animals Intro (0.9) Introduction
Caramel R.A.S Le mal par le mal R.A.P Viens danser avec les Lunatic
Jack Da Garcimore Batiment C Freestyle Mixtape/ La lettre Freestyle Generations
Mr Kopp Ecoute bien A3 Chacun Sa Maniere Fusion
Comme Une Etoile Boss Du Rap Game D.U.C (Autopsie 2) Freestyle Radio 2 Ni Strass, Ni Paillette (Partie 2)
Caracas Izi Monnaie Diamond Girl La mort leur va si bien (Twinsmatic Remix) L.U.N.A.T.I.C.
Loin d’ici Baby King Batiment C part II Civilise (Partie 1)
Ratpis Rolex Alter Ego 7 Vie La Intro
Parlons Peu Gangster Marche ou Creve Intro (A2) Le crime paie (Live)
La mort leur va si bien Salade Tomates Oignons Quoi qu’il arrive Au bout des reves (Freestyle) Si tu kiffes pas (Live)
Boulbi Sans Ratures Pazalaza Pour Sazamuser Intro (A1#1) Pas l’temps pour les regrets (Partie 1)
Paname Du biff Le duc de boulogne Interview Metronews – Futur 2.0 Freestyle 1994
Turfu 0.9 Futur Bellucci (English) La meuf
Wesh Morray Strass Et Paillettes Le Bitume Avec Une Plume Salam Adieu Intro (Cut Killer Show)
N?10 45 Scientific Ma Couleur Freestyle – Que le hiphop repose en paix Avertisseur (Partie 1)
Maitre Yoda Ouest Side Garde la peche Salade Tomates Oignons (Remix) Avertisseur (Partie 2)
Pirates Les derniers seront les premiers Maki Sall Music Ouest Side (Freestyle) B.O. (Generaldo Tape)
Jour De Paye On m’a dit Lunatic Boulbi (Freestyle) Lunatic chez Cut Killer
Double Poney Carton Rose Abracadabra La Faucheuse (Remix) Que le message passe
Paradis Reel Loin d’ici (Twinsmatic remix) Intro patrimoine du ghetto J’perds mon temps (Partie 1)
Une vie La Faucheuse Ma Definition Ouais ouais (Freestyle Planet Rap) Tetes brulees (Live)
Killer Mon Son Jimmy Animals (Feat. Lim & Moussa) Freestyle
RTC Top Niveau 2Pac Je m’en vais Check le micro
Au bout des reves 92 Izi C’est La Vie 100-8 Zoo (Feat. Malekal Morte) Attack sur la 7k
Bakel City Gang Si Tu Savais T.L.T Les Rues De Ma Vie Lunintro
All Set Le meteore Saddam Hauts-De-Seine Sans Ratures (Feat. Nessbeal) Le son qui met la pression (Live)
Illegal Boite vocale Destinee
Longueur d’avance Je me souviens Temps Mort
2.0 Mauvais Garcon Jusqu’ici Tout Va Bien
G5 Billets verts
Foetus

Crédit photographique : Photographie de « Pop H », disponible sur son compte Flickr, ici = https://www.flickr.com/photos/aumeran/21905126470/in/photolist-znFuWj-9gSYUB-2CyRK-9mCZza-pECy5-at14UG-4Kw3kp-pECwq-pECv5-nXtCdw-pECsD-pECjs-fd8ity-jUddt1-fd5ScL-eMVmo7-hJyGUV-eMWTLK-eMRZMR-fcXfja-eMXrAN-eMN82g-gQtENc-fZz9WH-9gSYXg-9gSYVX-9gSYPZ-9gSYDp-eMLSB5-9gW6DN-9gSYYK-9gSYTM-9gW6xd-9gSYQF-9gW6tG-9gSYNc-9gW6rC-9gW6qC-9gW6pG-9gW6om-9gW6ns-9gSYFv-9gSYEn-9gW6i5-9gW6gA-9gSYAz-9gW169-9gSTnr-9gW12h-9gSTi6


Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *