En el siguiente documento, se facilita el código para realizar el rascado web.

Abrir librerías

library(httr)
library(jsonlite)
library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union

Abrir clave API (SerpAPI)

api_key <- "a02926af6a93d7cd1ce8ee2e984cf3c84250eea5573adbf16db7dad45d84e9b9"

Palabras clave

keywords <- c("cortina de humo", "manipulación mediática", "chivo expiatorio", "distracción masiva", "pantalla de humo")

Muestreo de periodicos

medios <- c("milenio.com", "eluniversal.com.mx", "reforma.com", "excelsior.com.mx", "eleconomista.com.mx", "elfinanciero.com.mx", "jornada.com.mx")

Función para buscar

buscar_noticias <- function(keyword) {
  url <- "https://serpapi.com/search.json"
  
  respuesta <- GET(url, query = list(
    engine = "google_news",
    q = keywords,  
    hl = "es",
    gl = "mx",
    api_key = api_key
  ))
  
  datos <- fromJSON(content(respuesta, "text", encoding = "UTF-8"))
  
  if (!is.null(datos$news_results)) {
    noticias <- datos$news_results
    return(nrow(noticias))
  } else {
    return(0)
  }
}

Función para contar

buscar_noticias <- function(keyword) {
  url <- "https://serpapi.com/search.json"
  
  respuesta <- GET(url, query = list(
    engine = "google_news",
    q = keyword,
    hl = "es",
    gl = "mx",
    api_key = api_key
  ))
  
  datos <- fromJSON(content(respuesta, "text", encoding = "UTF-8"))
  
  if (!is.null(datos$news_results)) {
    noticias <- as.data.frame(datos$news_results) 
    
    noticias_filtradas <- noticias %>%
      filter(grepl(paste(medios, collapse = "|"), link))
    
    return(nrow(noticias_filtradas))
  } else {
    return(0)
  }
}

Aplicar la función a cada palabra clave

conteo_resultados <- sapply(keywords, buscar_noticias)

Resultados

conteo_df <- data.frame(
  Palabra_clave = keywords,
  Numero_de_noticias = conteo_resultados
)