使用 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
自从对 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