Webscraping с финансами Yahoo - PullRequest
       19

Webscraping с финансами Yahoo

0 голосов
/ 13 марта 2020

Я видел несколько строк для создания веб-страниц, так как некоторые настройки страницы были сделаны для Yahoo Finance, и следующий скрипт хорошо работает для одного тикера, но создает al oop, который повторяет его для многих тикеров, а затем связывает их в один большой фрейм данных с соответствующим тикером для каждой строки вылилось в следующее сообщение:

Ошибка в open.connection (x, "rb"): ошибка HTTP 503.

Вот скрипт с тикерами l oop:

library(quantmod)
symbolData2 <- stockSymbols(exchange="NASDAQ")
symbolData3 <- stockSymbols(exchange="NYSE")
complete_symbols <- rbind(symbolData2,symbolData3)  
tickers <- paste(complete_symbols$Symbol,sep=',')
stocks <- tickers

for (s in stocks) {
  url <- paste0("https://finance.yahoo.com/quote/",s,"/key-statistics?p=", s)
  df <- url %>% 
  read_html() %>% 
  html_table(header = FALSE) %>% 
  map_df(bind_cols) %>% 
  as_tibble()

  assign(s, df)

  df <- get(s)
  df['stock'] <- s
  assign(s, df)

}  

stockdata <- do.call(rbind, stockdatalist)

stockdata <- stockdata[, c(ncol(stockdata), 1:ncol(stockdata)-1)]

Если какой-то тикер подвешивает эту операцию, трудно определить, какой (и я бы предпочел Скрипт просто сможет пропустить его). Любая помощь, чтобы завершить это очень ценится.

1 Ответ

0 голосов
/ 14 марта 2020

Я переписал ответ, чтобы получить только фундаментальные данные. Прежде всего, вместо al oop я поместил ваш запрос очистки в функцию. Затем я написал функцию определения ошибок, основанную на функции possibly из purrr. Это чтобы иметь возможность возвращать функцию вместо значения по умолчанию. Затем вы можете использовать map_df до l oop над всеми символами тикера. Всякий раз, когда возникает ошибка, данные будут NA, но будут отображаться тикер и заполнять столбец ошибок.

Если скорость является проблемой, вы можете заглянуть в пакет furrr, чтобы выполнить все это параллельно.

library(rvest)
library(purrr)
library(dplyr)

get_stats <- function(symbol) {
  url <- paste0("https://finance.yahoo.com/quote/",symbol,"/key-statistics?p=", symbol)
  df <- url %>%
  read_html() %>%
  html_table(header = FALSE) %>%
  map_df(bind_cols) %>%
  as_tibble()

  names(df) <- c("valuation_measures", "value")
  df["stock"] <- symbol

  return(df)
}

catch_error <- function(.f, otherwise=NULL) {
  function(...) {
    tryCatch({
      .f(...)  
    }, error = function(e) otherwise(...))
  }
}

tickers <- c("xxxxxx", "AAPL")

out <- map_df(tickers, catch_error(get_stats, otherwise = function(x) tibble(valuation_measures = NA_character_, value = NA_character_, stock = x, error = "error in getting data")))

# A tibble: 60 x 4
   valuation_measures          value stock  error                
   <chr>                       <chr> <chr>  <chr>                
 1 NA                          NA    xxxxxx error in getting data
 2 Market Cap (intraday) 5     1.22T AAPL   NA                   
 3 Enterprise Value 3          1.23T AAPL   NA                   
 4 Trailing P/E                22.07 AAPL   NA                   
 5 Forward P/E 1               17.81 AAPL   NA                   
 6 PEG Ratio (5 yr expected) 1 1.52  AAPL   NA                   
 7 Price/Sales (ttm)           4.54  AAPL   NA                   
 8 Price/Book (mrq)            13.61 AAPL   NA                   
 9 Enterprise Value/Revenue 3  4.58  AAPL   NA                   
10 Enterprise Value/EBITDA 6   15.69 AAPL   NA                   
# ... with 50 more rows
...