{"word_count": 1203, "character_count": 10339}
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&#60;-"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"#le token d'autorisation de l'API rapgenius urlr&#60;-"https://api.genius.com/search?q="   #l'URL qui permet de faire des recherches sur rapgeniusnresult&#60;- "&#38;per_page=1000" # le nombre de résultats qu'on veut (sinon limité à 20)request&#60;-URLencode(("Booba"))  #la recherche qu'on veut mener  urlf&#60;-paste(urlr,request,nresult,"&#38;access_token=",token,sep="") # on met ensemble pour avoir le vrai URLjson&#60;- getURL(urlf) # on récupère la requête sous format jsonresul&#60;- fromJSON(json) # on la décodeOn crée une base de données vide pour le moment :TEXT&#60;-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&#60;-(resul$response$hits[[i]]$result$url) #pour chaque résultat, on récupère l'URL du morceau     html&#60;- read_html(url, encoding="UTF-8") #on le lit en UTF-8     lyricshtml&#60;-html_node(html, "div.lyrics") #on recherche le bon "noeud" celui où il y a les paroles     txt&#60;-html_text(lyricshtml) # on transforme ce qu'il y a dans le noeud pour que ce soit lisible     TEXT[i,1]&#60;- resul$response$hits[[i]]$result$primary_artist$name #le nom de l'artiste dans la première colonne     TEXT[i,2]&#60;- resul$response$hits[[i]]$result$title #le titre du morceau dans la deuxième     TEXT[i,3]&#60;-txt #le texte dans la troisième colonne     TEXT[i,3]&#60;-iconv(TEXT[i,3], from="UTF-8", to="ASCII//TRANSLIT") #on enlève les accents     TEXT[i,2]&#60;-iconv(TEXT[i,2], from="UTF-8", to="ASCII//TRANSLIT")      TEXT[i,1]&#60;-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]&#60;- resul$response$hits[[i]]$result$primary_artist$name     TEXT[i,2]&#60;- resul$response$hits[[i]]$result$title     TEXT[i,3]&#60;- 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&#60;-(resul$response$hits[[i]]$result$url)      html&#60;- read_html(url, encoding="UTF-8")      lyricshtml&#60;-html_node(html, "div.lyrics")      txt&#60;-html_text(lyricshtml)      TEXT[i,1]&#60;- resul$response$hits[[i]]$result$primary_artist$name   TEXT[i,2]&#60;- resul$response$hits[[i]]$result$title      TEXT[i,3]&#60;-txt      TEXT[i,3]&#60;-iconv(TEXT[i,3], from="UTF-8", to="ASCII//TRANSLIT")     TEXT[i,2]&#60;-iconv(TEXT[i,2], from="UTF-8", to="ASCII//TRANSLIT")      TEXT[i,1]&#60;-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 NAtable(is.na(TEXT[,3]))FALSE  TRUE 232   727#Troisième colonne (texte) : beaucoup de NAcolnames(TEXT)&#60;- 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 sauvegardewrite.table(TEXT, file="booba.txt")  #on l'écrit en texte avec les sauts de ligneIci 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 &#60;- TEXT[ !is.na( TEXT$Artiste ) , ] #on crée une nouvelle base en ne gardant que Lunatic et Boobaf2 &#60;- subset( TEXT, !is.na( Artiste ) ) f2 &#60;- na.omit( TEXT ) write.table(f2, file="boobaluna.txt") #on a la base en texteOn 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]&#60;-gsub("[\r\n]", " / ", TEXT[,3]) #on enlève les sauts de lignewrite.csv2(TEXT, file="booba.csv") #on a sous forme de tableau f2[,3]&#60;-gsub("[\r\n]", " / ", f2[,3]) #on enlève les sauts de ligne write.csv2(f2, file="boobaluna.csv") #on a sous forme de tableauVoilà, 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]&#60;-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 !CorentinAllez, un dernier PS, promis :Voilà la liste des morceaux récupérés avec leur texte (qu’on ne met pas ici)BoobaBooba2Booba3Booba4Lunatic 3GO.GIzi LifeBad Boy StreetLa lettreAttilaJimmy Deux FoisFast LifeLiberation time (remix)Si tu kiffes pasValideeRats des villesOuais Ouais03/02/2015Pas l'temps pour les regretsLVMHVaisseau mereJe sais (Freestyle Rihanna)Tony CoulibaliLe crime paieG-LoveGame OverTout C'Qu'On ConnaitOuest Side (Pochette)Le silence n'est pas un oubliMove LangGun In HandCommis d'OfficeClash MC Jean Gab'1Hommes De L'OmbreTony SosaCriminelle leagueInterludeBanlieueCiviliseD.U.C1.8.7IneditOn donne ca a l'ancienneMauvais OeilMon PaysCaesar PalaceNouvelle EcoleFreestyle RadioH.L.M 3KalashRepose En PaixKojakTout et tout d'suiteGroupe sanguinScarfacePigeonsSoldatsCash FlowLe son qui met la pressionTombe Pour ElleTallacDe Mauvaise AugureJe me souviens (Freestyle)92ITemps Mort 2.0Tout C'Que J'ai100-8 ZooTallac (Remix)Sang d'encreOKLMAvant De PartirLa Vie en rougeFuck AroundLes vrais saventLes MeilleursB2obaAu fond de la classeOutroAvertisseursBellucciCouleur EbeneOn Controle La ZoneIntro Mix-Tape EvolutionTetes bruleesPitbullIndependantsMe-CaCannes 2014B.O. (Banlieue Ouest)Billets VioletsPourvu qu'elles m'aimentHors-SaisonOKLM (Remix)L'effort de paixA.C. MilanA4AnimalsIntro (0.9)IntroductionCaramelR.A.SLe mal par le malR.A.PViens danser avec les LunaticJack DaGarcimoreBatiment CFreestyle Mixtape/ La lettreFreestyle GenerationsMr KoppEcoute bienA3Chacun Sa ManiereFusionComme Une EtoileBoss Du Rap GameD.U.C (Autopsie 2)Freestyle Radio 2Ni Strass, Ni Paillette (Partie 2)CaracasIzi MonnaieDiamond GirlLa mort leur va si bien (Twinsmatic Remix)L.U.N.A.T.I.C.Loin d'iciBabyKingBatiment C part IICivilise (Partie 1)RatpisRolexAlter Ego7 Vie LaIntroParlons PeuGangsterMarche ou CreveIntro (A2)Le crime paie (Live)La mort leur va si bienSalade Tomates OignonsQuoi qu'il arriveAu bout des reves (Freestyle)Si tu kiffes pas (Live)BoulbiSans RaturesPazalaza Pour SazamuserIntro (A1#1)Pas l'temps pour les regrets (Partie 1)PanameDu biffLe duc de boulogneInterview Metronews - Futur 2.0Freestyle 1994Turfu0.9FuturBellucci (English)La meufWesh MorrayStrass Et PaillettesLe Bitume Avec Une PlumeSalam AdieuIntro (Cut Killer Show)N?1045 ScientificMa CouleurFreestyle - Que le hiphop repose en paixAvertisseur (Partie 1)Maitre YodaOuest SideGarde la pecheSalade Tomates Oignons (Remix)Avertisseur (Partie 2)PiratesLes derniers seront les premiersMaki Sall MusicOuest Side (Freestyle)B.O. (Generaldo Tape)Jour De PayeOn m'a ditLunaticBoulbi (Freestyle)Lunatic chez Cut KillerDouble PoneyCarton RoseAbracadabraLa Faucheuse (Remix)Que le message passeParadisReelLoin d'ici (Twinsmatic remix)Intro patrimoine du ghettoJ'perds mon temps (Partie 1)Une vieLa FaucheuseMa DefinitionOuais ouais (Freestyle Planet Rap)Tetes brulees (Live)KillerMon SonJimmyAnimals (Feat. Lim &#38; Moussa)FreestyleRTCTop Niveau2PacJe m'en vaisCheck le microAu bout des reves92 IziC'est La Vie100-8 Zoo (Feat. Malekal Morte)Attack sur la 7kBakel City GangSi Tu SavaisT.L.TLes Rues De Ma VieLunintroAll SetLe meteoreSaddam Hauts-De-SeineSans Ratures (Feat. Nessbeal)Le son qui met la pression (Live)IllegalBoite vocaleDestineeLongueur d'avanceJe me souviensTemps Mort2.0Mauvais GarconJusqu'ici Tout Va BienG5Billets vertsFoetusCré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