2016-11-22 72 views
1

我:如何使用R從JavaScript餅圖中抓取Web數據?

library(XML) 

my_URL <- "http://www.velocitysharesetns.com/viix" 

tables <- readHTMLTable(my_URL) 

PieChart

上述輸出只是位於頁面頂部的表。它看起來像餅圖被忽略,並且javascript解釋它。有沒有簡單的解決方案來提取圖表中的兩個百分比數字?

看了看RSelenium但是我收到一些錯誤,我一直沒能找到任何解決方案。

> RSelenium::startServer() 
Error in if (file.exists(file) == FALSE) if (!missing(asText) && asText == : 
    argument is of length zero 
In addition: Warning messages: 
1: startServer is deprecated. 
Users in future can find the function in file.path(find.package("RSelenium"), "example/serverUtils"). 
The sourcing/starting of a Selenium Server is a users responsiblity. 
Options include manually starting a server see vignette("RSelenium-basics", package = "RSelenium") 
and running a docker container see vignette("RSelenium-docker", package = "RSelenium") 
2: running command '"java" -jar "\\med-fs01/Home/Alex.Badoi/R/win-library/3.3/RSelenium/bin/selenium-server-standalone.jar" -log "\\med-fs01/Home/Alex.Badoi/R/win-library/3.3/RSelenium/bin/sellog.txt"' had status 127 
3: running command '"wmic" path win32_process get Caption,Processid,Commandline /format:htable' had status 44210 
> 

根據菲利普的回答我想出了一個流動的解決方案:

library(XML) 



# extarct HTML 

doc.html = htmlTreeParse('http://www.velocitysharesetns.com/viix', 
         useInternal = TRUE) 


# convert to text 

htmltxt <- paste(capture.output(doc.html, file=NULL), collapse="\n") 

# get location of string 

pos = regexpr('CBOE SHORT-TERM VIX FUTURE', htmltxt) 

# extarct from "pos" to nchar to end of string 

keep = substr(htmltxt, pos, pos+98) 

輸出:

> keep 
[1] "CBOE SHORT-TERM VIX FUTURE DEC 2016', 81.64],\n\n ['CBOE SHORT-TERM VIX FUTURE JAN 2017', 18.36],\n" 
+0

在運行'startServer()'之前,你運行'checkForServer(update = TRUE)'嗎? 此外,看看你的瀏覽器(例如Firefox的F12)的檢查員,看看你想要獲取的數據是否可以在那裏被識別。 – PhillipD

+0

嗨Phillip,好像checkForServer命令也被棄用。對於使用chrome的第二個問題,右鍵單擊,檢查元素。我不知道任何Java,但2代碼不顯示在代碼中。 –

回答

3

使用RSelenium

這種解決方案我使用Rselenium爲(使用Windows 7並檢查源代碼後e網頁)。請注意,我用chromedriver.exe

library(RSelenium) 
checkForServer(update = TRUE) 

#### I use Chromedriver 
startServer(args = c("-Dwebdriver.chrome.driver=C:/Stuff/Scripts/chromedriver.exe")) 

remDr <- remoteDriver(remoteServerAddr = "localhost", browserName="chrome", port=4444) 

### Open Chrome 
remDr$open() 

remDr$navigate("http://www.velocitysharesetns.com/viix") 

b <- remDr$findElements(using="class name", value="jqplot-pie-series") 

sapply(b, function(x){x$getElementAttribute("outerHTML")}) 

最後的命令返回

[[1]] 
[1] "<div class=\"jqplot-pie-series jqplot-data-label\" style=\"position: absolute; left: 100px; top: 106px;\"><div style=\"color:white;font-weight:bold;\">82%</div></div>" 

[[2]] 
[1] "<div class=\"jqplot-pie-series jqplot-data-label\" style=\"position: absolute; left: 159px; top: 67px;\"><div style=\"color:white;font-weight:bold;\">18%</div></div>" 

你可以看到百分比數字出現在那裏,可以很容易提取。

只需使用普通的HTML

的數據。另外還可以通過,因爲數據已經包含在讀取了HTML源中獲取。在源代碼中你可以找到:

<script type="text/javascript" language="javascript"> 
$(document).ready(function(){ 
var data = [ 


['CBOE SHORT-TERM VIX FUTURE DEC 2016', 81.64], 

['CBOE SHORT-TERM VIX FUTURE JAN 2017', 18.36], 

]; 

這就是你要找的。數字在圖中顯示之前被舍入。

+0

我用HTML位來提出我自己的解決方案。看到有問題的編輯。不幸的是Selenium沒有爲我工作,但我相信這是一個基於你的解決方案的工作答案。謝謝您的幫助。 –