2011-09-23 4 views
4

에서 찾아야합니다. Yahoo Finance는 data on historic analyst opinions 주식을 보유하고 있습니다. ,yahoo finance의 역사 분석가 의견을 R

getOpinions <- function(symbol) { 
    require(XML) 
    require(xts) 
    yahoo.URL <- "http://finance.yahoo.com/q/ud?" 
    tables <- readHTMLTable(paste(yahoo.URL, "s=", symbol, sep = ""), stringsAsFactors=FALSE) 
    Data <- tables[[11]] 
    Data$Date <- as.Date(Data$Date,'%d-%b-%y') 
    Data <- xts(Data[,-1],order.by=Data[,1]) 
    Data 
} 

getOpinions('AAPL') 

나는 테이블의 위치 (현재 11) 변경하는 경우이 코드는 깰 것이라고 걱정 : 나는 분석을 위해 R에이 데이터를 끌어에 관심이 있어요, 여기에 내가 지금까지 무엇을 가지고 하지만 내가 원하는 데이터가있는 테이블을 찾는 우아한 방법을 생각할 수는 없습니다. the solution posted here 시도했지만이 문제가 작동하지 않는 것 같습니다.

야후가 사이트를 재편성 할 경우 손상 될 가능성이 적은이 데이터를 긁을 수있는 더 좋은 방법이 있습니까?

편집 : 이미 패키지 (fImport)가있는 것 같습니다. 여기

function (query, file = "tempfile", source = NULL, save = FALSE, 
    try = TRUE) 
{ 
    if (is.null(source)) 
     source = "http://finance.yahoo.com/q/ud?s=" 
    if (try) { 
     z = try(yahooBriefing(query, file, source, save, try = FALSE)) 
     if (class(z) == "try-error" || class(z) == "Error") { 
      return("No Internet Access") 
     } 
     else { 
      return(z) 
     } 
    } 
    else { 
     url = paste(source, query, sep = "") 
     download.file(url = url, destfile = file) 
     x = scan(file, what = "", sep = "\n") 
     x = x[grep("Briefing.com", x)] 
     x = gsub("</", "<", x, perl = TRUE) 
     x = gsub("/", "/", x, perl = TRUE) 
     x = gsub(" class=.yfnc_tabledata1.", "", x, perl = TRUE) 
     x = gsub(" align=.center.", "", x, perl = TRUE) 
     x = gsub(" cell.......=...", "", x, perl = TRUE) 
     x = gsub(" border=...", "", x, perl = TRUE) 
     x = gsub(" color=.red.", "", x, perl = TRUE) 
     x = gsub(" color=.green.", "", x, perl = TRUE) 
     x = gsub("<.>", "", x, perl = TRUE) 
     x = gsub("<td>", "@", x, perl = TRUE) 
     x = gsub("<..>", "", x, perl = TRUE) 
     x = gsub("<...>", "", x, perl = TRUE) 
     x = gsub("<....>", "", x, perl = TRUE) 
     x = gsub("<table>", "", x, perl = TRUE) 
     x = gsub("<td nowrap", "", x, perl = TRUE) 
     x = gsub("<td height=....", "", x, perl = TRUE) 
     x = gsub("&amp;", "&", x, perl = TRUE) 
     x = unlist(strsplit(x, ">")) 
     x = x[grep("-...-[90]", x, perl = TRUE)] 
     nX = length(x) 
     x[nX] = gsub("@$", "", x[nX], perl = TRUE) 
     x = unlist(strsplit(x, "@")) 
     x[x == ""] = "NA" 
     x = matrix(x, byrow = TRUE, ncol = 9)[, -c(2, 4, 6, 8)] 
     x[, 1] = as.character(strptime(x[, 1], format = "%d-%b-%y")) 
     colnames(x) = c("Date", "ResearchFirm", "Action", "From", 
      "To") 
     x = x[nrow(x):1, ] 
     X = as.data.frame(x) 
    } 
    X 
} 
+0

입니까? – Rhodo

답변

3

입니다 : 여기

library(fImport) 
yahooBriefing("AAPL") 

는 XTS 객체를 반환하지 않으며, 페이지 레이아웃 변경 (fImport의 yahooKeystats 기능이 이미 깨진) 경우 아마도 휴식 것입니다 그들의 솔루션입니다 당신이 사용할 수있는 해킹. 함수 내부에 다음을 추가하십시오.

# GET THE POSITION OF TABLE WITH MAX. ROWS 
position = which.max(sapply(tables, NROW)) 
Data  = tables[[position]] 

페이지의 가장 긴 테이블이 원하는 것이면 작동합니다.

당신이 좀 더 강력한 확인하려면, 여기에 또 다른 접근 방식 yahooBriefing에 무슨 일이 있었는지

# GET POSITION OF TABLE CONTAINING RESEARCH FIRM IN ITS NAMES 
position = sapply(tables, function(tab) 'Research Firm' %in% names(tab)) 
Data  = tables[position == TRUE]