Extracciòn de Datos

Las empresas extraen datos de paginas web para investigar por qué los clientes no compran sus productos o cuando se lanza una campaña de marketing pero necesitan saber qué quieren sus clientes. Tambien en el lanzamiento de un nuevo producto pero antes se necesita conocer ciertos detalles y sólo los consumidores pueden ayudar a obtener esta información. En estos y otros casos se necesita recolectar datos parta realizar una adecuada investigacion del mercado.

Web Scraping

Datos Estructurados

Cuando hablamos de datos estructurados nos referimos a la información que se suele encontrar en la mayoría de bases de datos. Son archivos de tipo texto que se suelen mostrar en filas y columnas con títulos. Son datos que pueden ser ordenados y procesados fácilmente por todas las herramientas de minería de datos. Lo podríamos ver como si fuese un archivador perfectamente organizado donde todo está identificado, etiquetado y es de fácil acceso.

Web Scraping

Datos no estructurados (Unstructured Data):

Los datos no estructurados, generalmente son datos binarios que no tienen estructura interna identificable. Es un conglomerado masivo y desorganizado de varios objetos que no tienen valor hasta que se identifican y almacenan de manera organizada. Una vez que se organizan, los elementos que conforman su contenido pueden ser buscados y categorizados (al menos hasta cierto punto) para obtener información.

Ejemplos de datos no estructurados generados por el hombre:

Ejemplos de datos no estructurados generados por la maquina:

Web Scraping

Datos semiestructurados (Semistructured Data):

Los datos semiestructurados son una forma de datos estructurados que no obedecen a la estructura tabular de los modelos de datos asociados con bases de datos relacionales u otras formas de tablas de datos , pero que, no obstante, contienen etiquetas u otros marcadores para separar elementos semánticos y hacer cumplir las jerarquías de registros y campos dentro de los datos. Por lo tanto, también se conoce como estructura autodescriptiva . En los datos semiestructurados, las entidades que pertenecen a la misma clase pueden tener diferentes atributos aunque estén agrupadas, y el orden de los atributos no es importante.

Los datos semiestructurados son una mezcla de los dos anteriores, como por ejemplo los formatos HTML, XML o JSON.
Web Scraping

Importar archivos de datos con formato utilizando las funciones del paquete foreign

Usando la opcion Packages de R Studio se descargo la libreria Foreign. Este paquete permite leer y escribir archivos existentes de otros formatos de EpiInfo, Minitab, S, SAS, SPSS, Stata, Systat y Weka.

install.packages("foreign", dependencies= TRUE)

A continuación un ejemplo para importar un archivo con formato Stata llamado binary.dta:

library(foreign)
url = 'http://stats.idre.ucla.edu/stat/stata/dae/binary.dta'
tmpfile <- tempfile()
download.file(url, tmpfile)
DpiData <- read.dta(url)  
head(DpiData,5)
##   admit gre  gpa rank
## 1     0 380 3.61    3
## 2     1 660 3.67    3
## 3     1 800 4.00    1
## 4     1 640 3.19    4
## 5     0 520 2.93    4

A continuación un ejemplo para importar un archivo csv, para lo cual se uso la funcion read.table:

library(foreign)
test.csv1 <- read.table("https://opendata.arcgis.com/datasets/c1291407e4b94d2f9e56aae929f6a677_0.csv", header=T, sep=",")
print(test.csv1)
##   ï..OBJECTID    ZONIFICACI  Area_Has Shape__Area Shape__Length
## 1           1 Conservación 471.81789   4718178.9      53642.39
## 2           2   Producción 153.17005   1531700.5      36491.44
## 3           3 Recuperación  60.30636    603063.6      18414.12
## 4           4 Restauración 197.89350   1978935.0      53659.87

Ahora un ejemplo para importar un archivo txt:

library(foreign)
notas <- read.table('http://verso.mat.uam.es/~joser.berrendero/datos/notas.txt', sep = ' ', dec = ',', header=TRUE)
head(notas,5)
##         tipo nota09 nota10
## 1 concertado   9.34  8.520
## 2    publico   9.24  5.960
## 3 concertado   9.17  5.460
## 4    privado   9.14  7.925
## 5    publico   9.09  6.400

Exportar archivos usando la función write.table

La función write.table genera archivos de datos con un formato. Ejemplo de uso de la funcion write.table: write.table imprime su argumento requerido x (después de convertirlo en un marco de datos si no es uno ni una matriz) en un archivo o conexión.

library(tidyverse)
library(rvest)
library(stringr)
write.table(test.csv1, "a.txt", row.names=F, quote=F)
print(test.csv1)
##   ï..OBJECTID    ZONIFICACI  Area_Has Shape__Area Shape__Length
## 1           1 Conservación 471.81789   4718178.9      53642.39
## 2           2   Producción 153.17005   1531700.5      36491.44
## 3           3 Recuperación  60.30636    603063.6      18414.12
## 4           4 Restauración 197.89350   1978935.0      53659.87

Web Scraping

El raspado web, la recolección web o la extracción de datos web es el raspado de datos que se utiliza para extraer datos de sitios web. El software de raspado web puede acceder a la World Wide Web directamente utilizando el Protocolo de transferencia de hipertexto o mediante un navegador web. Si bien un usuario de software puede realizar el raspado web manualmente, el término generalmente se refiere a procesos automatizados implementados mediante un bot o un rastreador web . Es una forma de copia, en la que se recopilan y copian datos específicos de la web, generalmente en una base de datos local central u hoja de cálculo, para su posterior recuperación.o análisis .

Web Scraping

Web Scraping Ejemplo:

Inicialmente se va a extraer los nombres de los productos. Para ello se descargo “Selector Gadget” (extension de Chrome), el cual facilmente se lo descarga desde google chrome. Para despues activarlo en la pagina de la cual se va a tomar los datos. Finalmente se halla el codigo y se lo usa para extraer los nombres de los productos.

Parte 1

library(tidyverse)
library(rvest)
library(stringr)
base_url <- "https://listado.mercadolibre.com.ec/canasta-basica#D[A:canasta%20basica]"
webpage <- read_html(base_url)
canciones <- html_nodes(webpage, ".ui-search-item__title")
canciones <- as.character(html_text(canciones))
canciones
##  [1] "Canastas Navideñas Al Por Mayor Y Menor. Fundas De Caramelos"
##  [2] "Harina Pan Bulto Original Importada Por Dibeal"              
##  [3] "Queso Crema 4 Kilos Tony"                                    
##  [4] "Canastas Navideñas"                                          
##  [5] "Viveres, Artículos De Limpieza, Aseo, Bioseguridad"          
##  [6] "Canasta Navideña Tipo Premium"                               
##  [7] "Canastas Navideñas"                                          
##  [8] "Canasta Navideña Tipo Familiar"                              
##  [9] "Canastas Navideñas"                                          
## [10] "Canastas Navideñas."                                         
## [11] "Vendo Minimarket "                                           
## [12] "Pavo Navideño"                                               
## [13] "Pescado Lija Filetes "                                       
## [14] "Tilapia Roja Prelavada"                                      
## [15] "Productos Navideños "                                        
## [16] "Productos Navideños "                                        
## [17] "Producto Navideño "                                          
## [18] "Producto Navideño"                                           
## [19] "Recargas Electronicas, Pago Servicios Basicos"               
## [20] "Recargas Electrónicas, Servicios Básicos, Catálogos +200serv"
## [21] "Disco Duro Externo 1 Tb Toshiba, Usb 3.0, Pequeño"           
## [22] "Teclado Gamer Rgb Usb Meetion Mecanico Basic Mk007 Español"  
## [23] "Tomacorriente Inteligente Wifi Smart Plug Alexa"             
## [24] "Audifonos Xiaomi Mi True Wireless Earphones 2 Basic Global"  
## [25] "Memoria Ram Ddr3 8gb 1600 Ddr4 4gb 8gb 16g 2666 Sodimm Udimm"
## [26] "15 Cursos Excel Desde Lo Básico Hasta Vba Y Macros"          
## [27] "Combo Gamer Basico Audifono Teclado Mouse Mousepad Rgb"      
## [28] "Disco Duro Externo Toshiba  Canvio Basic 1 Tera 1tb 1 Tb"    
## [29] "Audífonos Inalámbricos Xiaomi / Earbuds"                     
## [30] "Xiaomi Earbuds Basic 2 Originales  Combo Ecco Tipo Jbl"      
## [31] "Sonoff Basic R3 Wifi Wireless Switch Domotica Alexa Google H"
## [32] "Xiaomi Mi Earbuds Basic 2 Redmi Airdots 2 Global Auriculares"
## [33] "Audifonos Xiaomi Bluetooth Earbuds Basic 2 / Quito Y Ambato" 
## [34] "Be Kit Raspberry 4b Modulo 2gb Basic Oficial Made In Uk"     
## [35] "Celular Hyundai D265n Mp4 2 Sim Micro Sd Camara Radio Fm Bt" 
## [36] "Cpu Nuevo Básico Estudiantil"                                
## [37] "Camisetas Para Campaña"                                      
## [38] "Xiaomi Eardbuds Basic 2 Audifonos Bluetooth Sellados Origina"
## [39] "Xiaomi Mi Piston Headphones Basic Los Mejores Audífonos"     
## [40] "Sistema De Facturación Farmacia Básico"                      
## [41] "Juego Quirurgico Cirugia Básica, Implementos Médicos 9pzas"  
## [42] "Kindle Básico Ultima Generación"                             
## [43] "Aprende A Elaborar Formulas Químicas Productos De Limpieza " 
## [44] "Controles Remotos Para Tv  Westinghouse Smartv Y Basicos"    
## [45] "Hidrolavadora Karcher K2 Basic"                              
## [46] "Ltc Computador Basic Amd Ryzen 3 3200g 3,6ghz (1tb-4gb-dvd)" 
## [47] "Disco Duro Externo Toshiba 1tb Ultra Slim Usb 3.0, New Model"
## [48] "Xiaomi Mi Piston Headphones Basic Los Mejores Audífonos"     
## [49] "Cortadora Laser Para Fomi Titan A3 Basic 2,5w 30x40cm Mdf"   
## [50] "Gafas De Protección Nemesis Basic Seguridad Industrial"

Tambien el codigo para la extraccion del tipo de moneda en que se venden los productos:

library(tidyverse)
library(rvest)
library(stringr)
base_url <- "https://listado.mercadolibre.com.ec/canasta-basica#D[A:canasta%20basica]"
webpage <- read_html(base_url)

canciones <- html_nodes(webpage, ".price-tag-symbol")
canciones <- as.character(html_text(canciones))
canciones
##  [1] "U$S" "U$S" "U$S" "U$S" "U$S" "U$S" "U$S" "U$S" "U$S" "U$S" "U$S" "U$S"
## [13] "U$S" "U$S" "U$S" "U$S" "U$S" "U$S" "U$S" "U$S" "U$S" "U$S" "U$S" "U$S"
## [25] "U$S" "U$S" "U$S" "U$S" "U$S" "U$S" "U$S" "U$S" "U$S" "U$S" "U$S" "U$S"
## [37] "U$S" "U$S" "U$S" "U$S" "U$S" "U$S" "U$S" "U$S" "U$S" "U$S" "U$S" "U$S"

Finalmente el codigo para la extraccion del valor de los productos:

library(tidyverse)
library(rvest)
library(stringr)
base_url <- "https://listado.mercadolibre.com.ec/canasta-basica#D[A:canasta%20basica]"
webpage <- read_html(base_url)
canciones <- html_nodes(webpage, ".price-tag-fraction")
canciones <- as.character(html_text(canciones))
canciones
##  [1] "15"  "27"  "23"  "15"  "24"  "30"  "20"  "30"  "12"  "1"   "8"   "5"  
## [13] "2"   "2"   "18"  "11"  "18"  "22"  "60"  "38"  "11"  "44"  "25"  "9"  
## [25] "30"  "71"  "31"  "39"  "14"  "36"  "28"  "124" "12"  "275" "1"   "29" 
## [37] "8"   "299" "14"  "120" "4"   "10"  "99"  "379" "69"  "8"   "650" "5"

Parte 2

Entonces se va a buscar en google precios de un producto al azar como es la cerveza y se lo va a almacenar al alcance de un analisis matematico con R Studiovde esta manera obteniendose una forma de acceso mas practico:

producto = " precio de la cerveza" 
html_dir = paste0("https://www.google.com/","search?q=categorias+supermercado+licores+cerveza+",gsub(" ","+",producto))
google = read_html(html_dir)
lirica = google %>% 
  html_nodes('div div div div div div div div ')
# length(lirica) = 34
for(i in 27:34)
print(cat(html_text(lirica[i])))
## Precio: L. Agregar. Impuestos. 0. No apto para menores de 21 años. Cervezas- Licores-y-Vinos-Cervezas-Cerveza-Botella_7501064191398_3.jpg. Comparar.NULL
## Precio: L. Agregar. Impuestos. 0. No apto para menores de 21 años. Cervezas- Licores-y-Vinos-Cervezas-Cerveza-Botella_7501064191398_3.jpg. Comparar.NULL
## 593 CERVEZA LAGER PREMIUM ECUADOR 330 ML. $1.50. Añadir al carrito · becks_6 · CERVEZA BECKS SIX PACK. $9.00. Añadir al carrito.NULL
## 593 CERVEZA LAGER PREMIUM ECUADOR 330 ML. $1.50. Añadir al carrito · becks_6 · CERVEZA BECKS SIX PACK. $9.00. Añadir al carrito.NULL
## http://www.tiendasmetro.co/supermercado/vinos-y-licores/cervezas. Cervezas. 63 productos. Más vendido, Mejor descuento, Mayor precio, Menor precio, A - Z ...NULL
## http://www.tiendasmetro.co/supermercado/vinos-y-licores/cervezas. Cervezas. 63 productos. Más vendido, Mejor descuento, Mayor precio, Menor precio, A - Z ...NULL
## Si no te gusta el estado de un producto, ¡no lo pagas! Categorías. Restaurantes · Tiendas y supermercados · Farmacia · Rappi mall ...NULL
## Si no te gusta el estado de un producto, ¡no lo pagas! Categorías. Restaurantes · Tiendas y supermercados · Farmacia · Rappi mall ...NULL

Segunda estrategia de busqueda

Se va a usar otra estrategia para la busqueda de datos en google:

busqueda = "top costos de cervezas en ecuador"
news_pag = "https://news.google.com/"
html_dir = paste0(news_pag,"search?q=",gsub(" ","+",busqueda),"&hl=es-419&gl=US&ceid=US:es-419")
google_news = read_html(html_dir)
noticias = google_news %>% 
  html_nodes(css = "c-wiz div div div div main c-wiz div div div article")

news_pag = "https://news.google.com/"
noticia = noticias[[3]]
titular = noticia %>% html_node("h3") %>% html_text()
fecha = noticia %>% html_node("time") %>% html_attr("datetime")
diario = noticia %>% html_node("a.wEwyrc.AVN2gc.uQIVzc.Sksgp") %>% html_text()
link_enmascarado = noticia %>% html_node("h3 a") %>% html_attr("href")
link_enmascarado = paste0(news_pag,substring(link_enmascarado,3))  
link_enmascarado = read_html(link_enmascarado)
link = link_enmascarado %>% 
  html_node(css='c-wiz div div c-wiz div a') %>% 
  html_attr("href")
noticiaDF = data.frame(Titular=titular, Fecha=fecha, Diario=diario, Link=link, stringsAsFactors = F)
noticiaDF
##                                                                          Titular
## 1 “Heineken®, la cerveza con más de 150 años de historia, se produce en Ecuador”
##                  Fecha        Diario
## 1 2020-09-29T07:00:00Z Metro Ecuador
##                                                                                                                          Link
## 1 https://www.metroecuador.com.ec/ec/empresarial/2020/09/29/heineken-la-cerveza-mas-150-anos-historia-se-produce-ecuador.html