es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Optimizar el web scraping con Rselenium

Estoy haciendo web scraping en una página web dinámica y me gustaría optimizar el proceso ya que es muy lento. La página web muestra una serie de ventas con información y a medida que se desplaza hacia abajo, aparecen más ventas, aunque hay un número finito de ventas. Lo que hice fue aumentar el tamaño de la ventana para que cargue casi todas las ventas sin desplazarse. Sin embargo, esto lleva un tiempo cargar ya que hay mucha información e imágenes. La información que estoy extrayendo es el precio, el nombre del activo y el enlace asociado al activo (cuando se hace clic en la imagen).

Mi objetivo es optimizar este proceso tanto como sea posible. Una forma de hacerlo sería no cargar las imágenes ya que no las necesito, pero no encontré cómo hacerlo con Firefox.

Cualquier mejora sería muy apreciada.

library(RSelenium)
library(rvest)

url <- "https://cnft.io/marketplace?project=Boss%20Cat%20Rocket%20Club&sort=_id:-1&type=listing,offer"

exCap <- list("moz:firefoxOptions" = list(args = list('--headless'))) # Ocultar navegador --headless
rD <- rsDriver(browser = "firefox", port = as.integer(sample(4000:4700, 1)),
               verbose = FALSE, extraCapabilities = exCap)
remDr <- rD[["client"]]
remDr$setWindowSize(30000, 30000)
remDr$navigate(url)
Sys.sleep(300)
html <- remDr$getPageSource()[[1]]
remDr$close()

html <- read_html(html)
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Una forma de optimizar el proceso de web scraping es utilizar el paquete RSelenium para interactuar con la página web y solo extraer la información necesaria sin cargar imágenes innecesarias. Un enfoque es utilizar las funciones findElement y getElementAttribute para localizar y obtener los enlaces asociados a los recursos, y luego usar rvest para extraer el precio y el nombre del recurso de cada enlace.

    Aquí hay una implementación de ejemplo:

    library(RSelenium)
    library(rvest)
    
    # Configurar el controlador de RSelenium
    exCap <- list("moz:firefoxOptions" = list(args = list('--headless'))) # Ocultar navegador --headless
    rD <- rsDriver(browser = "firefox", port = as.integer(sample(4000:4700, 1)),
                   verbose = FALSE, extraCapabilities = exCap)
    remDr <- rD[["client"]]
    remDr$setWindowSize(30000, 30000)
    
    # Navegar hasta la página web
    url <- "https://cnft.io/marketplace?project=Boss%20Cat%20Rocket%20Club&sort=_id:-1&type=listing,offer"
    remDr$navigate(url)
    Sys.sleep(5) # Esperar a que la página se cargue
    
    # Obtener los enlaces de los recursos
    links <- remDr$findElements("css", ".item-card-image-link") # Encontrar elementos con enlaces de recursos
    links <- sapply(links, function(x) x$getElementAttribute("href")) # Extraer URLs de enlaces
    
    # Extraer el nombre del recurso y el precio de cada enlace
    assets <- list()
    for (i in 1:length(links)) {
      link <- links[i]
      html <- read_html(link)
      name <- html %>% html_nodes(".title") %>% html_text() %>% trimws() # Extraer nombre del recurso
      price <- html %>% html_nodes(".price") %>% html_text() %>% trimws() # Extraer precio
      assets[[i]] <- data.frame(name = name, price = price, link = link) # Almacenar en lista
    }
    
    # Limpiar y cerrar el controlador de RSelenium
    assets <- do.call("rbind", assets) # Combinar data frames
    remDr$close()
    rD$server$stop()
    
    # Ver los resultados
    head(assets)
    

    Este código obtiene los enlaces asociados a cada recurso en la página web utilizando remDr$findElements y getElementAttribute. Luego, recorre cada enlace, navega a la URL del enlace y utiliza rvest para extraer el nombre y precio del recurso del HTML. Los resultados se almacenan en una lista de data frames y se combinan en un único data frame utilizando do.call("rbind", assets).

    Este enfoque evita cargar imágenes innecesarias y debería ser más rápido que cargar la página web completa. Sin embargo, aún requiere navegar hacia cada enlace del recurso, lo cual puede llevar algo de tiempo. Un enfoque alternativo sería utilizar la API de la página web directamente para obtener la información necesaria sin cargar la página web completa, si está disponible.

Comments are closed.