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.
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
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.
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"))
}
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"))
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"))
}
como todo muestreo, la información recolectada puede presentar algunos inconvenientes por la forma en la cual fue recolectada:
Del universo de periódicos dominicanos sólo seleccionamos 5
Por cada periódico se diseñó un código para sacar la información, así si el la página presenta otro diseño en una noticia esta no pudo ser extraida. Aunque esto resultó ser la minoría es importante mencionarlo porque regularmente las noticas que fueron perjudicadas por esto son de temas en particular (Farandula, entretenimiento)
f