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.

¿Cómo puedo extraer el conjunto de datos completo de Yahoo Finance con rvest?

Estoy tratando de obtener el conjunto completo de datos del historial de Bitcoin desde Yahoo Finance a través de scraping web, éste es mi primer código de opción:

library(rvest)
library(tidyverse)

crypto_url <- read_html("https://finance.yahoo.com/quote/BTC-USD/history?period1=1480464000&period2=1638230400&interval=1d&filter=history&frequency=1d&includeAdjustedClose=true")
cryp_table <- html_nodes(crypto_url,css = "table")
cryp_table <- html_table(cryp_table,fill = T) %>% 
  as.data.frame()

En el enlace que proporciono para read_html(), ya se ha seleccionado un largo período de tiempo, sin embargo, solo obtiene las primeras 101 filas y la última fila es el mensaje de carga que se obtiene al seguir desplazándose, éste es mi segundo intento pero obtengo lo mismo:

col_page <- read_html("https://finance.yahoo.com/quote/BTC-USD/history?period1=1480464000&period2=1638230400&interval=1d&filter=history&frequency=1d&includeAdjustedClose=true")
cryp_table <- 
  col_page %>% 
  html_nodes(xpath = '//*[@id="Col1-1-HistoricalDataTable-Proxy"]/section/div[2]/table') %>% 
  html_table(fill = T)
cryp_final <- cryp_table[[1]]  

¿Cómo puedo obtener todo el conjunto de datos?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una forma de obtener el conjunto de datos completo es enviar múltiples solicitudes al servidor, solicitando datos en fragmentos y luego fusionando todos los fragmentos juntos. Así es como se podría implementar este enfoque utilizando el paquete httr:

    “`{r}
    library(httr)
    library(dplyr)
    library(tidyr)

    Establecer URL y parámetros

    url <- “https://finance.yahoo.com/quote/BTC-USD/history”
    params <- list(
    period1 = “1480464000”,
    period2 = “1638230400”,
    interval = “1d”,
    filter = “history”,
    frequency = “1d”,
    includeAdjustedClose = “true”
    )

    Inicializar dataframe para almacenar resultados

    data <- data.frame()

    Definir número de filas por fragmento y número total de filas

    rows_per_chunk <- 100
    total_rows <- 3000 # ajustar según sea necesario

    Recorrer todos los fragmentos requeridos

    for (i in seq(0, total_rows, rows_per_chunk)) {

    # Establecer parámetros para el fragmento actual
    params_start <- i + 1
    params_end <- i + rows_per_chunk
    chunk_params <- c(params, list(first = params_start, count = rows_per_chunk))

    # Enviar solicitud al servidor y extraer tabla
    res <- GET(url, query = chunk_params)
    res_html <- content(res, as = “parsed”)
    table_html <- html_nodes(res_html, “table”)[[1]]
    chunk_data <- html_table(table_html)

    # Agregar fragmento al dataframe general
    data <- bind_rows(data, chunk_data)

    }

    Limpiar el dataframe

    data <- data %>%
    drop_na(Date) %>% # remover filas con fechas faltantes
    mutate(Date = lubridate::mdy(Date), # convertir columna de fecha al formato de fecha
    across(-Date, as.numeric)) # convertir otras columnas a numéricas

    “`

    En este código, primero definimos la URL y los parámetros para consultar el historial de datos de Bitcoin en Yahoo Finance API. Luego inicializamos un dataframe vacío para almacenar los resultados y establecemos el número de filas por fragmento y el número total de filas que queremos recuperar. Luego recorremos todos los fragmentos requeridos, enviamos una solicitud al servidor para cada fragmento, extraemos la tabla de la respuesta HTML y agregamos el fragmento a nuestro dataframe general.

    Finalmente, limpiamos el dataframe convirtiendo la columna de fecha en un formato de fecha y convirtiendo las otras columnas en numéricas. Esto debería brindarle el conjunto de datos históricos completo para Bitcoin en Yahoo Finance.

Comments are closed.