自从对Yahoo Finance进行了一些页面调整以来,我已经看到了一些用于网络抓取的字符串,以下脚本对于一个股票行情很好,但是创建了一个循环,对许多股票行情重复,然后将它们绑定为一个大数据框,每一行都有相应的行情自动收录器,导致显示以下消息:
open.connection(x,“ rb”)中的错误:HTTP错误503。
以下是带有循环的脚本-“ tickers”:
Time.Time
如果某个特定的代码正在挂起此操作,则很难查明是哪个代码(我希望脚本能够跳过它)。任何帮助定稿的工作都将受到赞赏。
答案 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