Web Scraping con R y RStudio
Scraping de Google News con R y Rvest
Dr. Agustín Nieto (INHUS-CONICET/UNMdP)
1º de julio de 2025
Centro de Estudios Andaluces
Google News es uno de los agregadores de noticias más grandes del mundo. Hacer scraping de esta fuente nos permite recolectar datos noticiosos de forma masiva y automatizada:
Consiste en descargar y analizar el código HTML de la página de resultados de Google News, tal como la ve un usuario en su navegador.
|
Consiste en consumir un feed de datos estructurado (XML) que Google News provee específicamente para sindicación de contenido.
|
Entender cómo se construyen las URLs es clave para automatizar las búsquedas.
URL para búsqueda directa (HTML):
https://news.google.com/search?q={término}&hl={idioma}&gl={país}
URL para Feeds RSS (XML):
https://news.google.com/rss/search?q={término}&hl={idioma}&gl={país}
Parámetros importantes:
q
: El término de búsqueda. Los espacios se codifican como
%20
o +
.
hl
: Idioma (ej. es
para español,
en-US
para inglés de EE.UU.).
gl
: Geolocalización (país, ej. AR
para
Argentina, US
para EE.UU.).
when
: Periodo de tiempo (ej. when:7d
para los
últimos 7 días).
Para el scraping directo, debemos “inspeccionar” la página y encontrar los selectores CSS o XPath que identifican de forma única los elementos que queremos extraer.
Pasos:
Elementos a buscar:
Usamos rvest
para leer el HTML y extraer los nodos. El
proceso básico es:
read_html()
para descargar la página.
html_elements()
para seleccionar los contenedores de cada
noticia.
# URL de búsqueda para "inteligencia artificial" en español para Argentina
url <- "https://news.google.com/search?q=inteligencia%20artificial&hl=es-419&gl=AR"
# 1. Leer el HTML de la página
pagina_html <- read_html(url, encoding = "UTF-8")
# 2. Identificar los contenedores de cada artículo
articulos <- html_elements(pagina_html, "article")
# 3. Extraer el título del primer artículo como ejemplo
articulos |> (\(x) x[[1]])() |> # Seleccionamos el primer artículo
html_element(".JtKRv") |> # Buscamos el enlace dentro de la clase JtKRv
html_text2() # Extraemos el texto
El scraping directo es frágil.
read_html
solo ve el HTML inicial, por lo que
puede que no vea todo el contenido. Para esto se necesitarían funciones
más complejas como read_html_live
.
RSS (Really Simple Syndication) es un formato de archivo basado en XML diseñado para compartir contenido actualizado, como noticias o posts de blogs.
¡Es una API no oficial y gratuita!
Ventajas para el Scraping:
La URL base para los feeds RSS es https://news.google.com/rss/search
. Podemos
añadir parámetros para personalizar la búsqueda de forma muy potente.
Ejemplo: Noticias sobre “RStudio” en las últimas 24 horas.
https://news.google.com/rss/search?q=RStudio+when:24h&hl=es-419&gl=AR
Podemos construir URLs dinámicamente en R para automatizar cualquier tipo de búsqueda.
xml2
En lugar de rvest
, usamos la librería xml2
,
que está optimizada para trabajar con archivos XML. La estructura de un
feed RSS es estándar.
El proceso con xml2
es:
1.
read_xml()
para descargar y parsear el feed.
2.
xml_find_all(“.//item”)
para obtener una lista de todas las
noticias.
3. xml_find_first()
y xml_text()
para extraer los datos de cada etiqueta (title
,
link
, etc.).
El código es más simple y predecible que el de scraping HTML.
# URL para noticias sobre "R-Project"
url_rss <- "https://news.google.com/rss/search?q=R-Project&hl=es-419&gl=AR"
# 1. Leer el XML
feed_xml <- read_xml(url_rss)
# 2. Encontrar todos los items de noticias
items <- xml_find_all(feed_xml, ".//item")
# 3. Extraer el título del primer item como ejemplo
items |> (\(x) x[[1]])() |> xml_find_first(".//title") |> xml_text()
Característica | Scraping directo (HTML) | Feeds RSS (XML) |
---|---|---|
Estabilidad | Baja (se rompe con cambios de diseño) | Alta (formato estándar y estable) |
Velocidad/Eficiencia | Lento (descarga HTML, CSS, JS) | Muy rápido (solo texto estructurado) |
Complejidad código | Alta (depende de selectores frágiles) | Baja (estructura predecible) |
Riesgo de bloqueo | Alto | Bajo (diseñado para máquinas) |
Riqueza de datos | Alta (acceso a todo lo visible) | Media (datos esenciales, no visuales) |
Recomendación | Usar solo si RSS no está disponible | Método preferido siempre que sea posible |
Una vez que tu script funciona, el siguiente paso es automatizarlo para que se ejecute periódicamente.
cronR
es una excelente interfaz para
gestionar cron jobs desde RStudio (en Linux/Mac).
readr::write_csv(…,
append = TRUE)
para añadir nuevos resultados a un archivo
existente.
DBI
y RSQLite
(o RPostgres
) para
guardar los datos en una base de datos SQL. Es más robusto y escalable.
Para asegurar que tus scripts sean robustos:
Sys.sleep()
entre llamadas para no sobrecargar el servidor.
for (query in queries) { Sys.sleep(2); … }
httr::user_agent()
en tus peticiones para identificarte.
try()
o tryCatch()
para que tu script no se
detenga si una petición falla.