代码之家  ›  专栏  ›  技术社区  ›  RMacey

使用rvest从Yahoo finance获取基金数据

  •  -2
  • RMacey  · 技术社区  · 6 年前

    我正试图从雅虎财经的网页上抓取3个项目,给它们一个共同基金或ETF的符号:基金名称、费用比率和净资产。我是网络抓取新手,不熟悉CSS和XML,并且读过关于rvest和SelectorGadget工具的书。好消息是,我几乎可以勉强拼凑出基金的名称。

    对于这个例子,我使用的是股票代码“FNDB”。信息在这两个页面中的任何一个页面上-如果其中一个页面比另一个页面更容易使用,我会显示这两个页面,但我的代码使用第一个页面:

    Summary page
    Profile page

    以下是用于提取标题的代码和结果:

    library(rvest)
    url <- "https://finance.yahoo.com/quote/FNDB?p=FNDB"
    #Reading the HTML code from the website
    webpage <- read_html(url)
    code <- "title"
    result <- html_nodes(webpage,code)
    result
    

    {xml\u节点集(1)}
    [1] FNDB:Schwab Basic美国Broad M-Yahoo Finance摘要\n

    这并不是我想要的,因为结果包含的信息比我想要的更多,但我可以使用它。如果您能在这里提供帮助,我将不胜感激,但我主要是在寻找有关提取净资产和费用比率信息的代码的指导。如果没有这一点,我会很感激有人指出我可以在哪里学习如何找出代码。使用SelectorGadget返回“找不到有效路径”非常感谢。

    2 回复  |  直到 6 年前
        1
  •  2
  •   erocoar    6 年前

    你可以拿到整张桌子,考虑一下这个

    result <- html_nodes(webpage, "#quote-summary")
    result <- html_nodes(result, "table") %>% html_table()
    
        2
  •  1
  •   Brian Balzar    6 年前

    我补充道,很难弄清楚 rvest 并选择Orgadget。更聪明的人可以使用CSS选择器,但我必须使用XPATH选择器。以下是一些用于完成任务的函数。请记住,这些输出是字符,需要转换为数字。

    library(rvest)
    
    get_url <- function(sym) {
      out <- paste0("https://finance.yahoo.com/quote/", sym, "/profile?p=", sym)
    }
    
    get_name <- function(sym) {
      url <- get_url(sym)
      name <- read_html(url) %>%
        html_nodes(xpath = 
          '//*[contains(concat( " ", @class, " " ), concat( " ", "Mend(40px)", " " ))]') %>%
        html_text()
      return(name)
    }
    
    get_ratio <- function(sym) {
      url <- get_url(sym)
      out <- read_html(url) %>%
        html_nodes(xpath = 
          '//*[contains(concat( " ", @class, " " ), concat( " ", "Ta(e)", " " ))]') %>%
        html_text()
      return(out[4])
    }
    
    get_assets <- function(sym) {
      url <- get_url(sym)
      out <- read_html(url) %>%
        html_nodes(xpath = 
          '//*[contains(concat( " ", @class, " " ), concat( " ", "Fl(end)", " " ))]') %>%
        html_text()
      return(out[6])
    }