{html_document}
<html>
[1] <head>\n<meta http-equiv="Content-Type" content="text/html; charset=UTF-8 ...
[2] <body>\n <h1 id="first">Un encabezado</h1>\n <p>Algún texto & <b>te ...
Web Scraping y acceso a datos desde la web con R
30 de mayo de 2023
¿Cuál fue su motivación para tomar este curso?
¿Que tanto saben de la web?
Recordar algunas nociones de R que nos ayudarán en lo que sigue del curso.
Definición:
Capturar datos estructurados de una forma automatizada.
Si ya han copiado–&–pegado información de la web a un archivo, guardado imágenes o sonidos manualmente, ya hicieron web scraping.
Ahora queremos tener la capacidad de automatizar ese proceso.
Ej: Comparar precios en un sitio como Knasta.
¡Tanta información disponible!
Permite automatizar la captura de gran cantidad de datos.
Capacidad de complementar e integrar distintas fuentes de información.
Esta información no tiene que ser necesariamente pública.
Concluido el proceso, se obtiene información estructurada.
La web es desordenada.
Es posible requerir de mucho procesamiento luego de obtenido los datos.
Considerar aspectos éticos y legales.
Precios
Propiedades
Análisis de mercado
Finanzas
Noticias y contenido
Identificar un sitio web de interés.
Localizar las URLs en donde esté la información que queramos extraer.
Pedir la información con esos URLs al servidor recibir los datos.
Localizar la información específica que interesa guardar.
Estructurar la información para guardarla en un archivo.
Sistema de análisis integrado.
Luego de adquirir datos, podemos rápidamente seguir con su limpieza y análisis estadístico.
importar -> manipular -> modelar -> visualizar -> comunicar
¿Cómo trabajar con listas en R?
¿Qué es una página web? ¿Cómo entender html
?
¿Qué es una API?
¿Qué librerías podemos usar para aprovechar APIs de servicios web?
¿Cuáles son las consideraciones a tener en cuenta?
Será eminentemente práctico.
Combina un protocolo de intercambio de datos —http
— para el intercambio de información.
La información intercambiada puede ser cualesquiera.
Se intercambian mensajes individuales: el cliente envía mensaje, el servidor responde.
Para mantener una sesión de comunicación se usan cookies y encabezados.
Fuente: https://developer.mozilla.org
Se ven las capas de protocolos que componen la web.
Es extensible: se pueden construir servicios unos sobre otros.
Para nuestro interés nos interesa la parte superior: html
, css
, API
y javascript
.
Fuente: https://developer.mozilla.org
html
(HyperText Markup Language): provee el contenido que nos gustaría obtener.
css
(Cascading Style Sheets): controla la forma en que se muestra ese contenido.
Podemos usar reglas de formatos para seleccionar el contenido de la página.
APIs
(Application Programming Interface): permite pedirle a un servidor información específica de nuestro interés.
javascript
: faculta a que una página web contenga y ejecute programas (¡wordle!).
Hay ocasiones que es ese programa el que pide, procesa y/o muestra los datos que nos interesa.
Fuente: https://developer.mozilla.org
Una página web tiene una estructura jerárquica.
Elementos: tags como title
o p
que parten y terminan
Atributos: id
o class
Contenido: Lo que queda dentro de los elementos.
Elementos de html
h#
: encabezados. Niveles de h1
a h6
p
: párrafos
img
: imagen.
src
(no tiene cierre)table
: tablas
a
: link (anchor).
href
<br>
: salto de línea (no tiene cierre)
Leamos la página web que hemos revisado.
{html_document}
<html>
[1] <head>\n<meta http-equiv="Content-Type" content="text/html; charset=UTF-8 ...
[2] <body>\n <h1 id="first">Un encabezado</h1>\n <p>Algún texto & <b>te ...
Capturamos el contenido de la página.
Capturamos el contenido de la página.
<body>
{html_node}
<body>
[1] <h1 id="first">Un encabezado</h1>
[2] <p>Algún texto & <b>texto en negrita</b>.</p>
[3] <img src="../images/dog.jpg" width="100" height="100">
<p>
{html_node}
<p>
[1] <b>texto en negrita</b>
Capturamos el contenido de la página.
id = first
[1] "Un encabezado"
src
dentro de elemento img
[1] "../images/dog.jpg"
src width height
"../images/dog.jpg" "100" "100"
Referencia de funciones en rvest a tener en cuenta:
xlm2::read_html()
: función exportada por rvest para leer páginas web.
html_attr()
html_attrs()
: extraemos atributos
html_children()
: extrae elementos bajo cierto nodo
html_element()
html_elements()
: extrae elementos
html_name()
: extrae el nombre de elementos
html_table()
: extrae y transforma a una data frame una tabla html
html_text()
html_text2()
: extrae texto o contenido
[1] "h1" "p" "img"
Recaudación y crítica según datos en Wikipedia.
List of 8
$ : tibble [16 × 7] (S3: tbl_df/tbl/data.frame)
$ : tibble [31 × 6] (S3: tbl_df/tbl/data.frame)
$ : tibble [5 × 7] (S3: tbl_df/tbl/data.frame)
$ : tibble [49 × 10] (S3: tbl_df/tbl/data.frame)
$ : tibble [25 × 17] (S3: tbl_df/tbl/data.frame)
$ : tibble [17 × 6] (S3: tbl_df/tbl/data.frame)
$ : tibble [13 × 8] (S3: tbl_df/tbl/data.frame)
$ : tibble [14 × 4] (S3: tbl_df/tbl/data.frame)
Hay 8 tablas en la página.
Interesa la tabla 6 de recaudación
# A tibble: 3 × 6
Película Estreno Recaudación (en dóla…¹ Recaudación (en dóla…²
<chr> <chr> <chr> <chr>
1 Película Estreno Estados Unidos Resto del mundo
2 Star Wars: Episode IV -… 25 de … 460.998.507 314.513.557
3 Star Wars: Episode V - … 21 de … 290.271.960 257.607.494
# ℹ abbreviated names: ¹`Recaudación (en dólares)`, ²`Recaudación (en dólares)`
# ℹ 2 more variables: `Recaudación (en dólares)` <chr>,
# `Recaudación (en dólares)` <chr>
y tabla 7 de evaluación.
# A tibble: 3 × 8
Película `Rotten Tomatoes` `Rotten Tomatoes` `Rotten Tomatoes` Metacritic
<chr> <chr> <chr> <chr> <chr>
1 Película General Top Critics Audiencia Metacritic
2 A New Hope 93 % (113 reseña… 90 % (39 reseñas) 96 % 92 (24 re…
3 Empire Strik… 94 % (90 reseñas… 88 % (24 reseñas) 97 % 82 (25 re…
# ℹ 3 more variables: IMDb <chr>, FilmAffinity <chr>, CinemaScore <chr>
Modifiqué nombres de películas para posteriormente unir ambas bases.
# A tibble: 12 × 6
Película Estreno `Estados Unidos` `Resto del mundo` Total `NA`
<chr> <chr> <int> <int> <int> <lgl>
1 A New Hope 25 de … 460998507 314513557 7.76e8 NA
2 Empire Strikes Back 21 de … 290271960 257607494 5.48e8 NA
3 Return of the Jedi 25 de … 309306177 166040934 4.75e8 NA
4 The Phantom Menace 19 de … 474544677 552538030 1.03e9 NA
5 Attack of the Clones 16 de … 310676740 338759618 6.49e8 NA
6 Revenge of the Sith 19 de … 380270577 488765058 8.68e8 NA
7 <NA> 15 de … 35161554 33121290 6.83e7 NA
8 The Force Awakens 18 de … 936662225 1132561399 2.07e9 NA
9 Rogue One 10 de … 532177324 523879949 1.06e9 NA
10 The Last Jedi 15 de … 620181382 714358507 1.33e9 NA
11 Solo 25 de … 213767512 179157295 3.93e8 NA
12 The Rise of Skywalker 20 de … 515202543 561941706 1.08e9 NA
# A tibble: 11 × 8
Película General `Top Critics` Audiencia Metacritic IMDb FilmAffinity
<chr> <int> <int> <int> <int> <chr> <chr>
1 A New Hope 93 90 96 92 8.6 7.9
2 Empire Strikes… 94 88 97 82 8.8 8.1
3 Return of the … 80 76 94 58 8.3 7.9
4 The Phantom Me… 55 41 59 51 6.5 6.2
5 Attack of the … 66 40 57 54 6.6 6.3
6 Revenge of the… 80 67 66 68 7.6 7.1
7 The Force Awak… 93 89 88 81 7.9 6.9
8 Rogue One 84 76 86 65 7.8 6.9
9 The Last Jedi 90 95 43 84 7.0 6.1
10 Solo 70 61 63 62 6.9 6.0
11 The Rise of Sk… 51 48 86 53 6.6 5.8
# ℹ 1 more variable: CinemaScore <chr>
Uniremos ambas tablas.
Presentación y código en GitHub:
https://github.com/caayala/web_scraping_soc40XX_2023
https://caayala.github.io/web_scraping_soc40XX_2023
¡Gracias!
Cristián Ayala
https://blog.desuc.cl/
http://github.com/caayala
DESUC Web Scraping, 2023