使用 Yahoo Finance 进行网页抓取

Webscraping with Yahoo Finance

自从对 Yahoo Finance 进行了一些页面调整后,我已经看到了一些用于网络抓取的字符串,并且以下脚本适用于一个自动收报机,但创建了一个循环,对许多自动收报机重复它,然后将它们绑定起来放入一个大数据框中,每一行都有相应的代码,结果显示以下消息:

Error in open.connection(x, "rb") : HTTP error 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)]

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

我重写了答案以仅获取基本数据。首先,我将您的抓取请求放入函数中,而不是循环。接下来,我基于 purrr 的 possibly 函数松散地编写了一个错误捕获器函数。这能够 return 一个函数而不是一个默认值。然后您可以使用 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