TransWikia.com

Web scraping profundo en R, producto por producto

Stack Overflow en español Asked by Javi Jerez on January 28, 2021

Estoy intentando extraer datos, con la ayuda de R, del catálogo de productos de una página farmacéutica y necesito los datos que están pinchando cada producto, es decir, necesito realizar un código en R, que pinche un producto, extraiga los datos que necesito, luego vuelva al catálogo y pinche el siguiente producto para extraer sus respectivos datos.

Realicé un código, pero este es solo para extraer los datos de cada producto directamente del catálogo y no están todos los datos que necesito, ya que están mas reducidos.

Adjunto mi código y espero que me puedan ayudar, cualquier comentario es bien recibido.

library(rvest)
library(robotstxt)
library(selectr)
library(xml2)
library(dplyr)
library(stringr)
library(forcats)
library(magrittr)
library(tidyr)
library(ggplot2)
library(lubridate)
library(tibble)
library(purrr)


url = "https://salcobrand.cl/t/medicamentos?current_store_id=1"

# Leer el HTML
leahtml <- read_html(url)


#PRECIO

leahtml %>%
  html_nodes(".sale-price ") %>%
  html_text() -> price

precio = gsub("Oferta:","",price)
precio = gsub("Precio","",precio)
precio = gsub(" ","",precio)
precio = gsub("farmacia:","",precio)
precio_a = gsub("\$","",precio)
precio_a = str_trim(precio_a)
precio_medicamento= substr(precio_a,1,5)
Precio_medicamento= as.numeric(precio_medicamento)

#NOMBRE

leahtml %>%
  html_nodes(".product-name") %>%
  html_text() -> Nombre

#FORMATO

leahtml %>%
  html_nodes(".product-info") %>%
  html_text() -> pactivo

pactivo = gsub("Principio","",pactivo)
pactivo = gsub("Pricipio","",pactivo)
pactivo = gsub(" ","",pactivo)
Principio_activo= gsub("Activo:","",pactivo)

pactivo_limpio

#FORMATO

leahtml %>%
  html_nodes(".option-value-catalog ") %>%
  html_text() -> Formato

#BIOEQUIVALENCIA

leahtml %>%
  html_nodes(".txt-caluga") %>%
  html_text() -> Bioequivalencia

Bioequivalencia


dataset <- data.frame(Nombre,Principio_activo, Formato, Precio_medicamento, Bioequivalencia)

One Answer

La solución es similar a la de tu pregunta anterior, es cuestión de crear primero la lista de enlaces a los productos y luego usar un iterador para pasar producto por producto y obtener la información.

En el caso de la página que mencionas puedes usar algo así para obtener todos los enlaces:

url <- "https://salcobrand.cl/t/medicamentos?current_store_id=1"
página <- read_html(url)

enlaces_crudos <- página %>% 
  html_nodes(".product-catalog") %>% #Estos selectores se podrían mejorar para evitar duplicados
  html_nodes(".product-image") %>%   #Estos selectores se podrían mejorar para evitar duplicados
  html_nodes("a") %>%                #Estos selectores se podrían mejorar para evitar duplicados
  html_attr("href")  #href es el nombre interno de los enlaces

url_de_productos <- enlaces_crudos %>% 
  keep(str_detect(., "taxon")) %>%    #Tengo dos enlaces por producto, uso esta palabra para quedarme con solo 1
  paste0("https://salcobrand.cl", .)  #La URL está incompleta, pero siempre de la misma forma, así que le agrego lo que falta

Obtengo este vector de cadenas de caracteres con el que tengo todos los enlaces a productos dentro de cada página.

url_de_productos

[1] "https://salcobrand.cl/products/aloelax-tratamiento-laxante?default_sku=8110423&taxon_id=2650"               
[2] "https://salcobrand.cl/products/clotrimazol-1-en-crema?default_sku=1768325&taxon_id=2650"                    
[3] "https://salcobrand.cl/products/ibuprofeno-en-jarabe-100mg-5ml?default_sku=437372&taxon_id=2650"             
[4] "https://salcobrand.cl/products/exforge-d-5-160-12-5-x28com-rec?default_sku=290341&taxon_id=2650"            
[5] "https://salcobrand.cl/products/exforge-d-10-160-12-5-x28com-rec?default_sku=290339&taxon_id=2650"           
[6] "https://salcobrand.cl/products/exforge-10-160-x56com-rec?default_sku=290275&taxon_id=2650"                  
[7] "https://salcobrand.cl/products/corentel-10-10mg-x30com-rec?default_sku=2570111&taxon_id=2650"               
[8] "https://salcobrand.cl/products/quetex-xr-150x30?default_sku=740033&taxon_id=2650"                           
[9] "https://salcobrand.cl/products/quetex-ir-100x30?default_sku=573462&taxon_id=2650"                           
[10] "https://salcobrand.cl/products/quetex-ir-25x30?default_sku=573461&taxon_id=2650"                            
[11] "https://salcobrand.cl/products/arizol-5mg-x-28?default_sku=573467&taxon_id=2650"                            
[12] "https://salcobrand.cl/products/valaplex-160mg-30cr?default_sku=436729&taxon_id=2650"                        
[13] "https://salcobrand.cl/products/valaplex-320mg-30cr?default_sku=432516&taxon_id=2650"                        
[14] "https://salcobrand.cl/products/valaplex-80mg-30cr?default_sku=436702&taxon_id=2650"                         
[15] "https://salcobrand.cl/products/metformina-850-mg-oral-solido?default_sku=573614&taxon_id=2650"              
[16] "https://salcobrand.cl/products/slinda-4-mg?default_sku=575323&taxon_id=2650"                                
[17] "https://salcobrand.cl/products/prolia-60-mg?default_sku=1000250&taxon_id=2650"                              
[18] "https://salcobrand.cl/products/sales-rehidratantes-oral-pvo-solido-60-grs?default_sku=1763186&taxon_id=2650"
[19] "https://salcobrand.cl/products/metropast-b-500mg-x20com?default_sku=2501351&taxon_id=2650"                  
[20] "https://salcobrand.cl/products/diazepam-b-10mg-x20com?default_sku=430600&taxon_id=2650"                     
[21] "https://salcobrand.cl/products/tolexine-ge-b-100mg-x15com?default_sku=851007&taxon_id=2650"                 
[22] "https://salcobrand.cl/products/principio-activo-provitamin-b?default_sku=2571379&taxon_id=2650"             
[23] "https://salcobrand.cl/products/principio-activo-colutorio?default_sku=2571173&taxon_id=2650"                
[24] "https://salcobrand.cl/products/shampoo-con-protector-solar?default_sku=576569&taxon_id=2650"  

Puedo usar un iterador como map() para pasar la función read_html() a cada elemento de ese vector, es decir, recuperar el html de cada producto.

páginas_de_cada_producto <- map(url_de_productos, ~read_html(.x))

Lo que obtienes es una lista con los 24 htmls crudos que corresponden a los productos que estan en cada página del catálogo. Puedes seguir usando html_nodes() %>% html_text() dentro de un map() para extraer de ahí la información de cada producto. En la respuesta a tu pregunta anterior hay una aproximación al problema, te podría servir. Para hacer este proceso en cada página tendrías que pasar este iterador dentro de otro iterador. Es medio complicado, pero peor es hacerlo a mano...

Answered by mpaladino on January 28, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP