Llamar/instalar las librerías para esta sesión:
## llamar la librería pacman: contiene la función p_load()
require(pacman)## Loading required package: pacman
## p_load llama/instala-llama las librerías que se enlistan:
p_load(tidyverse, # contiene las librerías ggplot, dplyr...
rvest)# web-scrapingWeb scrapin es una técnica usada para automatizar los procesos de extracción de información de sitios web, como tablas, textos o link a otras páginas. ¿Por qué hacer web-scraping?
El robots exclusion standard, también
conocido como protocolo de exclusión para
robots o simplemente robots.txt, es un
protocolo estándar usado en algunos sitios web para comunicarse con
buscadores y otros robots en la web. Este protocolo le indica a los
buscadores o robots web sobre las partes de ese sitio web que no
deben/pueden procesarse o escanearse. Veamos
algunos ejemplos de robots.txt:
Ejemplo 1: permite a cualquier robots procesar/escanear todos los elementos de la pagína
# robots.txt for https://example.com/
|
|---|
User-agent: *
|
Disallow:
|
Ejemplo 2: no permite procesar/escanear ningún elemento de la pagína
# robots.txt for https://example.com/
|
|---|
User-agent: *
|
Disallow: /
|
Ejemplo 3: no permite procesar/escanear ningún elemento del archivo /public/index.html
# robots.txt for https://example.com/
|
|---|
User-agent: *
|
Disallow: /public/index.html
|
Ejemplo 4: no le permite al robot BadBot
procesar/escanear ningún elemento de la pagína:
# robots.txt for https://example.com/
|
|---|
User-agent: BadBot
|
Disallow: /
|
Puede accederse al protocolo de exclusión de una página agregando
robots.txt al dominio principal de la página. Por ejemplo
https://example.com/robots.txt
## Acceder al robots.txt de wikipedia
browseURL("https://en.wikipedia.org/robots.txt")Un Hyper Text Markup Language no es un lenguaje de programación, sino más bien un lenguaje de marcado de hipertexto. Un HTML se escribe en su totalidad con elementos, los que a su vez están constituidos por etiquetas, contenido y atributos (mas adelante veremos que es cada uno de ellos). Los elementos están estructurados como un árbol (tronco, ramas, hojas). Por tanto, para poder extraer un elemento (por ejemplo una hoja), se rastrear la ruta del nodo o etiqueta (indicarle el tronco y la rama que contiene la hoja). Los HTML son interpretados por los navegadores web visualizando su contenido (una página web por ejemplo) tal y como estamos acostumbrados a verlo. Puede acceder al HTML de una página web así:
Un elemento esta compuesto por una etiqueta <p>,
atributos id="texto" (no siempre contiene atributos) y el
contenido Hola mundo. Por ejemplo:
<p id="texto"> Hola mundo </p>
Las etiquetas sirven para delimitar el inicio
(< >) y el final (<\ >) de un
elemento. Aquí puede observar algunas etiquetas de elementos comunes en
HTML:
<p>: Párrafos<head>: Encabezado de la pagina<body>: Cuerpo de la pagina<h1>, <h2>,...,<hi>: Encabezados,
Secciones<a>: links<li>: Ítem en una lista<table>: Tablas<td>: Una celda de datos en una tabla<div>: División. Sirve para crear secciones o
agrupar contenidos.<script>: Se utiliza para insertar o hacer
referencia a un scriptPor otra parte, los atributos sirven para configurar o proveer información adicional a un elemento. Siempre se expresan en la etiqueta de inicio y tienen asignado un nombre y un valor. Por ejemplo:
<a class="document-toc-link" col="red">Lista de Atributos</a>
Aquí la etiqueta del elemento es a y tiene dos atributos
class que indica que el contenido es un link a otro sitio
web y col que indica que debe visualizarce de color
rojo.
Ya puedes escribir tu primer HTML. Intente copiar el siguiente código y ejecutarlo sobre la consola de R:
my_html <-
'<!DOCTYPE html>
<html>
<meta charset="utf-8">
<head>
<title> Título de la página: ejemplo de clase </title>
</head>
<body>
<h1> Title 1.</h1>
<h2> Subtitle <u>subrayado-1</u>. </h2>
<p> Este es un párrafo muy pequeño que se encuentra dentro de la etiqueta <b>p</b> de <i>html</i> </p>
</body>
</html>'Ahora va escribir/guardar el objeto my_html como un
archivo .html y lo va a leer con el navegador de su
equipo:
write.table(x=my_html , file='my_page.html' , quote=F , col.names=F , row.names=F)
browseURL("my_page.html") ## leer con el navegador de su equipoSu navegador interpretará el archivo my_page.html y debe
visualizar lo siguiente:
Note: intente sobrescriba el objeto
my_html agregando un elemento h1 en el que
escriba su nombre y ubiquelo después del elemento p.
Ejecute el código nuevamente y vea como cambió el html.
rvestrvest es una librería que contiene un conjunto de
funciones para raspar (o recolectar) datos desde páginas web estaticas
usando R. Puede ver una introducción a web escraping con
rvest escribiendo sobre la consola:
vignette("rvest")## starting httpd help server ... done
my_url = "https://es.wikipedia.org/wiki/Copa_Mundial_de_F%C3%BAtbol"
browseURL(my_url) ## Ir a la páginamy_html = read_html(my_url) ## leer el html de la página
class(my_html) ## ver la clase del objeto## [1] "xml_document" "xml_node"
View(my_html)Usted puede usar la etiqueta de un elemento para extraer todo los elementos de ese tipo en el html:
## Obtener los elementos h2 de la página
my_html %>% html_elements("h2")## {xml_nodeset (13)}
## [1] <h2 id="mw-toc-heading">Índice</h2>\n
## [2] <h2><span class="mw-headline" id="Historia">Historia</span></h2>
## [3] <h2>\n<span id="Caracter.C3.ADsticas"></span><span class="mw-headline" i ...
## [4] <h2>\n<span id="Resultados_y_estad.C3.ADsticas"></span><span class="mw-h ...
## [5] <h2><span class="mw-headline" id="Premios">Premios</span></h2>
## [6] <h2><span class="mw-headline" id="Impacto_cultural">Impacto cultural</sp ...
## [7] <h2>\n<span id="Tecnolog.C3.ADa"></span><span class="mw-headline" id="Te ...
## [8] <h2>\n<span id="V.C3.A9ase_tambi.C3.A9n"></span><span class="mw-headline ...
## [9] <h2><span class="mw-headline" id="Notas">Notas</span></h2>
## [10] <h2><span class="mw-headline" id="Referencias">Referencias</span></h2>
## [11] <h2>\n<span id="Bibliograf.C3.ADa"></span><span class="mw-headline" id=" ...
## [12] <h2><span class="mw-headline" id="Enlaces_externos">Enlaces externos</sp ...
## [13] <h2>Menú de navegación</h2>
Los elementos h2 contiene las subsesiones de la página.
Puede extraer el texto de cada elemento usando la función
html_text()
## Ver los textos
my_html %>% html_elements("h2") %>% html_text()## [1] "Índice" "Historia"
## [3] "Características" "Resultados y estadísticas"
## [5] "Premios" "Impacto cultural"
## [7] "Tecnología" "Véase también"
## [9] "Notas" "Referencias"
## [11] "Bibliografía" "Enlaces externos"
## [13] "Menú de navegación"
¿Cómo se puede extraer un elemento especifico de un
HTML?. El lenguaje Xpath (XML Path Language) es el
sistema que permite construir expresiones usadas para recorrer y
consultar los elementos de un documento XML. Es decir, un
XPath permite buscar un elemento teniendo en cuenta la
estructura jerárquica del XML.
Por el ejemplo, para obtener el
elemento marcado con un recuadro rojo, el
xpath le indica a
R cuál es el camino que debe recorrer para extraer ese elemento. Puede
obtener el xpath inspeccionando el elemento así:
Para extraer el nodo que contiene el primer párrafo, usted puede
extraer el xpath de ese parrafo
('//*[@id="mw-content-text"]/div/p[1]') y usar la función
html_nodes() para extraer el elemento:
my_html %>% html_nodes(xpath = '//*[@id="mw-content-text"]/div/p[1]')## {xml_nodeset (1)}
## [1] <p>La <b>Copa Mundial de la <a href="/wiki/FIFA" title="FIFA">FIFA</a></b ...
Para exraer el texto del elemento, puede emplear la función
html_text() nuevamente:
my_html %>% html_nodes(xpath = '//*[@id="mw-content-text"]/div/p[1]') %>%
html_text() ## [1] "La Copa Mundial de la FIFA, también conocida como Copa Mundial de Fútbol, Copa del Mundo o simplemente Mundial, cuyo nombre original fue Campeonato Mundial de Fútbol, es el principal torneo internacional oficial de fútbol masculino a nivel de selecciones nacionales en el mundo.[n 1]\n"
## extraer todas las tablas del html
my_table = my_html %>% html_table()
## numero de tablas extraidas
length(my_table)## [1] 12
my_table[[11]]## # A tibble: 4 × 4
## `Copa Mundial` Selección `Autor del gol` Rival
## <chr> <chr> <chr> <chr>
## 1 Alemania 2006 ARG Argentina Maxi Rodríguez MEX México
## 2 Sudáfrica 2010 URU Uruguay Diego Forlán GER Alemania
## 3 Brasil 2014 COL Colombia James Rodríguez URU Uruguay
## 4 Rusia 2018 FRA Francia Benjamin Pavard ARG Argentina
Nota: tambien puede usar el nombre del elemento
(table) para extraer las tablas del html.
Si quiere usar la etiqueta del elemento para extraer solo los elementos que
sub_html = my_html %>% html_nodes(xpath='//*[@id="mw-content-text"]/div[1]/table[10]/tbody')
class(sub_html)## [1] "xml_nodeset"
Extraer los elementos con que contiene links a otras páginas:
elements = sub_html %>% html_nodes("a")
elements[1:5]## {xml_nodeset (5)}
## [1] <a href="/wiki/Archivo:Flag_of_Germany.svg" class="image" title="Bandera ...
## [2] <a href="/wiki/Copa_Mundial_de_F%C3%BAtbol_de_2006" title="Copa Mundial d ...
## [3] <a href="/wiki/Archivo:Flag_of_Argentina.svg" class="image" title="Bander ...
## [4] <a href="/wiki/Selecci%C3%B3n_de_f%C3%BAtbol_de_la_Argentina" class="mw-r ...
## [5] <a href="/wiki/Maxi_Rodr%C3%ADguez" title="Maxi Rodríguez">Maxi Rodríguez ...
Extraer el atributo titel:
titles = elements %>% html_attr("title")
titles[1:5]## [1] "Bandera de Alemania" "Copa Mundial de Fútbol de 2006"
## [3] "Bandera de Argentina" "Selección de fútbol de la Argentina"
## [5] "Maxi Rodríguez"
Extraer el atributo href que contiene la url a las
referencias:
refs = elements %>% html_attr("href")
refs[1:5]## [1] "/wiki/Archivo:Flag_of_Germany.svg"
## [2] "/wiki/Copa_Mundial_de_F%C3%BAtbol_de_2006"
## [3] "/wiki/Archivo:Flag_of_Argentina.svg"
## [4] "/wiki/Selecci%C3%B3n_de_f%C3%BAtbol_de_la_Argentina"
## [5] "/wiki/Maxi_Rodr%C3%ADguez"
puede crear un objeto que contenga la url de la página y el contenido de la url:
db = tibble(titles,url=paste0("https://es.wikipedia.org",refs))
db %>% head()## # A tibble: 6 × 2
## titles url
## <chr> <chr>
## 1 Bandera de Alemania https://es.wikipedia.org/wiki/Archivo:Fla…
## 2 Copa Mundial de Fútbol de 2006 https://es.wikipedia.org/wiki/Copa_Mundia…
## 3 Bandera de Argentina https://es.wikipedia.org/wiki/Archivo:Fla…
## 4 Selección de fútbol de la Argentina https://es.wikipedia.org/wiki/Selecci%C3%…
## 5 Maxi Rodríguez https://es.wikipedia.org/wiki/Maxi_Rodr%C…
## 6 Bandera de México https://es.wikipedia.org/wiki/Archivo:Fla…
puede navegar hasta la url de Bandera de Alemania y ver el contenido de la url:
browseURL(db$url[1])Munzert, Simon et al., 2015. Automated Data Collection with R: A Practical Guide to Web Scraping and Text Mining [Ver aquí]