Juan Corporán y un servidor nos dimos a la tarea de extraer noticias de los periódicos dominicanos. El motivo para hacerlo varía pero por nombrar algunos queríamos contestar preguntas tales como:

Nuestro objetivo final es el de publicar este repositorio de forma que las personas puedan tener acceso y hacer el análisis que les plazca. Las diferentes tablas ya se encuentran disponibles en github. También tenemos pensado hacer un hackaton con esta información.

Resumen de la información disponible

En este primer momento se trabajaron 5 periódicos obteniendo más de trece mil noticias. De cada noticia se obtuvo la fecha de publicación, el título y el contenido en si mismo.

dia <- read.csv("https://raw.githubusercontent.com/Pedromoisescamacho/periodicos-dominicanos/master/noticias%20csv/dia_noticias.csv", stringsAsFactors = F)[,-1]
libre <- read.csv("https://raw.githubusercontent.com/Pedromoisescamacho/periodicos-dominicanos/master/noticias%20csv/diario_libre_noticias.csv", stringsAsFactors = F)[,-1]
hoy <- read.csv("https://raw.githubusercontent.com/Pedromoisescamacho/periodicos-dominicanos/master/noticias%20csv/hoy_noticias.csv", stringsAsFactors = F)[,-1]
listin <- read.csv("https://raw.githubusercontent.com/Pedromoisescamacho/periodicos-dominicanos/master/noticias%20csv/listin_diario_noticias.csv" , stringsAsFactors = F)[,-1]
nacional <- read.csv("https://raw.githubusercontent.com/Pedromoisescamacho/periodicos-dominicanos/master/noticias%20csv/nacional_noticias.csv" , stringsAsFactors = F)[,-1]
(total_not <- sapply(list("El Dia" = dia, "Diario Libre" = libre, "Hoy" = hoy, "Listin Diario" = listin, "El Nacional" = nacional), function(x) dim(x)[1]))
##        El Dia  Diario Libre           Hoy Listin Diario   El Nacional 
##          2281          2317          3180          3493          1797

¿Como extraer información de las noticias?

Para una explicación más básica de como extraer información de una página web con R, ver mi post anterior al respecto. A continuación se mostrarán las funciones utiizadas para sacar el contenido, fecha y titulo de las noticias. Estos son ejemplos de la extructura, dado que para cada periodico se debió cambiar ligeramente.

Luego de que las siguientes funciones fueran creadas, se aplicó la función sapply() para cada URL de cada periódico.

Función para el contenido

Lo más complicado de esta función es lobrar que envié un error cuando la conexión sea incorrecta. Esto es importante porque cuando aplicamos la función sapply() para cada URL, esta función se detiene si la conexión falla.

contenido <- function(url){
        content <- function(url){
                noticia <- read_html(url) #leyendo y cargando el HTML
                contenido <- noticia %>% html_nodes("#layout-column_column-4 p") %>% html_text %>% 
                        as.list() %>% do.call(what = paste)
                contenido <- ifelse(identical(contenido, character(0)), "NULL", contenido) #NULL si el contenido viene vacio
                contenido
        }
        return(tryCatch(content(url), error = function(e) "NULL"))
}

Función para el Título

El título fue la información más estandar a través de los periódicos, por lo que al aplicar el sapply, no ocurrieron muchos inconvenientes.

titulo <- function(url){
        title <- function(url){
                noticia <- read_html(url)
                title <- noticia %>% html_nodes("title") %>% html_text %>% 
                        as.list() %>% do.call(what = paste)
                title <- ifelse(identical(title, character(0)), "NULL", title)
                title
        }
        return(tryCatch(title(url), error = function(e) "NULL"))

Función para la fecha

Para la fecha no ocurrieron muchos inconvenientes durante la extracción. no obstante el extraido no tiene un formato de fecha común, por lo que se debe de formatear según el string de fecha que traiga cada periódico

fecha <- function(url){
        title <- function(url){
                noticia <- read_html(url)
                pattern <- "[0-9].*M"
                fecha_cruda <- noticia %>% html_nodes(".art-date") %>% html_text
                fecha <- regmatches(fecha_cruda, regexpr(pattern, fecha_cruda)) #%>%  as.POSIXct(format = "%d %b %Y, %H:%M %p")
                fecha <- ifelse(identical(fecha, character(0)), "NULL", fecha)
                fecha
        }
        return(tryCatch(title(url), error = function(e) "NULL"))
}

Algunas salvedades sobre la data

como todo muestreo, la información recolectada puede presentar algunos inconvenientes por la forma en la cual fue recolectada:

f