¿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?
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.