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)
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
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP