1 Proyecto Basurometro:

1.1 1. Objetivo

1.2 2. Motivacion

1.3 3. Fuentes:

  • Pagina oficial del estado peruano
  • SUNAT
  • OSCE
# install.packages(c('rvest', 'dplyr'))
library(dplyr)
library(purrr)
library(rvest)

# Extraccion de las entidades a scrapear
entidades_estado_peruano <- 
  rvest::read_html('https://www.gob.pe/estado/poder-ejecutivo') %>% 
  rvest::html_elements(xpath = "//*[@class='w-full grid md:grid-cols-6 grid-cols-3 items-center bg-blue-100 mb-0 rounded-t p-1 gap-1 border-blue-100 border']") %>% 
  rvest::html_nodes('a') %>% 
  rvest::html_attr('href')

# Funcion para extraer las subentidades para cadad entidad
extraer_subentidades <- function(entidad) {
  url <- paste0('https://www.gob.pe', entidad)
  tryCatch(
    url %>%
      rvest::read_html() %>%
      rvest::html_nodes('p a') %>%
      rvest::html_attr('href'),
    error = function(e) NULL
  )
}

# Funcion para extraer los miembros de cada subentidad
extraer_miembros <- function(subentidad, entidad) {
  resultados <- list()
  
  for (pagina in 1:100) {
    url <- paste0('https://www.gob.pe/institucion', subentidad, '/funcionarios?sheet=', pagina)
    
    miembros <- tryCatch(
      url %>%
        rvest::read_html() %>%
        rvest::html_elements(xpath = "//*[@class='flex flex-col w-full p-6']"),
      error = function(e) NULL
    )
    
    if (length(miembros) == 0) break
    
    aux_miembros <- miembros %>%
      rvest::html_elements('img') %>%
      rvest::html_attrs() %>%
      unlist() %>%
      unname()
    
    nombres <- aux_miembros[seq(1, length(aux_miembros), 4)]
    cargos <- miembros %>% rvest::html_elements('p') %>% rvest::html_text2()
    url_imagen <- aux_miembros[seq(4, length(aux_miembros), 4)]
    
    resultados[[pagina]] <- dplyr::tibble(
      entidad = entidad,
      subentidad = subentidad,
      nombre = nombres,
      cargo = cargos,
      url_imagen = url_imagen
    )
  }
  
  dplyr::bind_rows(resultados)
}

# Funcion de extraccion principal (3): (1) + (2)
extraer_datos_entidades <- function(entidades) {
  entidades_scrap <- purrr::map(entidades, extraer_subentidades)
  entidades_scrap <- stats::setNames(entidades_scrap, entidades)
  
  resultados <- purrr::map_df(entidades, function(entidad) {
    subentidades <- entidades_scrap[[entidad]]
    if (is.null(subentidades)) return(dplyr::tibble())
    
    purrr::map_df(subentidades, extraer_miembros, entidad = entidad)
  })
  
  resultados
}

# Extrayendo todos los miembros que componen el estado peruano
df_miembros_estado_peruano <- extraer_datos_entidades(entidades_estado_peruano)

# Proyccion a tabla visual
df_miembros_estado_peruano %>%
  DT::datatable(
    extensions = 'Buttons',
    rownames = F,
    filter = 'top',
    caption = 'Miembros del estado peruano',
    options = list(dom = 'Bfrtip',
                   buttons = list('excel', "csv")))
LS0tDQp0aXRsZTogIlByb3lfQmFzdXJvbWV0cm8iDQphdXRob3I6ICJDYXJsb1ZlZ2FfRGFuaU1hcmF2aV9NaWd1ZWxFY2hldmVycmUiDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogMg0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6ICJoaWRlIg0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBULCBtZXNzYWdlID0gRiwgZXJyb3IgPSBGLCB3YXJuaW5nID0gRikNCmBgYA0KDQojIFByb3llY3RvIEJhc3Vyb21ldHJvOg0KDQojIyAxLiBPYmpldGl2bw0KDQojIyAyLiBNb3RpdmFjaW9uDQoNCiMjIDMuIEZ1ZW50ZXM6DQotIFBhZ2luYSBvZmljaWFsIGRlbCBlc3RhZG8gcGVydWFubw0KLSBTVU5BVA0KLSBPU0NFDQoNCmBgYHtyIGV4dHJhY2Npb25fbm9tYnJlc195X2NhcmdvcyB9DQoNCiMgaW5zdGFsbC5wYWNrYWdlcyhjKCdydmVzdCcsICdkcGx5cicpKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkocHVycnIpDQpsaWJyYXJ5KHJ2ZXN0KQ0KDQojIEV4dHJhY2Npb24gZGUgbGFzIGVudGlkYWRlcyBhIHNjcmFwZWFyDQplbnRpZGFkZXNfZXN0YWRvX3BlcnVhbm8gPC0gDQogIHJ2ZXN0OjpyZWFkX2h0bWwoJ2h0dHBzOi8vd3d3LmdvYi5wZS9lc3RhZG8vcG9kZXItZWplY3V0aXZvJykgJT4lIA0KICBydmVzdDo6aHRtbF9lbGVtZW50cyh4cGF0aCA9ICIvLypbQGNsYXNzPSd3LWZ1bGwgZ3JpZCBtZDpncmlkLWNvbHMtNiBncmlkLWNvbHMtMyBpdGVtcy1jZW50ZXIgYmctYmx1ZS0xMDAgbWItMCByb3VuZGVkLXQgcC0xIGdhcC0xIGJvcmRlci1ibHVlLTEwMCBib3JkZXInXSIpICU+JSANCiAgcnZlc3Q6Omh0bWxfbm9kZXMoJ2EnKSAlPiUgDQogIHJ2ZXN0OjpodG1sX2F0dHIoJ2hyZWYnKQ0KDQojIEZ1bmNpb24gcGFyYSBleHRyYWVyIGxhcyBzdWJlbnRpZGFkZXMgcGFyYSBjYWRhZCBlbnRpZGFkDQpleHRyYWVyX3N1YmVudGlkYWRlcyA8LSBmdW5jdGlvbihlbnRpZGFkKSB7DQogIHVybCA8LSBwYXN0ZTAoJ2h0dHBzOi8vd3d3LmdvYi5wZScsIGVudGlkYWQpDQogIHRyeUNhdGNoKA0KICAgIHVybCAlPiUNCiAgICAgIHJ2ZXN0OjpyZWFkX2h0bWwoKSAlPiUNCiAgICAgIHJ2ZXN0OjpodG1sX25vZGVzKCdwIGEnKSAlPiUNCiAgICAgIHJ2ZXN0OjpodG1sX2F0dHIoJ2hyZWYnKSwNCiAgICBlcnJvciA9IGZ1bmN0aW9uKGUpIE5VTEwNCiAgKQ0KfQ0KDQojIEZ1bmNpb24gcGFyYSBleHRyYWVyIGxvcyBtaWVtYnJvcyBkZSBjYWRhIHN1YmVudGlkYWQNCmV4dHJhZXJfbWllbWJyb3MgPC0gZnVuY3Rpb24oc3ViZW50aWRhZCwgZW50aWRhZCkgew0KICByZXN1bHRhZG9zIDwtIGxpc3QoKQ0KICANCiAgZm9yIChwYWdpbmEgaW4gMToxMDApIHsNCiAgICB1cmwgPC0gcGFzdGUwKCdodHRwczovL3d3dy5nb2IucGUvaW5zdGl0dWNpb24nLCBzdWJlbnRpZGFkLCAnL2Z1bmNpb25hcmlvcz9zaGVldD0nLCBwYWdpbmEpDQogICAgDQogICAgbWllbWJyb3MgPC0gdHJ5Q2F0Y2goDQogICAgICB1cmwgJT4lDQogICAgICAgIHJ2ZXN0OjpyZWFkX2h0bWwoKSAlPiUNCiAgICAgICAgcnZlc3Q6Omh0bWxfZWxlbWVudHMoeHBhdGggPSAiLy8qW0BjbGFzcz0nZmxleCBmbGV4LWNvbCB3LWZ1bGwgcC02J10iKSwNCiAgICAgIGVycm9yID0gZnVuY3Rpb24oZSkgTlVMTA0KICAgICkNCiAgICANCiAgICBpZiAobGVuZ3RoKG1pZW1icm9zKSA9PSAwKSBicmVhaw0KICAgIA0KICAgIGF1eF9taWVtYnJvcyA8LSBtaWVtYnJvcyAlPiUNCiAgICAgIHJ2ZXN0OjpodG1sX2VsZW1lbnRzKCdpbWcnKSAlPiUNCiAgICAgIHJ2ZXN0OjpodG1sX2F0dHJzKCkgJT4lDQogICAgICB1bmxpc3QoKSAlPiUNCiAgICAgIHVubmFtZSgpDQogICAgDQogICAgbm9tYnJlcyA8LSBhdXhfbWllbWJyb3Nbc2VxKDEsIGxlbmd0aChhdXhfbWllbWJyb3MpLCA0KV0NCiAgICBjYXJnb3MgPC0gbWllbWJyb3MgJT4lIHJ2ZXN0OjpodG1sX2VsZW1lbnRzKCdwJykgJT4lIHJ2ZXN0OjpodG1sX3RleHQyKCkNCiAgICB1cmxfaW1hZ2VuIDwtIGF1eF9taWVtYnJvc1tzZXEoNCwgbGVuZ3RoKGF1eF9taWVtYnJvcyksIDQpXQ0KICAgIA0KICAgIHJlc3VsdGFkb3NbW3BhZ2luYV1dIDwtIGRwbHlyOjp0aWJibGUoDQogICAgICBlbnRpZGFkID0gZW50aWRhZCwNCiAgICAgIHN1YmVudGlkYWQgPSBzdWJlbnRpZGFkLA0KICAgICAgbm9tYnJlID0gbm9tYnJlcywNCiAgICAgIGNhcmdvID0gY2FyZ29zLA0KICAgICAgdXJsX2ltYWdlbiA9IHVybF9pbWFnZW4NCiAgICApDQogIH0NCiAgDQogIGRwbHlyOjpiaW5kX3Jvd3MocmVzdWx0YWRvcykNCn0NCg0KIyBGdW5jaW9uIGRlIGV4dHJhY2Npb24gcHJpbmNpcGFsICgzKTogKDEpICsgKDIpDQpleHRyYWVyX2RhdG9zX2VudGlkYWRlcyA8LSBmdW5jdGlvbihlbnRpZGFkZXMpIHsNCiAgZW50aWRhZGVzX3NjcmFwIDwtIHB1cnJyOjptYXAoZW50aWRhZGVzLCBleHRyYWVyX3N1YmVudGlkYWRlcykNCiAgZW50aWRhZGVzX3NjcmFwIDwtIHN0YXRzOjpzZXROYW1lcyhlbnRpZGFkZXNfc2NyYXAsIGVudGlkYWRlcykNCiAgDQogIHJlc3VsdGFkb3MgPC0gcHVycnI6Om1hcF9kZihlbnRpZGFkZXMsIGZ1bmN0aW9uKGVudGlkYWQpIHsNCiAgICBzdWJlbnRpZGFkZXMgPC0gZW50aWRhZGVzX3NjcmFwW1tlbnRpZGFkXV0NCiAgICBpZiAoaXMubnVsbChzdWJlbnRpZGFkZXMpKSByZXR1cm4oZHBseXI6OnRpYmJsZSgpKQ0KICAgIA0KICAgIHB1cnJyOjptYXBfZGYoc3ViZW50aWRhZGVzLCBleHRyYWVyX21pZW1icm9zLCBlbnRpZGFkID0gZW50aWRhZCkNCiAgfSkNCiAgDQogIHJlc3VsdGFkb3MNCn0NCg0KIyBFeHRyYXllbmRvIHRvZG9zIGxvcyBtaWVtYnJvcyBxdWUgY29tcG9uZW4gZWwgZXN0YWRvIHBlcnVhbm8NCmRmX21pZW1icm9zX2VzdGFkb19wZXJ1YW5vIDwtIGV4dHJhZXJfZGF0b3NfZW50aWRhZGVzKGVudGlkYWRlc19lc3RhZG9fcGVydWFubykNCg0KIyBQcm95Y2Npb24gYSB0YWJsYSB2aXN1YWwNCmRmX21pZW1icm9zX2VzdGFkb19wZXJ1YW5vICU+JQ0KICBEVDo6ZGF0YXRhYmxlKA0KICAgIGV4dGVuc2lvbnMgPSAnQnV0dG9ucycsDQogICAgcm93bmFtZXMgPSBGLA0KICAgIGZpbHRlciA9ICd0b3AnLA0KICAgIGNhcHRpb24gPSAnTWllbWJyb3MgZGVsIGVzdGFkbyBwZXJ1YW5vJywNCiAgICBvcHRpb25zID0gbGlzdChkb20gPSAnQmZydGlwJywNCiAgICAgICAgICAgICAgICAgICBidXR0b25zID0gbGlzdCgnZXhjZWwnLCAiY3N2IikpKQ0KDQpgYGANCg0KDQo=