使用Yahoo Finance进行网络抓取

时间:2020-03-13 20:15:40

标签: r for-loop web-scraping quantmod

自从对Yahoo Finance进行了一些页面调整以来,我已经看到了一些用于网络抓取的字符串,以下脚本对于一个股票行情很好,但是创建了一个循环,对许多股票行情重复,然后将它们绑定为一个大数据框,每一行都有相应的行情自动收录器,导致显示以下消息:

open.connection(x,“ rb”)中的错误:HTTP错误503。

以下是带有循环的脚本-“ tickers”:

Time.Time

如果某个特定的代码正在挂起此操作,则很难查明是哪个代码(我希望脚本能够跳过它)。任何帮助定稿的工作都将受到赞赏。

1 个答案:

答案 0 :(得分:0)

我重写了答案以仅获取基本数据。首先,我将您的抓取请求放入一个函数中,而不是循环。接下来,我基于purrr的possibly函数编写了一个错误捕获器函数。这样就可以返回一个函数而不是默认值。然后,您可以使用map_df遍历所有股票代码。每当有错误时,数据将为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