Bibliotecas

library(tidyverse)
library(readxl)
library(janitor)
library(DT)
library(rvest)

Funciones

source("../functions-R/clean_data_wikipedia.R")
source("../functions-R/clean_candidate.R")

Intención de voto

Web Scraping

  • Lectura de información contenida en la página web suministrada.
url <- "https://es.wikipedia.org/wiki/Anexo:Sondeos_de_intenci%C3%B3n_de_voto_para_las_elecciones_presidenciales_de_Colombia_de_2022"

web_info <- url %>% 
  read_html()
web_info
## {html_document}
## <html class="client-nojs" lang="es" dir="ltr">
## [1] <head>\n<meta http-equiv="Content-Type" content="text/html; charset=UTF-8 ...
## [2] <body class="mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-104 ns-subjec ...
  • Accediendo a la información que está en el nodo body.
web_info %>% 
  html_node("body")
## {html_node}
## <body class="mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-104 ns-subject mw-editable page-Anexo_Sondeos_de_intención_de_voto_para_las_elecciones_presidenciales_de_Colombia_de_2022 rootpage-Anexo_Sondeos_de_intención_de_voto_para_las_elecciones_presidenciales_de_Colombia_de_2022 skin-vector action-view skin-vector-legacy">
## [1] <div id="mw-page-base" class="noprint"></div>
## [2] <div id="mw-head-base" class="noprint"></div>
## [3] <div id="content" class="mw-body" role="main">\n\t<a id="top"></a>\n\t<di ...
## [4] <div id="mw-data-after-content">\n\t<div class="read-more-container"></di ...
## [5] <div id="mw-navigation">\n\t<h2>Menú de navegación</h2>\n\t<div id="mw-he ...
## [6] <footer id="footer" class="mw-footer" role="contentinfo"><ul id="footer-i ...
## [7] <script>(RLQ=window.RLQ||[]).push(function(){mw.config.set({"wgPageParseR ...
  • Se podría generar una base datos con la información de todas las tablas que están presentes en el body de la página web.
web_info %>% 
  html_node("body") %>% 
  html_table()
  • La aproximación anterior junta todas las tablas en un solo data.frame, pero como no todas las tablas tienen la misma estructura sería más fácil de manipular si se extraen de manera individual y luego se busca la manera correcta de unirlas.
lista_tablas <-
  web_info %>%
  html_table(header = TRUE)

lista_tablas <- lista_tablas[-c(1)]

data_encuestas <-
  lista_tablas %>%
  map(.f = clean_data) %>%
  bind_rows() %>%
  mutate(across(
    c(margen_de_error, alfredo_saade:rafael_nieto_loaiza),
    clean_candidate
  ),
  across(
    c(margen_de_error, alfredo_saade:rafael_nieto_loaiza),
    as.numeric
  ))

data_encuestas

Exportando datos

write_csv(x = data_encuestas, file = "../data/EncuestasWikipedia-Colombia2022.csv")