调整Yahoo Stock Data Web抓取以遍历日期

时间:2019-02-22 21:25:49

标签: r web-scraping stock

我使用的脚本与找到的here类似。简而言之,代理问题(或其他原因)会使API超时。我必须解析Yahoo Finance数据的网址,而不是使用quantmod获取历史股票数据。因为yahoo finance仅加载100行,所以即使您将日期范围设置为超过at,也要向下滚动,否则我需要获得此“ for循环”以一次遍历我创建的100天列表。开始日期是Yahoo Finance使用的整数格式。

以下是100天增量的df示例,列表将更改/增长。证券列表也正在从文件中导入,并且也会动态更改,但是我在下面提供了“符号”作为示例。

在下面,我希望dateGroup [1,1]和dateGroup [1,2]自动从dateGroup中获取第一行的值,然后自动获取第二行,依此类推-然后构建一个包含所有内容的单个数据框值。

dateGroup <- data.frame(
    start = c(1509519600, 1518159600,1526799600,1535439600,1544079600),
    end = c(1518073200, 1526713200,1535353200,1543993200,1550732400)
)

for (s in symbols){
    url <- paste('https://finance.yahoo.com/quote/',s, '/history?period1=',dateGroup[1,1],'&period2=',dateGroup[1,2],'&interval=1d&filter=history&frequency=1d',sep="")
    webpage <- readLines(url,warn=FALSE)
    html <- htmlTreeParse(webpage, useInternalNodes = TRUE, asText = TRUE)
    tableNodes <- getNodeSet(html, "//table")
    assign(s, readHTMLTable(tableNodes[[1]], header=c("Date","Open","High","Low","Close","Adj. Close","Volume")))

    df <- get(s)
    df['symbol'] <- s
    assign(s, df)
}

symboldatalist <- cbind(mget(symbols))
symboldata <- do.call(rbind, symboldatalist)

symboldata <- symboldata[, c(ncol(symboldata), 1:ncol(symboldata)-1)]

write.table(symboldata, "[Location], sep=",", row.names=FALSE, col.names=TRUE)

任何帮助都会很棒。谢谢!

我尝试过的几件事。我试图创建一个URL矩阵,并在URL的顶部和第1列和第2列中的日期刮掉那些URL。我还尝试在Yahoo Finance页面上编写自动滚动程序,但是由于超时而遇到了相同的错误。

1 个答案:

答案 0 :(得分:0)

请考虑使用ctx或其未简化的包装器mapply,以逐个开始和结束日期以及相应的符号对元素进行迭代。另外,请避免使用Mapassign,并在最后建立最终get的数据帧列表:

rbind

要演示如何使用美国1级铁路:

library(XML)
...
dateGroup <- data.frame(
    start = c(1509519600, 1518159600, 1526799600, 1535439600, 1544079600),
    end = c(1518073200, 1526713200, 1535353200, 1543993200, 1550732400)
)

# CROSS JOIN ALL SYMBOLS WITH EACH DATE PAIRING
dt_grp_sym <- merge(dateGroup, data.frame(symbols))

# DEFINED METHOD FOR HTML PROCESSING
proc_html <- function(sym, sd, ed) {    
    url <- paste0('https://finance.yahoo.com/quote/', sym, '/history?period1=',
                  sd, '&period2=', ed, '&interval=1d&filter=history&frequency=1d')
    print(url)

    webpage <- readLines(url, warn=FALSE)
    html <- htmlTreeParse(webpage, useInternalNodes = TRUE, asText = TRUE)
    tableNodes <- getNodeSet(html, "//table")

    html_df <- transform(readHTMLTable(tableNodes[[1]],
                                       header=c("Date", "Open", "High", "Low",
                                                "Close", "Adj. Close", "Volume")),
                         symbol = sym)
    return(html_df)
}

# ITERATE ELEMENTWISE THROUGH EVERY ROW of dt_grp_sym
df_list <- Map(proc_html, dt_grp_sym$symbols, dt_grp_sym$start, dt_grp_sym$end)

final_df <- do.call(rbind, df_list)

输出

symbols <- c("UNP", "CSX", "NSC", "CNI", "KSU")

dateGroup <- data.frame(
  start = c(1509519600, 1518159600, 1526799600, 1535439600, 1544079600),
  end = c(1518073200, 1526713200, 1535353200, 1543993200, 1550732400)
)    
dt_grp_sym <- merge(dateGroup, data.frame(symbols))

# CALLING SAME ABOVE FUNCTION
df_list <- with(dt_grp_sym, Map(proc_html, symbols, start, end))   
final_df <- do.call(rbind, df_list)