【问题标题】:Web scraping of key stats in Yahoo! Finance with RYahoo! 中关键统计数据的 Web 抓取使用 R 进行财务
【发布时间】:2017-03-07 19:51:14
【问题描述】:

有没有人有从 Yahoo! 抓取数据的经验?使用 R 的财务关键统计页面?我熟悉使用 rvest 包中的 read_htmlhtml_nodes()html_text() 直接从 html 抓取数据。但是,这个网页MSFT key stats 有点复杂,我不确定是否所有的统计数据都保存在 XHR、JS 或 Doc 中。我猜数据存储在 JSON 中。如果有人知道用 R 提取和解析此网页数据的好方法,请回答我的问题,非常感谢!

或者如果有更方便的方法通过quantmodQuandl 提取这些指标,请告诉我,这将是一个非常好的解决方案!

【问题讨论】:

  • 作为替代方案,您可以查看quantmod 中的getFinancials()viewFinancials() 方法,不过它使用来自Google Finance 的数据,其他src 参数尚未实现。
  • 使用docl = htmlParse('http://finance.yahoo.com/quote/MSFT/key-statistics?p=MSFT'),您可以看到(function (root) { /* -- Data -- */ 的部分,其中显然是数据。例如"beta":{"raw":1.39107,"fmt":"1.39"},祝你好运!
  • 谢谢@Robert,我还在 XHR Y! Finanace Stats 中找到了另一个文档,它为指标存储了一个干净的 JSON!非常感谢,稍后会分享解析脚本。
  • 查看these answers

标签: r web-scraping quantmod rvest quandl


【解决方案1】:

我很久以前就放弃了 Excel。 R 绝对是解决此类问题的方法。

library(XML)

stocks <- c("AXP","BA","CAT","CSCO")

for (s in stocks) {
      url <- paste0("http://finviz.com/quote.ashx?t=", s)
      webpage <- readLines(url)
      html <- htmlTreeParse(webpage, useInternalNodes = TRUE, asText = TRUE)
      tableNodes <- getNodeSet(html, "//table")

      # ASSIGN TO STOCK NAMED DFS
      assign(s, readHTMLTable(tableNodes[[9]], 
                header= c("data1", "data2", "data3", "data4", "data5", "data6",
                          "data7", "data8", "data9", "data10", "data11", "data12")))

      # ADD COLUMN TO IDENTIFY STOCK 
      df <- get(s)
      df['stock'] <- s
      assign(s, df)
}

# COMBINE ALL STOCK DATA 
stockdatalist <- cbind(mget(stocks))
stockdata <- do.call(rbind, stockdatalist)
# MOVE STOCK ID TO FIRST COLUMN
stockdata <- stockdata[, c(ncol(stockdata), 1:ncol(stockdata)-1)]

# SAVE TO CSV
write.table(stockdata, "C:/Users/your_path_here/Desktop/MyData.csv", sep=",", 
            row.names=FALSE, col.names=FALSE)

# REMOVE TEMP OBJECTS
rm(df, stockdatalist)

【讨论】:

  • 好极了,我也想从 Finviz 上爬取。感谢您提供 Y 的替代品!财务。
【解决方案2】:

我知道这是一个较旧的线程,但我用它来抓取 Yahoo Analyst 表,所以我想我会分享。

# Yahoo webscrape Analysts
library(XML)

symbol = "HD"
url <- paste('https://finance.yahoo.com/quote/HD/analysts?p=',symbol,sep="")
webpage <- readLines(url)
html <- htmlTreeParse(webpage, useInternalNodes = TRUE, asText = TRUE)
tableNodes <- getNodeSet(html, "//table")

earningEstimates <- readHTMLTable(tableNodes[[1]])
revenueEstimates <- readHTMLTable(tableNodes[[2]])
earningHistory <- readHTMLTable(tableNodes[[3]])
epsTrend <- readHTMLTable(tableNodes[[4]])
epsRevisions <- readHTMLTable(tableNodes[[5]])
growthEst <- readHTMLTable(tableNodes[[6]])

干杯, 苏迪

【讨论】:

    【解决方案3】:

    当我将此处显示的方法与 XML 库一起使用时,我收到警告 readLines(page) 中的警告:找到不完整的最后一行 'https://finance.yahoo.com/quote/DIS/key-statistics?p=DIS'

    我们可以使用 rvest 和 xml2 来获得更简洁的方法。此示例演示如何从关键统计信息 Yahoo! 中提取关键统计信息。财务页面。在这里,我想获得股权的流通量。我不相信 quantmod 提供浮点数,但一些关键的统计值是可用的。您必须参考该列表。

    library(xml2)
    library(rvest)
    
    getFloat <- function(stock){
        url <- paste0("https://finance.yahoo.com/quote/", stock, "/key-statistics?p=", stock)
        tables <- read_html(url) %>%
        html_nodes("table") %>%
        html_table()
        float <- as.vector(tables[[3]][4,2])
        last <- substr(float, nchar(float)-1+1, nchar(float))
        float <-gsub("[a-zA-Z]", "", float)
        float <- as.numeric(as.character(float))
        if(last == "k"){
            float <- float * 1000
        } else if (last == "M") {
            float <- float * 1000000
        } else if (last == "B") {
            float <- float * 1000000000
        }
        return(float)
    }
    getFloat("DIS")
    

    [1] 1.81e+09

    有很多可用的迪士尼股票。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-23
      • 1970-01-01
      • 1970-01-01
      • 2019-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多