Clase 1: Introducción

Web Scraping y acceso a datos desde la web con R


Cristián Ayala
Director DESUC

30 de mayo de 2023

Expectativas y nivelación

  • ¿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.

Recomendaciones iniciales

  • Instalar R 4.3: Uso la nueva pipe base en mis ejemplos (|>)
    • Cuidado. Será necesario re–instalar todos los paquetes.
  • Instalar la última versión de RStudio.
    • Soporte para |> y mejoras varias.
  • Acceder a repositorio de GitHub para acceder a material de clases y ejercicios.

Introducción

¿Por qué web scraping?

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.

¿Por qué web scraping?

¡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.

¿Para que se usa el web scraping?

  1. Precios

  2. Propiedades

  3. Análisis de mercado

  4. Finanzas

  5. Noticias y contenido

Usos de web scraping

¿Cuál es el proceso de un web scraping?

  1. Identificar un sitio web de interés.

  2. Localizar las URLs en donde esté la información que queramos extraer.

  3. Pedir la información con esos URLs al servidor recibir los datos.

  4. Localizar la información específica que interesa guardar.

  5. Estructurar la información para guardarla en un archivo.

¿Por qué con R?

  • 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

el anillo del poder

¿Qué veremos en este curso?

  • ¿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.

Mago de Oz

Clase 1

¿Qué es una página web?

  • 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.

An overview of HTTP

¿Qué es una página web? Componentes

  • 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.

An overview of HTTP

¿Qué es una página web? Componentes

  • 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.

An overview of HTTP

¿Cómo es una página html?

Título de página

Un encabezado

Algún texto & texto en negrita.

<!DOCTYPE html>
<html>
<head>
    <title>Título de página</title>
</head>
<body>
  <h1 id='first'>Un encabezado</h1>
  <p>Algún texto &amp; <b>texto en negrita</b>.</p>
  <img src='./images/dog.jpg' width='100' height='100'>
</body>
</html>

¿Cómo es una página html? Jerarquía

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.

<!DOCTYPE html>
<html>
<head>
    <title>Título de página</title>
</head>
<body>
  <h1 id='first'>Un encabezado</h1>
  <p>Algún texto &amp; <b>texto en negrita</b>.</p>
  <img src='./images/dog.jpg' width='100' height='100'>
</body>
</html>

¿Cómo es una página html? Elementos

Elementos de html

  • Los elementos se abren y cierran, en general
<tagname>Contenido…</tagname>
  • h#: encabezados. Niveles de h1 a h6

  • p: párrafos

  • img: imagen.

    • Requiere el atributo src (no tiene cierre)
  • table: tablas

  • a: link (anchor).

    • Requiere el atributo href
  • <br>: salto de línea (no tiene cierre)

<!DOCTYPE html>
<html>
<head>
    <title>Título de página</title>
</head>
<body>
  <h1 id='first'>Un encabezado</h1>
  <p>Algún texto &amp; <b>texto en negrita</b>.</p>
  <img src='./images/dog.jpg' width='100' height='100'>
</body>
</html>

HTML Elements

Nuestro primer scraping

Nuestro primer scraping: lectura de contenido

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 &amp; <b>te ...

Capturamos el contenido de la página.

Nuestro primer scraping: extraer elementos

Capturamos el contenido de la página.

  • El <body>
{html_node}
<body>
[1] <h1 id="first">Un encabezado</h1>
[2] <p>Algún texto &amp; <b>texto en negrita</b>.</p>
[3] <img src="../images/dog.jpg" width="100" height="100">
  • El párrafo <p>
{html_node}
<p>
[1] <b>texto en negrita</b>

Nuestro primer scraping: extraer elementos

Capturamos el contenido de la página.

  • El texto del elemento identificado con id = first
[1] "Un encabezado"
  • El link a la imágen. Atributo src dentro de elemento img
[1] "../images/dog.jpg"
  • Todos los atributos relacionados con la imagen.
                src               width              height 
"../images/dog.jpg"               "100"               "100" 

Librerías: rvest

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"

Starwars

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.

Starwars: tablas con datos

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>

Starwars: recaudación

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   

Starwars: critica

# 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>

Starwars: recaudación y crítica

Uniremos ambas tablas.

En el próximo taller …

  • Manejo de listas con purrr

  • Manejo de expresiones regulares con stringr

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