Después de comprobar todos los requisitos previos, por fin puedes empezar a escribir el código.
install.packages('rvest')
Coloca el cursor al final de la línea y pulsa el botón «Run» situado encima del editor de código. Verás en tu consola el progreso de la instalación del paquete.
La instalación se realiza una sola vez, por lo que ahora puedes comentar o eliminar la línea anterior:
#install.packages('rvest')
Ahora tienes que cargar (o importar) la biblioteca:
library(rvest)
Utilizaré la función read_html para enviar una solicitud GET al sitio web de destino, lo que descargará el documento HTML necesario. De esta forma, descargaré el documento HTML necesario:
book_html <- read_html("https://www.goodreads.com/book/show/61439040-1984")
El resultado se almacena ahora en la variable book_html, que también puedes ver simplemente escribiendo en la consola:
Si en algún momento necesitas consultar la documentación oficial de una función que quieras utilizar, escribe en la consola:
help(function_name)
RStudio abrirá un servidor HTTP con un enlace directo a la documentación. Para read_html, el resultado será:
Para obtener la lista de reseñas, utilizaré la función html_elements. Recibirá como entrada el selector CSS que encontré anteriormente:
reviews <- book_html %>% html_elements('div.review')
El resultado será una lista de nodos XML, que recorreré para obtener la fecha y la valoración de cada elemento individual:
Los programadores de R utilizan el operador de barra vertical «%>%» para hacer la programación más versátil. Su función es pasar el valor del operando de la izquierda como argumento al operando de la derecha.
Puedes encadenar los operandos (como verás más adelante en esta guía), lo que te ayudará a reducir el uso de muchas variables locales. La línea de código anterior escrita sin el operador pipe quedaría así:
reviews <- html_elements(book_html, 'div.review')
Para recopilar los datos, inicializaré dos vectores fuera del bucle. Echando un vistazo rápido al sitio web, puedo garantizar que ambos vectores tendrán la misma longitud.
dates <- vector()
ratings <- vector()
Ahora, mientras recorro la lista de reseñas, busco dos valores: la fecha y la valoración. Como has visto antes, la fecha es un elemento anchor que tiene la clase reviewDate.
La valoración es un elemento span con la clase staticStars, y contiene cinco elementos span para cada estrella. Si el usuario ha otorgado una estrella, el elemento span tendrá el nombre de clase p10, mientras que el resto tendrá el nombre de clase p0.
El código tendrá este aspecto:
for (review in reviews) {
review_date = review %>% html_element('a.reviewDate') %>% html_text()
dates <- c(dates, review_date)
review_rating_element = review %>% html_element('span.staticStars')
valid_stars = review_rating_element %>% html_elements('span.p10')
review_rating = length(valid_stars)
ratings <- c(ratings, review_rating)
}
Fíjate en la función html_element; no es un error tipográfico. Puedes usar html_elements cuando quieras extraer una lista de nodos XML y html_element para uno solo.
En este caso, he aplicado esta última a una sección más pequeña del documento HTML (una reseña). También he utilizado la función html_text para obtener el contenido de texto del elemento que he encontrado.
Por último, fusionaré los dos vectores en un único marco de datos para centralizar la información:
result = data.frame(date = dates, rating = ratings)
Y el resultado final tendrá este aspecto: