Código utilizado para hacer scraping de datos sobre precios de alimentos en Argentina

knitr::opts_chunk$set(echo = TRUE)

## Importo librerías
library(rvest)
library(tidyverse)
library(writexl)
library(gdata)
## Importo datos de alimentos

manteca<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
yogur<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
quesocrema<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
quesocremoso<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
quesorallado<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
leche<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
huevos<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
paleta<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
salame<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
higado<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
asado<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
carnaza<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
espinazo<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
paletacarne<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
carnepicada<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
nalga<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
pollo<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
pescado<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
manzana<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
naranja<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
banana<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
pera<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
acelga<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
cebolla<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
lechuga<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
tomate<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
zanahoria<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
zapallo<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
tomateenvasado<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
lentejas<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
arvejas<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
batata<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
papa<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
fideos<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
harinamaiz<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
harinatrigo<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
arroz<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
pan<-("url de la página del sitio web cuando se busca el alimento") %>% 
  read_html()
## Creo función para obtener los datos necesarios

funcion <- function(archivo){

  titulo <- archivo %>% 
    html_nodes(".span_productName div.descrip_full") %>% 
    html_text()

  precio <- archivo %>% html_nodes("div.product_info_container") %>%
    lapply(. %>% html_nodes("span.unit") %>% html_text() %>% 
             ifelse(identical(., character(0)), NA, .)) %>% unlist
  
  link <- archivo %>% 
    html_nodes("div.product_info_container a") %>% 
    html_attr("href")
  
  datos <- tibble(
    titulo = titulo,
    precio  = precio,
    link  = link,
    fecha =  Sys.Date()
  )
  
  return(datos) 
}

## Creo tablas

manteca<-funcion(manteca) %>% 
  mutate(categoria="manteca")
yogur<-funcion(yogur) %>% 
  mutate(categoria="yogur")
quesocrema<-funcion(quesocrema) %>% 
  mutate(categoria="queso cremoso")
quesocremoso<-funcion(quesocremoso)  %>% 
  mutate(categoria="queso cremoso")
quesorallado<-funcion(quesorallado) %>% 
  mutate(categoria="queso rallado")
leche<-funcion(leche) %>% 
  mutate(categoria="leche")
huevos<-funcion(huevos)  %>% 
  mutate(categoria="huevos")
paleta<-funcion(paleta)  %>% 
  mutate(categoria="paleta")
salame<-funcion(salame) %>% 
  mutate(categoria="salame")
higado<-funcion(higado) %>% 
  mutate(categoria="higado")
asado<-funcion(asado) %>% 
  mutate(categoria="asado")
carnaza<-funcion(carnaza) %>% 
  mutate(categoria="carnaza")
espinazo<-funcion(espinazo) %>% 
  mutate(categoria="espinazo")
paletacarne<-funcion(paletacarne)  %>% 
  mutate(categoria="paleta de carne")
carnepicada<-funcion(carnepicada) %>% 
  mutate(categoria="carne picada")
nalga<-funcion(nalga) %>% 
  mutate(categoria="nalga")
pollo<-funcion(pollo)  %>% 
  mutate(categoria="pollo")
pescado<-funcion(pescado) %>% 
  mutate(categoria="pescado")
manzana<-funcion(manzana) %>% 
  mutate(categoria="manzana")
naranja<-funcion(naranja) %>% 
  mutate(categoria="naranja")
banana<-funcion(banana) %>% 
  mutate(categoria="banana")
pera<-funcion(pera) %>% 
  mutate(categoria="pera")
acelga<-funcion(acelga) %>% 
  mutate(categoria="acelga")
cebolla<-funcion(cebolla) %>% 
  mutate(categoria="cebolla")
lechuga<-funcion(lechuga) %>% 
  mutate(categoria="lechuga")
tomate<-funcion(tomate) %>% 
  mutate(categoria="tomate")
zanahoria<-funcion(zanahoria) %>% 
  mutate(categoria="zanahoria")
zapallo<-funcion(zapallo) %>% 
  mutate(categoria="zapallo")
tomateenvasado<-funcion(tomateenvasado) %>% 
  mutate(categoria="tomate envasado")
lentejas<-funcion(lentejas)  %>% 
  mutate(categoria="lentejas")
arvejas<-funcion(arvejas)  %>% 
  mutate(categoria="arvejas")
batata<-funcion(batata) %>% 
  mutate(categoria="batata")
papa<-funcion(papa) %>% 
  mutate(categoria="papa")
fideos<-funcion(fideos)  %>% 
  mutate(categoria="fideos")
harinamaiz<-funcion(harinamaiz)  %>% 
  mutate(categoria="harina de maiz")
harinatrigo<-funcion(harinatrigo)  %>% 
  mutate(categoria="harina de trigo")
arroz<-funcion(arroz) %>% 
  mutate(categoria="arroz")
pan<-funcion(pan) %>% 
  mutate(categoria="pan")


## Uno tablas
productos<-rbind(manteca, yogur, quesocrema, quesocremoso, quesorallado, leche, huevos, paleta, salame, higado, asado, carnaza, espinazo, paletacarne, carnepicada, nalga, pollo,pescado,manzana,naranja,banana, pera, acelga, cebolla, lechuga, tomate, zanahoria, zapallo, tomateenvasado, lentejas, arvejas, batata, papa, fideos, harinamaiz, harinatrigo, arroz, pan)


## Limpio
# Título
productos$titulo<-gsub("\\,", "", productos$titulo) #elimino comas

# Precio
productos$precio<-gsub("\t", "", productos$precio) #elimino tabuladores
productos$precio<-gsub("\n", "", productos$precio) #elimino saltos de líneas
productos$unidad<-str_remove(productos$precio,":.*") #separo precio y unidad
productos$unidad<-str_remove(productos$unidad,"Precio por ") #elimino leyenda
productos$unidad[str_detect(productos$unidad,"1 Kilo") ] <-"1 Kilo" #homogenizo kilo y kilogramo

productos$unidad<-trim(productos$unidad) #elimino espacios del principio
productos$precio<-str_remove(productos$precio, ".*\\$") #elimino todo lo que está antes del precio
productos$precio<-gsub(" ", "", productos$precio) #elimino espacios

productos$precio<-gsub('\\.', '', as.character(productos$precio)) #elimino punto separador de miles
productos$precio<-str_replace(productos$precio, ",", ".") #reemplazo coma por punto como separados de decimales

productos$precio<-as.numeric(productos$precio) #paso a numérica la variable

productos<-productos %>% 
  mutate(precio=ifelse(unidad=="100 Gramos", precio *10, precio )) #unifico la unidad de medida
productos$unidad[str_detect(productos$unidad,"100 Gramos") ] <-"1 Kilo"

# Categoría
productos$categoria<-str_to_title(productos$categoria) #paso a mayúscula la primera letra

# Creo grupos de categorías
carnes<-c("Higado", "Asado", "Carnaza", "Espinazo", "Paleta De Carne", "Carne Picada", "Nalga", "Pollo", "Pescado")
verduras<-c("Acelga", "Cebolla", "Lechuga", "Tomate", "Zanahoria", "Zapallo", "Tomate Envasado", "Batata", "Papa")
frutas<-c("Manzana","Naranja", "Banana", "Pera")
legumbres<-c("Lentejas", "Arvejas")
fiambres<-c("Paleta", "Salame")
lacteos<-c("Manteca", "Yogur", "Queso Cremoso", "Queso Rallado", "Leche")
granos<-c("Harina De Maiz", "Harina De Trigo", "Arroz", "Fideos", "Pan")

productos$grupo<-NA
productos$grupo[productos$categoria %in% verduras ]<-"Verduras"
productos$grupo[productos$categoria %in% frutas]<-"Frutas"
productos$grupo[productos$categoria %in% carnes]<-"Carnes"
productos$grupo[productos$categoria %in% legumbres]<-"Legumbres"
productos$grupo[productos$categoria %in% fiambres]<-"Fiambres"
productos$grupo[productos$categoria %in% lacteos]<-"Lácteos"
productos$grupo[productos$categoria %in% granos]<-"Granos"
productos$grupo[productos$categoria == "Huevos"]<-"Huevos"

# Paso el valor del pollo que está en gramos a kilos
productos<-productos %>% 
  mutate(precio=ifelse(str_detect(titulo, "Gr") & categoria=="Pollo", (1000*precio)/as.numeric(gsub("[^\\d]+", "", titulo, perl=TRUE)) , precio))
productos$unidad[str_detect(productos$titulo, "Gr" ) & productos$categoria=="Pollo"]<-"1 Kilo"

# Elimino los pollos que pesan más de 1 kilo porque no está el valor por kilo sino por unidad y no sabemos cuantas unidades trae
productos<-productos[!(str_detect(productos$unidad, "1 Unidad") & productos$categoria=="Pollo"),]

# Paso las verduras que están por unidad y tienen información de los gramos por unidad a kilo
productos<-productos %>% 
  mutate(unidad=ifelse(str_detect(unidad,"1 Unidad") & grupo=="Verduras" & str_detect(titulo, "Gr"), as.numeric(gsub("[^\\d]+", "", titulo, perl=TRUE)), unidad))
productos<-productos %>% 
  mutate(precio=ifelse(str_detect(titulo, "Gr") & str_detect(unidad,"1 Unidad") & grupo=="Verduras", (1000*precio)/as.numeric(gsub("[^\\d]+", "", titulo, perl=TRUE)) , precio))
productos$unidad[str_detect(productos$titulo, "Gr") & productos$grupo=="Verduras" & str_detect(productos$unidad,"1 Unidad")]<-"1 Kilo"

# Elimino acelgas porque no sabemos cual es la medida
productos<-productos[!(str_detect(productos$unidad,"1 Unidad") & productos$categoria=="Acelga"),]

# Pongo en un grupo especial a los granos que están por unidad, son panificados
productos$grupo[productos$unidad=="1 Unidad" & productos$categoria=="Pan"]<-"Panificados"
# Exporto

write_xlsx(productos, paste("C:\\Users\\Julieta Coll\\Documents\\Portfolio\\alimentos", Sys.Date(), ".xlsx"))
## Analizando los datos en excel noto los outliers por lo que los elimino:

productos<-productos[!(productos$categoria=="Manteca" & productos$precio>=4500),]
productos<-productos[!(productos$categoria=="Queso Cremoso" & productos$precio>=2000),]
productos<-productos[!(productos$categoria=="Cebolla" & productos$precio>=4000),]
productos<-productos[!(productos$categoria=="Tomate Envasado" & productos$precio>=2000),]
productos<-productos[!(productos$categoria=="Lentejas" & productos$precio>=2000),]
productos<-productos[!(productos$categoria=="Fideos" & productos$precio>=3000),]

# Elimino si quedan filas en blanco 
productos<-productos[rowSums(is.na(productos)) != ncol(productos),]
# Exporto 

write_xlsx(productos, paste("C:\\Users\\Julieta Coll\\Documents\\Portfolio\\alimentos_limpio", Sys.Date(), ".xlsx"))