Cómo acceder a sitios web haciendo scraping con R y obtener información: número de URL que contiene, título, número de veces que aparecen, duplicados, etc..
- Requisitos para hacer scraping con R.
- Realizar scraping en sitio web con R.
- Obtener estadísticas e información a partir del scraping.
Requisitos para hacer scraping con R
El requisito único será disponer de R y RStudio, así como de sus librerías básicas. En el siguiente artículo explicamos cómo instalar R, RStudio y sus librerías básicas:
Para la técnica de scraping con R, necesitaremos instalar en R Studio las siguientes librerías: httr, httr2, XML y dplyr. Podremos instalarlas, desde RStudio, ejecutando los siguientes comandos:
1 2 3 4 |
install.packages("httr"); install.packages("httr2"); install.packages("XML"); install.packages("dplyr"); |
Realizar scraping en sitio web con R
En primer lugar, guardaremos el sitio web a scrapear en una variable, para usarlo en el resto del código R:
1 |
dominio <- "https://www.mediawiki.org/wiki/MediaWiki"; |
Para descargar el código HTML de una página en una variable usaremos:
1 |
pagina <- httr::GET(dominio); |
NOTA: si queremos evitar tener que introducir el nombre de la librería delante de la función a utilizar, podemos importarla con:
Para convertir a texto:
1 |
paginaTexto <- content(pagina, as = "text")<em>;</em> |
Al igual que en el caso anterior, para importar la libería XML:
1 |
library(XML); |
Para convertir el texto a XML usaremos:
1 |
paginaXML <- htmlParse(paginaTexto, asText = TRUE); |
Empezaremos con la extracción de información del sitio web scrapeado. En primer lugar, obtendremos el valor de la etiqueta title del sitio web, con el comando R:
1 |
titulo <- xpathSApply(paginaXML, "//title", XML::xmlValue); |
Si mostramos el contenido de la variable «titulo», para la URL que estamos scrapeando, nos mostrará: MediaWiki.
Continuamos obteniendo información de la página web. Para obtener los títulos de todos los enlaces (URL) de la página web que estamos scrapeando, usaremos:
1 |
tituloEnlaces <- xpathSApply(paginaXML, "//a", XML::xmlValue); |
Para obtener la URL de todos los enlaces usaremos:
1 |
urlEnlaces <- xpathSApply(paginaXML, "//a", XML::xmlGetAttr, 'href'); |
Una vez obtenida la información en variables, vamos a hacer un pequeño tratamiento. En primer lugar, eliminaremos los posibles valores null (vacíos) tanto de tituloEnlaces, como de urlEnlaces, para ello usaremos:
1 |
urlEnlacesNulos <- sapply(urlEnlaces, is.null); |
Reemplazaremos los nulos por «NA» en la variable urlEnlaces, con:
1 |
urlEnlaces[urlEnlacesNulos] <- NA; |
Repetiremos el proceso para tituloEnlaces:
1 2 |
tituloEnlacesNulos <- sapply(tituloEnlaces, is.null); tituloEnlaces[tituloEnlacesNulos] <- NA; |
Convertimos las listas en vectores para mejorar el tratamiento posterior:
1 2 |
tituloEnlacesV <- unlist(tituloEnlaces); urlEnlacesV <- unlist(urlEnlaces); |
Ahora vamos a generar una tabla con ambos vectores:
1 |
enlaces <- data.frame(urlEnlacesV,tituloEnlacesV); |
Para mostrar el contenido de la tabla «enlaces», ejecutaremos:
1 |
View(enlaces) |
Obtener estadísticas e información a partir del scraping
Una vez obtenida la tabla enlaces, estudiaremos la información que contiene. Usaremos la librería dplyr:
1 |
library(dplyr); |
Por ejemplo, para obtener el número de veces que se repite cada enlace y guardar el resultado en la variable numVecesEnlace, usaremos:
1 |
numVecesEnlace <- enlaces %>% group_by(urlEnlacesV) %>% summarize(count=n()); |
Convertimos numVecesEnlace en data frame, le cambiamos el nombre a dfEnlaces:
1 |
dfEnlaces <- data.frame(numVecesEnlace); |
Ahora, supongamos que necesitamos obtener un data frame con la URL, el título de la URL y el número de veces que se repite. Para ello, uniremos el data frame dfEnlaces con el data frame enlaces, usando “merge”. Se unirán con join en la columna “urlEnlacesV” que es la columna coincidente en ambos:
1 |
dfEnlacesFinal <- merge(x = enlaces, y = dfEnlaces); |
Quedando una tabla (data frame), con el nombre dfEnlacesFinal, como la siguiente:
Para quitar posibles duplicados, y guardar el resultado en la variable dfEnlacesSDup, usaremos:
1 |
dfEnlacesSDup <- dfEnlacesFinal %>% distinct(urlEnlacesV,tituloEnlacesV,count); |