C Cosechar textos de la red

En el capítulo Cosechar textos te ahorré el esfuerzo de recuperar los discursos de Navidad de la web de la Casa Real porque presentaban una serie de problemas de diseño que provocaban que los textos tuvieran algunos errores. Sin embargo, te voy a mostrar esta técnica de obtención de datos, conocida como web scrapping. Para mostrártela, vas a recolectar las letras de las canciones de Joaquín Sabina de un sitio web, llamado Letras que se dedica a recopilarlas, aunque su status legal no está nada claro en lo referente a los derechos de autor.

Recolectar datos de páginas web puede ser una auténtica pesadilla, sobre todo cuando los sitios se alimentan de lo aportado por terceras personas sin control editorial alguno, con lo que los diseños a veces son demenciales. Este puede ser el caso del sitio que vas a usar como modelo.

Lo primero de todo es que accedas a la página dedicada a Joaquín Sabina en la web de Letras. Recórrela hasta que llegues a la etiqueta Todas las canciones. Ahí debajo tienes a lista alfabética de todas las canciones. Cada título esconde la ruta a la página web que contiene la letra. Si sitúas el ratón sobre cualquier título, en la parte inferior del navegador se abrirá una pequeña ventana en la que puedes ver la dirección completa. Sitúalo sobre la primera canción de la lista, 19 días y 500 noches, y mira lo que pone en la parte inferior izquierda del navegador. Verás que dice https://www.letras.com/joaquin-sabina/34773/. Esa es la ruta a la página que contiene la letra de esa canción. Si posas el cursor sobre otros títulos verás que la mayor parte de la ruta dice siempre los mismo https://www.letras.com/joaquin-sabina/ y que lo único que cambia, aparentemente, es la parte final, que es una secuencia de números. Desafortunadamente, las poco más de 250 letras de Joaquín Sabina recopiladas en este sitio no tienen números consecutivos, con lo que la idea de averiguar cuál es el primero y cuál es el último y después crear un vector de números con la secuencia no es factible. (En otras sitios web, el material que andas buscando sí tiene una secuencia numérica correlativa, con lo que te facilitan la tarea enórmemente.) Hay que buscar otra estrategia, y esta supone indagar en las entrañas de la página web en busca de una manera de conseguir los datos con relativa sencillez.

Para poder acceder a las tripas de una página web, para localizar algo específico, como en este caso, lo mejor es situar el ratón sobre la línea de texto que te interese. En este caso el título de la canción 19 días y 500 noches y pulses el botón derecho del ratón (en un Mac control y un clic del ratón, o del panel táctil (touchpad) del ordenador). Se abrirá un menú contextual. De las varias posibilidades que ofrezca, haz clic sobre Inspeccionar o Inspeccionar elemento (depende del navegador). Entonces se dividirá el navegador en dos zonas, como puedes ver en la figura @ref(fig:sabina-01).

Ventana de `Inspeccionar` en Chrome

Figura C.1: Ventana de Inspeccionar en Chrome

Fíjate en el recuadro superior de la derecha. Verás una zona resaltada en azul claro (puede variar de ordenador a ordenador y de navegador a navegador, pues se puede abrir en la parte inferior del navegador) que dice

Se trata de unas líneas de código HTML, que es con el que se escriben las páginas web. Esta es una línea muy sencilla (aunque la ves en tres líneas diferentes) que contiene un hiperenlance dentro de la etiqueta <a>, que es lo que te permite saltar de página en página, de web en web. Aquí lo importante es que dentro de esa etiqueta es donde están guardadas las direcciones de cada una de las páginas que contienen las letras de las canciones, por lo que tienes que extraer el literal "/joaquin-sabina/34773/" que viene identificado por el atributo href para crear el índice de canciones, en este caso de direcciones url a cada una de las canciones de Joaquín Sabina.

C.1 Crear el índice

Para poder extraer esta información de la red necesitas una nueva librería rvest. Así que instátala

Cuando lo hagas, instalará otra llamada xml2 que le es necesario. Una vez instalada, lo que tienes que hacer es invocarla.

Al ejecturar la orden responderá con este mensaje

## Loading required package: xml2
## 
## Attaching package: 'rvest'
## The following object is masked from 'package:purrr':
## 
##     pluck
## The following object is masked from 'package:readr':
## 
##     guess_encoding

que te indica que rvest se ha encargado de cargar la librería xml2, por lo que no tienes que preocuparte de hacerlo.

Lo siguiente es crear un subdirectorio en el que guardar el material. Te recomiendo que lo hagas dentro de la carpeta datos y que lo llames sabina.

Ahora solo tienes que leer la página índice y guardarla en un objeto que llamarás indice.

lo que creará un objeto de tipo lista. Compruébalo. Ejecuta en la consola

La respuesta será

## [1] "list"

La función class() te indicará qué tipo de contenido es el que hay en la lista indice y cuantos elementos contiene.

Te dirá

## [1] "xml_document" "xml_node"

Es decir, hay dos elementos. Uno es un xml_document y el otro un xml_node. Es decir, en el primero tiene la página web en HTML, y este no es sino un dialecto de XML, de ahí que dice que se trata de un xml_document.

La segunda respuesta de class(indice) ha sido xml_node. Si recuerdas la línea de HTML que viste un poco antes, verás que comienza con a. Esa a es la etiqueta de un nodo que tiene dos atributos class= y href=. El que te interesa es href=, que es el que encierra la información que necesitas para generar el índice con el que recolectarás las letras de las canciones. Así que vas a extraer esa información con

Con este bloque de código le has pedido a R que obtenga los datos del objeto indice y que los guarde en el vector canciones. Que lo que ha de buscar está siempre dentro del nodo html a, y el responsable de localizrlos es la función html_nodes("a"). Una vez hallados los nodos a, la función html_attr("href") debe extraer el literal del atributo href.

Ejecuta la orden, pídele a R que imprima el contenido de canciones.

Te responderá con un largo listado puesto que canciones tiene 432 elementos. Aquí solo te muestro los 20 primeros

##  [1] "/"                                                                                                                                          
##  [2] "/"                                                                                                                                          
##  [3] "/estilos/trova/"                                                                                                                            
##  [4] "/joaquin-sabina/"                                                                                                                           
##  [5] "/joaquin-sabina/"                                                                                                                           
##  [6] "/joaquin-sabina/ouvir.html"                                                                                                                 
##  [7] "/joaquin-sabina/ouvir_aleatorio.html"                                                                                                       
##  [8] "javascript:;"                                                                                                                               
##  [9] "/joaquin-sabina/radio.html"                                                                                                                 
## [10] "http://www.facebook.com/sharer.php?u=https://www.letras.com%2Fjoaquin-sabina%2F&t=Joaquin Sabina en Letras"                                 
## [11] "http://twitter.com/share?url=https://www.letras.com%2Fjoaquin-sabina%2F&related=letras&text=%E2%99%AB%20Joaquin Sabina en @letras"          
## [12] "http://www.facebook.com/sharer.php?u=https%3A%2F%2Fwww.letras.com%2Fjoaquin-sabina%2F&t=Joaquin+Sabina"                                     
## [13] "http://twitter.com/share?url=https%3A%2F%2Fwww.letras.com%2Fjoaquin-sabina%2F&related=letras&text=%E2%99%AB%20Joaquin+Sabina%20en%20@letras"
## [14] "/contribuicoes/enviar_letra/joaquin-sabina/"                                                                                                
## [15] "/joaquin-sabina/mais_tocadas.html"                                                                                                          
## [16] "/joaquin-sabina/mais_tocadas.html"                                                                                                          
## [17] "/joaquin-sabina/34773/"                                                                                                                     
## [18] "/joaquin-sabina/34767/"                                                                                                                     
## [19] "/joaquin-sabina/132235/"                                                                                                                    
## [20] "/joaquin-sabina/330194/"

Repasa el contenido. Comprobarás que hasta el elemento 17 no aparece el tipo de url que te he mencionado, /joaquin-sabina/nnnnnn/ (las nnnnn representan cualquier secuencia de números). Pero más adelante hay otros elementos que no ofrecente ese patrón. Por lo que has de crear un nuevo vector que solo contenga aquellos elementos que presentan el patrón /joaquin-sabina/nnnnnn/. Lo primero es everiguar qué elementos de canciones lo tienen. Para ello usarás la función grep() que hace uso de la reglas de expresión regular. Esta función obtendrá los números índice, los que se imprimen en la consola entre corchetes, de los elementos que contengan el patrón. grep() necesita saber cuál es ese patrón y en qué vector lo ha de buscar. El patrón es en este caso es /joaquin-sabina/nnnnnn/ y el vector canciones, con lo que la orden es

donde lo único raro, pero ya no debe serlo, es el \\d+ que es el metacarácter para localizar cualquier secuencia de uno o más números. Si ejecutas la orden anterior se imprimirá una larga lista de números. En total 263. Por ahorrar espacio, solo te muestro los primeros

## [1] 17 18 19 20 21 22

y los últimos

## [1] 307 308 309 310 311 312

Ahora solo te falta extraer esos elementos de canciones. Hay, como de costumbre, varias posibilidades. Una es crear un nuevo vector y guardar en él los índices de elementos que cumplen la condición de contener el patrón. Por ejemplo:

Si en la pestaña Environment ha aparecido un objeto llamado cumplen y que a su derecha dice int [1:263] 17 18 19 20 21 22 23 …(la cantidad de números depende del ancho de la ventana), has conseguido la relación de números índice con la que extraerás las direcciones correctas que hay en canciones.

Lo siguiente, es extraer las direcciones de canciones y guardarlas en otro objeto para después utilizarlo para descargar las letras. Llámalo canciones2.

Lo que esta orden está diciéndole a R es que guarde en canciones2 todos aquellos elementos de canciones cuyos índices están guardados en cumplen, de ahí que cumplenesté entre corcheres.

También te puedes ahorrar todo este trabajo con una sola línea de código.

Antes de ejecutar la orden anterior, ejecuta en la consola

## [1] "/"                          "/"                         
## [3] "/estilos/trova/"            "/joaquin-sabina/"          
## [5] "/joaquin-sabina/"           "/joaquin-sabina/ouvir.html"

Esos seis primeros elementos no los quieres. Ejecuta ahora la orden

y, a continuación revisa el contenido de canciones:

Aquí solo te muestro las primeras:

## [1] "/joaquin-sabina/34773/"   "/joaquin-sabina/34767/"  
## [3] "/joaquin-sabina/132235/"  "/joaquin-sabina/330194/" 
## [5] "/joaquin-sabina/132269/"  "/joaquin-sabina/1350129/"

Te explico qué hace esa expresión sintética que has utilizado.

Le has pedido a R que conserve en canciones tan solo aquellos elementos que contengan el patrón /joaquin-sabina/\\d+/ que localizas con la función grep(), que le aplicas al objeto original canciones. Con esto te ahorras, como te he dicho, dos líneas de código:

  1. Averiguar los números índice que cumplen el patrón: cumplen <- grep("/joaquin-sabina/\\d+/", canciones)
  2. Guardar en un nuevo objeto canciones2 todos los elementos de canciones que cumplen el patrón: canciones2 <- canciones[cumplen].

Además, no creas dos objetos intermedios: cumplen y canciones2.

Ya tienes la relación de canciones de Joaquín Sabina, son 263. Sin embargo, solo tienes una parte de la dirección. Te falta la parte fija para todo el sitio, la secuencia https://www.letras.com, que tienes que añadir a todos y cada uno de los elementos de canciones. La manera de hacerlo es con la función paste().

La orden anterior une la parte fija a la variable que se encuentra en cada uno de los 263 elementos de canciones. El atributo sep = "" está vacío ya que cada elemento de canciones tiene como primer carácter la barra / que indica cambio de directorio. Comprueba el resultado con

que solo imprimirá las seis primeras direcciones. No necesitas repasar la lista completa para comprobar que lo ha hecho bien.

## [1] "https://www.letras.com/joaquin-sabina/34773/"  
## [2] "https://www.letras.com/joaquin-sabina/34767/"  
## [3] "https://www.letras.com/joaquin-sabina/132235/" 
## [4] "https://www.letras.com/joaquin-sabina/330194/" 
## [5] "https://www.letras.com/joaquin-sabina/132269/" 
## [6] "https://www.letras.com/joaquin-sabina/1350129/"

Ya tienes todo lo necesario para empezar a bajar las letras de las canciones.

C.2 Bajar los textos

Para bajar los textos de las 263 canciones, lo mejor es emplear un bucle for porque se trata de repetir 263 veces las mismas acciones. Copia el siguiente bloque de código en el editor de RStudio, pero no lo ejecutes hasta hayas leído toda la explicación.

C.2.1 Explicación del código

La primera línea del bucle guardará en canción, gracias a la función read_html(), la página web de la dirección que le indique en cada iteración el vector canciones[i].

Antes de pasar a la segunda instrucción, vuelve a la página web y haz clic sobre el primer título: 19 días y 500 noches e inspecciona el contenido. Sitúa el cursor en el primer verso, pulsa el botón derecho del ratón (control y clic del ratón en Mac). Se abrirá un menú contextual. Dentro de él haz clic en Inspeccionar (o Inspeccionar elemento), con lo que vuelves a entrar en las entrañas de una página web, como puedes ver en la figura C.2. De nuevo se habrá resaltado un nodo de la página HTML. En este caso la etiqueta es p. Por lo tanto lo que necesitas es extraer el contenido de todos los p que haya en la página.

Ventana de `Inspeccionar` en Chrome en la canción [_19 días y 500 noches_](https://www.letras.com/joaquin-sabina/34773/). Cada secuencia `<p>…</p>` es una estrofa de la canción

Figura C.2: Ventana de Inspeccionar en Chrome en la canción 19 días y 500 noches. Cada secuencia <p>…</p> es una estrofa de la canción

En la explicación que viene a continuación voy a utilizar el contenido de la primera canción contenida en canciones. Tú puedes replicarlo si ejecutas el código que hay en la siguiente casilla de código. Recuerda que es una forma de ver que hará cada línea en cada iteración. Al final de la explicación deberás ejecutar el código que te he dicho que copiaras en el editor de RStudio.

Pero antes de seguir, haz clic en el triangulito gris que hay a la izquierda de la línea resaltada que te he mostrado en la figura C.2. Se deplegará y aparecerá este texto:

Los creadores del sitio web tomaron la decisión de encerrar entre <p>…</p> las estrofas (a veces la canción completa) y marcar cada verso con <br>. Esta etiqueta HTML lo que hace es imprimir en la pantalla un cambio de línea. Visualmente es una buena solución, pero para quien quiera extraer la información supone un problema. Lo es porque cuando recuperes el texto, las etiquetas que le indican al navegador que debe pasar a la línea siguiente desaparecen, con lo que el resultado es ilegible (o parcialmente ilegible) puesto que se unen las palabras a ambos lados de la etiqueta, con lo que se crean palabras inexistentes.

Lo nuestro duróLo que duran dos peces de hieloEn un güisqui on the rocksEn vez de fingirO estrellarme una copa de celosLe dio por reír

Este problema hace que no puedas usar la solución obvia para extraer el texto de los nodos p de esta página: la secuencia de las funciones html_nodes() y html_text().

Hay que buscar una solución para que antes de extraer el texto cambie esas etiquetas <br> por algo que separe realmente los versos de cada estrofa. Aquí entra en juego la función de reemplazo gsub().

Lo que le pides con esta expresión a R es que guarde en letra el resultado de sustituir cualquier secuencia de etiquetas de HTML que comiencen con <br.*?>, por un intro, lo que se indica con \n. Este cambio lo debe hacer en cualquier nodo p del objeto cancion que localice con la función html_nodes("p").

He usado <br.*?> porque la etiqueta en cuestión puede aparecer de tres maneras <br>, <br/> y <br />, dependiendo de la versión del HTML en que esté escrito el código. Para evitar el problema de que puedan aparecer cualquiera de ellas (quizá no en la misma página, pero sí en diferentes), usas la expresión regular <br.*?> que le dice a gsub que debe buscar cualquier secuencia de caracteres que contenga br, y le siga cualquier secuencia de caracteres –el punto–, de cualquier longitud –el asterisco– que estén encerrados entre < y >. Pero las expresiones regulares son muy avariciosas y tienden a localizar el máximo de material que les permita la regla. Para evitar que abarque todo el texto que pueda haber entre el primer < y el último > de la cadena que debe revisar, usas la ? para decirle que que no sea avaricioso (en inglés dicen greedy) sino perezoso (lazy), y que solo seleccione aquellas secuencias que pueda haber entre < y > que abarquen el menor número de caracteres.

Para ver cómo ha actuado la expresión anterior, pídele a R que te presente los seis primeros elementos de letra con la función head().

Tan pronto como pulses intro podrás ver que hay numerosos casos de \n.

## [1] "<p>Lo nuestro duró\nLo que duran dos peces de hielo\nEn un güisqui on the rocks\nEn vez de fingir\nO estrellarme una copa de celos\nLe dio por reír</p>\n"                                                                                                                                
## [2] "<p>De pronto me vi\nComo un perro de nadie\nLadrando a las puertas del cielo\nMe dejó un neceser con agravios\nLa miel en los labios\nY escarcha en el pelo</p>\n"                                                                                                                        
## [3] "<p>Tenían razón\nMis amantes\nEn eso de que antes\nEl malo era yo\nCon una excepción\nEsta vez\nYo quería quererla querer\nY ella no\nAsí que se fue\nMe dejó el corazón\nEn los huesos\nY yo de rodillas\nDesde el taxi\nY, haciendo un exceso\nMe tiró dos besos\nUno por mejilla</p>\n"
## [4] "<p>Y regresé\nA la maldición\nDel cajón sin su ropa\nA la perdición\nDe los bares de copas\nA las cenicientas\nDe saldo y esquina\nY, por esas ventas\nDel fino Laina\nPagando las cuentas\nDe gente sin alma\nQue pierde la calma\nCon la cocaína</p>\n"                                 
## [5] "<p>Volviéndome loco\nDerrochando\nLa bolsa y la vida\nLa fui, poco a poco\nDando por perdida</p>\n"                                                                                                                                                                                       
## [6] "<p>Y eso que yo\nParo no agobiar con\nFlores a María\nPara no asediarla\nCon mi antología\nDe sábanas frías\nY alcobas vacías\nPara no comprarla\nCon bisutería\nNi ser el fantoche\nQue va en romería\nCon la cofradía\nDel Santo Reproche</p>\n"

Son cambios de línea reales, como cuando en el procesador de textos pulsas intro y comienzas un nuevo párrafo. Puesto que el objetivo era tener el texto de la canción dividido en versos, has encontrado una solución satisfactoria; además, cada elemento de letra es una estrofa. ¡Fabuloso!

Lo siguiente es extraer el título de la canción que está en un nodo identificado con h1, que es la etiqueta clásica de HTML para los encabezamientos (títulos) de primer nivel (en HTML hay seis niveles, de h1 a h6). Puesto que tendrás aún en el navegador la pestaña con la canción 19 días y 500 noches, sitúa el cursor sobre el título, de color naranja, pulsa el botón derecho del ratón (control y clic del ratón en Mac) y selecciona Inspeccionar (o Inspeccioanr elemento) del menú contextual. En esta ocasión la línea que se habrá resaltado dice <h1>19 Días y 500 Noches</h1> == $0. El texto que está entre <h1>y </h1> es la que se extraerá con

Ahí podrías acabar el trabajo y pasar a grabar la canción en el disco duro. Sin embargo, te lo he indicado ya varias veces, las páginas web son una auténtica pesadilla y aún queda cierta basura que hay que eliminar. Examina el contenido del vector titulo que acabas de crear con

## [1] "LETRAS.COM - Letras de canciones" "19 Días y 500 Noches"

Como puedes ver hay dos elementos. El primero es el título general de la página (que no se ha impreso en la pantalla) y el segundo es el de la canción. Por tanto, tienes que eliminar ese primer elemento. Como tienes los índices, ya sabes cómo eliminar o extraer un elemento por medio de ése número.

Segundo objetivo conseguido: el título de la canción ya lo tienes guardado en titulo.

Insisto, las páginas web son un desastre. Mira la parte final del texto que tienes recogido en letra con la función tail().

## [1] "<p>Me abandonó\nComo se abandonan\nLos zapatos viejos\nDestrozó el cristal\nDe mis gafas de lejos\nSacó del espejo\nSu vivo retrato\nY fui tan torero\nPor los callejones\nDel juego y el vino\nQue ayer el portero\nMe echó del casino\nDe Torrelodones</p>\n"                                                                                      
## [2] "<p>Qué pena tan grande\nNegaría el Santo Sacramento\nEn el mismo momento\nQue ella me lo mande</p>\n"                                                                                                                                                                                                                                                
## [3] "<p>Y eso que yo\nParo no agobiar con\nFlores a María\nPara no asediarla\nCon mi antología\nDe sábanas frías\nY alcobas vacías\nPara no comprarla\nCon bisutería\nNi ser el fantoche\nQue va en romería\nCon la cofradía\nDel Santo Reproche\nTanto la quería\nQue tardé en aprender\nA olvidarla diecinueve días\nY quinientas noches\nY regresé</p>"
## [4] "<p> Música comienza con letras\n © 2003 - 2019, 2.7 millones de canciones, 72.6 millones de visitas en Noviembre \n Hecho con <b>amor</b> en Belo Horizonte - Brasil </p>"                                                                                                                                                                           
## [5] "<p>Asociados:</p>"                                                                                                                                                                                                                                                                                                                                   
## [6] "<p style=\"display: none;\">Quiero recibir notificaciones de artistas destacados y noticias.<span id=\"js-toggle-push\" class=\"bt-toggle\"></span></p>"

Los tres últimos elementos –4, 5, y 6– nada tienen que ver con la canción. Se trata del pie de página del que has extraído la letra de la canción. Tienes que eliminarlo puesto que no es texto que te interese. Podrías estar tentado en usar los números índice, pero no sabes cuántos elementos (estrofas) tendrá cada canción que bajes con el bucle, por lo que has de emplear otra estrategia. Dado que es el pie de página, y este se repite en todo el sitio web (deberías mirar unas cuantas páginas para ver qué es lo que pasa en ellas y asegurarte de que se repite sistemáticamente), debes borrarlo. Para conseguirlo lo mejor es usar la función de búsqueda y reemplazo gsub() puesto que sabes cuáles son los literales que tienes que eliminar. Necesitas una línea de código para cada una de esas tres últimas líneas (el orden en que las pongas es indiferente).

Fíjate que cada uno de los literales comienza con .* y acaba con lo mismo. De esta manera te aseguras de que solo borrará esas líneas, comiencen como comiencen y finalicen como finalicen, que contengan en su interior Asociados:, Quiero recibir notificaciones y Música comienza con letras. Ejecuta cada una de las líneas anteriores y comprueba el final del objeto letra con

## [1] "<p>Me abandonó\nComo se abandonan\nLos zapatos viejos\nDestrozó el cristal\nDe mis gafas de lejos\nSacó del espejo\nSu vivo retrato\nY fui tan torero\nPor los callejones\nDel juego y el vino\nQue ayer el portero\nMe echó del casino\nDe Torrelodones</p>\n"                                                                                      
## [2] "<p>Qué pena tan grande\nNegaría el Santo Sacramento\nEn el mismo momento\nQue ella me lo mande</p>\n"                                                                                                                                                                                                                                                
## [3] "<p>Y eso que yo\nParo no agobiar con\nFlores a María\nPara no asediarla\nCon mi antología\nDe sábanas frías\nY alcobas vacías\nPara no comprarla\nCon bisutería\nNi ser el fantoche\nQue va en romería\nCon la cofradía\nDel Santo Reproche\nTanto la quería\nQue tardé en aprender\nA olvidarla diecinueve días\nY quinientas noches\nY regresé</p>"
## [4] ""                                                                                                                                                                                                                                                                                                                                                    
## [5] ""                                                                                                                                                                                                                                                                                                                                                    
## [6] ""

Verás que los tres últimos elementos están vacíos. Tienen que ser tres pares de comillas sin nada en su interior puesto que has borrado su contenido. Ya tienes la letra de 19 días y 500 noches casi lista para guardarla en el ordenador.

Vas a emplear el título de cada canción para nombrar el fichero, pero hay un pequeño problema que conviene resolver antes de proceder.

Dejar espacios en blanco en los nombres de los ficheros puede ser problemático ya que en ocasiones los ordenadores (especialmente en las URL) los interpretan con la secuencia %20. Lo mejor es cambiarlos por un guion bajo _, lo cual te permite leer el nombre con facilidad, como si realmente hubiera un espacio en blanco. No es lo mismo leer 19díasy500noches que 19_días_y_500_noches. Además, este sistema tiene ventajas a la hora de recuperar y procesar los nombres de los ficheros. Esto, de nuevo, es una búsqueda y reemplazo que tienes que hacer con gsub().

La orden anterior le pide que busque cualquier espacio en blanco, como los que introduces con la barra espaciadora del teclado, y los sustituya con un guion bajo. Mira el resultado con

Si es este

## [1] "19_Días_y_500_Noches"

lo has consegido.

Ya solo te queda grabar la canción en el disco duro, en el directorio datos/sabina/ que creaste al comienzo. Grabar el contenido de un objeto de R se consigue con la función writeLines() que necesita dos argumentos: el nombre el objeto que ha de grabar, en este caso letra, y el nombre del fichero.

Pero al nombre del fichero que tienes en titulo le faltan dos elementos imprescindibles: la extensión .txt y la ruta del directorio en que lo ha de guardar, en este caso datos/sabina/. La forma de construir el nombre completo del fichero es con la función paste(). Este es el esquema básico:

Por tanto, la expesión responsable de grabar la letra de cada canción es:

Si ejecutas la línea anterior, aparecerá en datos/sabina/ el fichero 19_días_y_500_noches.txt. Puedes comprobarlo en la pestaña Files. Haz clic en la carpeta datos y después en sabina. Si ahí ves el nombre del fichero (debe tener 2.2 KB), es que todo ha ido bien. Lo has conseguido. ¡Enhorabuena! Ya es hora de que ejecutes todo el bucle, que bajará 263 ficheros. Tardará un poquito (unos cinco o seis minutos, depende de la conexión a internet). Cuando en la consola aparezca de nuevo el símbolo del sistema –>– habrá finalizado.

Comprueba el resultado ejecutando en la consola la orden

Aquí solo podrás ver los seis primeros

## [1] "¿Quien_Me_Ah_Robado_El_Mes_de_Abril?.txt"
## [2] "¿Quién_Me_Ha_Robado_El_Mes_de_Abril?.txt"
## [3] "19_Días_y_500_Noches.txt"                
## [4] "1968.txt"                                
## [5] "40_Orccet_Terrace.txt"                   
## [6] "69_Punto_G.txt"

y los seis últimos

## [1] "Ya_Eyaculé.txt"                       
## [2] "Yo_Me_Bajo_En_Atocha.txt"             
## [3] "Yo_Quiero_Ser_Una_Chica_Almodovar.txt"
## [4] "Yo_También_Sé_Jugarme_La_Boca.txt"    
## [5] "Yo,_Mi,_Me,_Contigo.txt"              
## [6] "Zomo_de_Neón.txt"

numerados de 1 a 6, pero a ti te aparecerán numerados del 1 al 242.

Si aparecen los mismos títulos en tu ejecución que en las dos cajas anteriores, has logrado bajarte las 242 canciones de Joaquín Sabina que hay en Letras.com.

En teoría debería haber 263 canciones, que son las rutas que cosechaste y tienes guardadas en canciones, pero hay 21 canciones duplicadas. Sin saberlo lo has averiguado al nombrar el fichero en que has guardado cada una de las letras con el título. Ha sucedido esto porque cuando le pides a R que escriba un fichero en un disco, si el nombre es el mismo de otro fichero que ya hay grabado, no te avisará de que ya hay un fichero con idéntico nombre ni te preguntará si quieres sobreesribirlo o no. Lo reescribirá.

Fíjate en el nombre de los dos primeros ficheros

## [1] "¿Quien_Me_Ah_Robado_El_Mes_de_Abril?.txt"
## [2] "¿Quién_Me_Ha_Robado_El_Mes_de_Abril?.txt"
## [3] "19_Días_y_500_Noches.txt"                
## [4] "1968.txt"                                
## [5] "40_Orccet_Terrace.txt"                   
## [6] "69_Punto_G.txt"

Son prácticamente el mismo. Lo único que los diferencia es el Ah (erróneo) del primer fichero. Borra ese primer fichero ya que es un duplicado del que R no se ha podido deshacer. Ve a la pestaña Files, navega hasta el directorio datos/sabina/ y localiza el fichero con la errata. En el margen izquierdo verás una casilla. Haz clic en ella y después en la etiqueta Delete que hay en el borde superior de la pestaña. Se descolgará una ventanita que dice Confirm Delete; si estás seguro, haz clic en Yes.

C.3 Conclusión

Como has podido ver, bajar material de páginas web puede ser un poco complicado, pero a veces es la única forma de obtener datos para analizarlos, especialmente cuando no están disponibles de otra manera. Sin embargo, recuerda que la gran mayoría de las webs están protegidas por derechos de autor. La que he utilizado para mostrarte cómo hacerlo tiene, como he dicho, un estatus extraño. Mi recomendación es que antes de cosechar textos de un sitio web es que leas aténtamente las condiciones de uso y veas qué puedes y qué no puedes hacer.

¿Qué puedes hacer con esas canciones? Todo depende de tus intereses. Debbie Liske ha publicado un tutorial titulado Lyric Analysis with NLP & Machine Learning with R en el que analiza las letras de Prince. Es complejo, pero puedes aprender muchos trucos de programación y visualización como el de la figura C.3.

Nube de palabras de las canciones de Prince ([Liske 2018](https://www.datacamp.com/community/tutorials/R-nlp-machine-learning))

Figura C.3: Nube de palabras de las canciones de Prince (Liske 2018)