Introducción y recomendaciones

Este es un pequeño ejemplo de Web Scraping realizado con R que desea mostrar de manera breve y sencilla la extracción de información de un sitio web para realizar, en este caso una sencilla nube de palabras.

El sitio web del cual se extraerá la información es Google News para Colombia. Si desea aplicar este mismo ejemplo para otro páis, basta con cambiar la URL por la que corresponda al país del cual desea obtener información.

Hay temas que no se profundizan en este documento que considero son importantes para realizar web scraping, como los elementos de html con los cuales se crean las páginas web, ya que con ellos podemos acceder a través del código.

Se debe leer con atención la información que se puede extraer de la web en cuestión.

Se puede validar el nivel de web scraping que se puede hacer de una página web a través de paquetes que hay disponibles en R (polite), los cuales también hay en Python. De esta manera podemos saber lo que se puede extraer del sitio.

Algunos paquetes para hacer web scraping con R y Python son rvest y scrapy respectivamente.

Cada página web, define la información que desea compartir o dejar libre para que se pueda hacer web scrapping.

Siempre es importante hacer la validación de la información que puede ser extraída para no incurrir en acciones ilegales.

Con los perfiles de desarrollador que tienen las redes sociales es posible hacer web scraping en los sitios web de estas redes.

Algunos problemas de autenticación en redes sociales, hacen un poco más complejo el web scraping de estos sitios.

Uno de los paquetes para hacer web scraping en Twitter con R es `rtweet``.

A tener en cuenta

Estándar de exclusión de robots.

El estándar de exclusión de robots, también conocido como el protocolo de la exclusión de robots o protocolo de robots.txt, es un método para evitar que ciertos bots que analizan los sitios web u otros robots que investigan todo o una parte del acceso de un sitio Web, público o privado, agreguen información innecesaria a los resultados de búsqueda. Los robots son de uso frecuente por los motores de búsqueda para categorizar archivos de los sitios Webs, o por los webmasters para corregir o filtrar el código fuente.

Cada página web tiene un protocolo robots.txt, al cual se puede acceder a través desde la URL principal del sitio web seguido del protocolo robots.txt.

Para este caso en particular de Google News, podemos validar la información a la cual podemos acceder digitando en el navegador la URL principal del sitio web seguido del protocolo robots.txt, de esta manera obtenemos la información que se nos permite extraer de manera libre.

https://news.google.com/robots.txt

ATENCIÓN: leer detenidamente la información contenida en el archivo robots.txt que esté habilitada para realizar la extracción sin tener inconvenientes.

¿Qué es el Web Scraping?

Web scraping o raspado web, es una técnica utilizada mediante programas de software para extraer información de sitios web​ Usualmente, estos programas simulan la navegación de un humano en la World Wide Web ya sea utilizando el protocolo HTTP manualmente, o incrustando un navegador en una aplicación.

El web scraping está muy relacionado con la indexación de la web, la cual indexa la información de la web utilizando un robot y es una técnica universal adoptada por la mayoría de los motores de búsqueda. Sin embargo, el web scraping se enfoca más en la transformación de datos sin estructura en la web (como el formato HTML) en datos estructurados que pueden ser almacenados y analizados en una base de datos central, en una hoja de cálculo o en alguna otra fuente de almacenamiento. Alguno de los usos del web scraping son la comparación de precios en tiendas, la monitorización de datos relacionados con el clima de cierta región, la detección de cambios en sitios webs y la integración de datos en sitios webs. También es utilizado para obtener información relevante de un sitio a través de los rich snippets.

Bibliotecas necesarias

library(tidyverse) # para manipular datos
library(rvest)     # permite realizar web scraping
library(polite)    # verificación de robots.txt para web scraping
library(lubridate) # tabajar con datos tipo fecha
library(wordcloud) # Crear nubes de palabras
library(tidytext)  # Manejo de datos tipo texto 
library(tm)        # Manejo de texto StopWords
library(jcolors)   # Configuración de colores

Scraping desde Google Noticias

Con el paquete polite es posible validar si la URL del sitio web permite realizar web scraping.

El paquete polite y la función bow() ayuda a verificar si el sitio web es “scrapable”, es decir que podemor extraer información información del mismo.

url_colombia <-
  "https://news.google.com/topics/CAAqJggKIiBDQkFTRWdvSUwyMHZNREZzY3pJU0JtVnpMVFF4T1NnQVAB?hl=es-419&gl=CO&ceid=CO%3Aes-419"

url_colombia %>% 
  bow()
## <polite session> https://news.google.com/topics/CAAqJggKIiBDQkFTRWdvSUwyMHZNREZzY3pJU0JtVnpMVFF4T1NnQVAB?hl=es-419&gl=CO&ceid=CO%3Aes-419
##     User-agent: polite R package
##     robots.txt: 22 rules are defined for 2 bots
##    Crawl delay: 5 sec
##   The path is scrapable for this user-agent

Títulos de las noticias

En el momento de realizar el ejercicio, esta era la portada de las noticias de Google para Colombia.

Elementos html

Haciendo click derecho en cualquier punto de la página, seleccionamos del menú desplgeado la opción inspeccionar, la cual abre la consola del navegador donde se presenta el código html, css, etcétera, con el cual está construido la página. Navegando a través de este código podemos detectar los elementos de interés que deseamos extraer del sitio web, como por ejemplo el título de la noticia, la fuente de la noticia o el tiempo en la que fué publicada.

Estos elementos poseen un nombre que los identifica dentro de la página; estos nombres son los que tomará nuestro código R para extraer la información.

Extrayendo títulos de las noticias

titulo_noticia <-
  url_colombia %>%
  read_html() %>%
  html_elements("body") %>%
  html_elements("a.WwrzSb")  %>%
  html_attr("aria-label")

titulo_noticia %>% head(n = 10)
##  [1] "Lo último | Reversazo: pico y placa en Bogotá ya no cambiará cada cuatro meses"                                                     
##  [2] "Claudia López se echa para atrás y le hará nuevo cambio al pico y placa, en Bogotá"                                                 
##  [3] "Alcaldía de Bogotá confirmó que el reversazo en el pico y placa se debió al inconformismo de la gente: “Escuchamos a la ciudadanía”"
##  [4] "Atención, Bogotá: Pico y placa ya no cambiará cada cuatro meses"                                                                    
##  [5] "Viajeros: así serán los reversibles y otras medidas para el puente de Reyes"                                                        
##  [6] "¿Cuáles son las medidas para entrar a Bogotá este lunes festivo del puente de Reyes?"                                               
##  [7] "Movilidad en puente de reyes: pico y placa regional en Cundinamarca"                                                                
##  [8] "Conozca las vías habilitadas para el plan retorno del puente de Reyes en Bogotá"                                                    
##  [9] "Inflación en Colombia: estas son las cinco ciudades más costosas para vivir en el país"                                             
## [10] "Inflación del 13,12%: estas son las ciudades más caras para vivir en Colombia"

Extrayendo fuente de la noticia

fuente_noticia <- 
  url_colombia %>% 
  read_html() %>% 
  html_elements("body") %>% 
  html_elements("div.MCAGUe") %>% 
  html_text()

fuente_noticia %>% head(n = 4)
## [1] "Revista SemanaMás" "Pulzo.comMás"      "Revista SemanaMás"
## [4] "El TiempoMás"

Extrayendo tiempo de publicación de la noticia

hora_noticia <-
  url_colombia %>%
  read_html() %>%
  html_elements("body") %>%
  html_elements("div.UOVeFe") %>%
  html_text()

hora_noticia %>% head(n = 3)
## [1] "Hace 4 horas" "Hace 4 horas" "Hace 2 horas"

Tabla de Noticias

Después de obtener la información de interés se crea una tabla los datos de las noticias extraídas.

Con la función Sys.time obtenemos la hora del sistema, en la que fué extraída o consultada la información.

df_noticias_col <-
  data.frame(
    titulo = titulo_noticia,
    fuente = fuente_noticia,
    hora = hora_noticia,
    fecha_consulta = Sys.time()
  )

df_noticias_col

Se realiza la edición de la hora para cambiar los dos puntos y los reemplace por el guión. (Con el objetivo de que esto no genere errores en el guardado de la información).

fecha_hora_consulta <- Sys.time() %>% 
  as.character() %>% 
  str_replace_all(pattern = ":", replacement = "-")

fecha_hora_consulta
## [1] "2023-01-06 14-54-32"
write_csv(df_noticias_col, file = str_c("ejemplo_web_scrap",
                                        fecha_hora_consulta, ".csv"))

Nubes de palabras

Stop words es español

La función a continuación, extrae palabras de caracter “no informativo”, como conectores y palabras que no son relevantes en el texto.

stop_words_spanish <- data.frame(word = stopwords("spanish"))

Gráfico

En este caso se analizará a nivel de palabra el texto, es decir que nuestro enegrama será de uno, también es posible hacer análisis sobre enegramas de más de una palabra.

ngrama <-
  df_noticias_col %>%
  select(titulo) %>%
  # desanida el texto completo por palabra n = 1
  unnest_tokens(output = "word", titulo, token = "ngrams", n = 1) %>%
  # elimina las stopwords (palabras NO informativas)
  anti_join(stop_words_spanish) %>%
  # conteo del número de veces que aparece cada palabra
  count(word)

Nube de palabras

wordcloud(
  words = ngrama$word,
  freq = ngrama$n,
  max.words = 100,
  random.order = FALSE,
  colors = jcolors("pal3")
)