【问题标题】:Webscraping with Yahoo Finance使用 Yahoo Finance 进行网页抓取
【发布时间】:2020-03-13 20:15:40
【问题描述】:

自从对雅虎财经进行了一些页面调整以来,我已经看到了一些用于网页抓取的字符串,以下脚本适用于一个股票代码,但创建了一个循环,该循环对许多股票代码重复它,然后将它们绑定到一个每行带有相应代码的大型数据框导致以下消息:

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

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

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)]

如果某个特定的代码挂起此操作,则很难确定是哪一个(我希望脚本能够跳过它)。非常感谢任何有助于完成此操作的帮助。

【问题讨论】:

    标签: r for-loop web-scraping quantmod


    【解决方案1】:

    我重写了答案以仅获取基本数据。首先,我将您的抓取请求放入函数中,而不是循环。接下来,我基于 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
    

    【讨论】:

    • 感谢您的示例。我遇到的问题是收集基本数据而不是 tidyquant 的报价。您提供的两种选择都适用。
    • @js80,我调整了答案。这应该能让你继续前进。
    • 太好了。再次感谢您,因为我一直在努力解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 2013-10-02
    • 2019-12-23
    • 2016-05-28
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    相关资源
    最近更新 更多