2016-11-15 39 views
0

我想把svg圖形像http://www.dotabuff.com/matches/2502387920這樣的淨值優勢變成一張表格,其中一列有遊戲分鐘,另一列有優勢。用R解析svg

我開始的代碼

library(rvest) 
pic <- html("http://www.dotabuff.com/matches/2502387920") %>% html_node(xpath = "//svg") 

很明顯的線條那麼我認爲最有用的信息是在屬性d

pic %>% html_attr("d") 

最後,我得到的東西,如「m1234.8,2812.1, 6.3004,3.6375,0,1.77-6.3004-3.6375z」。我不知道如何解釋它。

+0

通過dotabuff使用的信息通常來自一個API(不知道是否有一個官方API)這裏是一個https://dota2api.readthedocs.io/en/最新/。我認爲如果你知道如何訪問該API,這是一個簡單而乾淨的路徑,如果你想多次執行這個get html,你會遇到性能問題。 – jbkunst

回答

0

技術上沒有一個答案,但太大評論

那是因爲你所看到的實際SVG局部座標。將它們轉換回真實的數據會變得很難看(如果幾乎不可能)。通常情況下,我建議只從XHR請求中提取數據,但該站點不會對數據進行XHR請求。他們實際上通過將編碼數據嵌入到一些<div> s中來使用Highcharts數據混淆技術。這是你的數據:

<div style="height: 260px" data-highchart="yes" data-encoded="*7JyYoFmc0JiO#7JCd5BXZiojIhJXZhJSfsICbldWZuRmI6snIl5WYixWZkJiOmFGbzVWfsIyc$lJXalNnI6s1ei4WYtVmI6ISQkZXYuRXYnVmIsIyYvx2byJiOiMSOyEUNyUjI]sIibldWY0lmdlN0bs9mciojIjMkMzMkMBJCLiYWasx2TwF2YpRXeioDMuQDL$iQHayV2co9GbkJiOw4CMsICbp5WZXlGZ0hmI6QDLiQWY0FmI6s1W2ADLxIjN#dxyWxIDMsIDMz0FLbFDOwwSL0kTOdxyWyQDMsMDNz0FLbNDMwwSM3kTXss1M#2ADL5UDOdxyW0IDMsUTN50FLbRDOwwiM4UDOdxyW1QDMsQTO20FLbZDMwwiN*4YTXsslN2ADL0gzMdxyW3IDMs0SMzkTXss1N4ADLtcjMy0FLbhDNwwSLyYjM]30FLblDMwwSLykTM00FLbljNwwSLyQzNy0FLbFDMyADLtEDNycTXssVMwgDM$s0SO0ATXssVMxQDMs0SM5czMdxyWxIDMwwSLxQTO00FLbFjM2ADLtEDNxgTX&amp;ssVMzIDMs0SMygTMdxyWxMDOwwSLxIDO20FLbFDN0ADLzEzN20FLbFTNwADL#0IjM50FLbFTN2ADL4IzN40FLbFjNyADL5ITN30FLbFjN4ADLxQDMxATXssVM][email protected]eiUmbhJGblRmI6YWYsNXZ91XXsISZ4RnchNnI6snI4FEepNnRvJXbhRnI&amp;6ICZ1JXY0l2buJCLiQ3bvxGdpBnRvJXbhRnI6ICdlFWbBRmdh5GdhdWZi0Xf" data-annotated="true"></div></div><div class="r-tab r-group-2" style="display:block; width: 100%"><div style="height: 260px" data-highchart="yes" data-encoded="}7JyYoFmc0JiO&amp;7JCd5BXZiojIhJXZhJSfsICbldWZuRmI6snIl5WYixWZkJiOmFGbzVWfsIyc]lJXalNnI6s1ei4WYtVmI6ISQkZXYuRXYnVmIsIyYvx2byJiOiMSOyEUNyUjI*sIibldWY0lmdlN0bs9mciojIjMkMzMkMBJCLiYWasx2TwF2YpRXeioDMuQDL$iQHayV2co9GbkJiOw4CMsICbp5WZXlGZ0hmI6QDLiQWY0FmI6s1W2ADL3ATX]ssVMyADLxYjNdxyWxgDMsEDM40FLbJDNwwyN0kTXss1MwADL2IzNdxyWzYDM][email protected]XsslN2ADLyMjNdxyW3IDMs0SMzUzMdxyW3gDMs0SM4EDNdxyW4QDMs0iM$0QTMdxyW5ADMs0CNykDMdxyW5YDMs0CNxUzNdxyWxAjMwwSLzMzNw0FLbFDM]4ADLtMzMyMTXssVMxQDMs0SNxMDOdxyWxIDMwwSL1QTN10FLbFjM2ADLtQTO#2kTXssVMzIDMs0SNyUzNdxyWxMDOwwSL2ADO10FLbFDN0ADLtIzM5YTXssVM][email protected]M3QDMsQTOzcTXssVM4ADMsQjN0ETXssVM4YDMsQjM4gTXdxiItFmcrVmc&amp;iozeiUmbhJGblRmI6YWYsNXZ91XXsISZ4RnchNnI6snI4FEepNnRvJXbhRnI#6ICZ1JXY0l2buJCLiQ3bvxGdpBnRvJXbhRnI6ICdlFWbBRmdh5GdhdWZi0Xf" data-annotated="true"></div></div><div class="r-tab r-group-3" style="display:block; width: 100%"><div style="height: 260px" data-highchart="yes" data-encoded="#[email protected]bzVWfsIyc$lJXalNnI6s1ei4WYtVmI6ISQkZXYuRXYnVmIsIyYvx2byJiOiMSOyEUNyUjI}sIibldWY0lmdlN0bs9mciojIjMkMzMkMBJCLiYWasx2TwF2YpRXeioDMuQDL$iQHayV2co9GbkJiOw4CMsICbp5WZXlGZ0hmI6QDLiQWY0FmI6s1W2ADLyQTM$dxyWxIDMsIDM40FLbFDOwwSL4ATOdxyWyQDMs0SMwQTXss1MwADLtgzMdxyW]zYDMscDNy0FLbRjMwwSOxATXssFN4ADLyMDO10FLbVDNwwiM1cTXsslNwADL#2QzNdxyW2YDMsQTO00FLbdjMwwSLycTNdxyW3gDMs0yN4gTXssFO0ADLtITM&amp;0UTXssVOwADLtIjM1cTXssVO2ADLtIjMxUTXssVMwIDMs0SM1kTOdxyWxADO}wwSL5YjMdxyWxEDNwwSLxYTO50FLbFjMwADLtEjNyATXssVMyYDMs0SMwUTO&amp;[email protected][email protected]TMyczNdxyWxgDMwwSMwkDM50FLbFDO2ADLxIzMxcTXdxiItFmcrVmc*iozeiUmbhJGblRmI6YWYsNXZ91XXsISZ4RnchNnI6snI4FEepNnRvJXbhRnI}6ICZ1JXY0l2buJCLiQ3bvxGdpBnRvJXbhRnI6ICdlFWbBRmdh5GdhdWZi0Xf" data-annotated="true"></div></div></div> 

(複製/粘貼到編輯器中看到3個的div,2被嵌入在第一)。

我一直沒能找到關於這種編碼格式的文檔(這不是普通的base64編碼),而且似乎網站已經發生了相當多的麻煩,以防止簡單的數據抓取。您可能想要查看是否可以通過其API訪問此數據。

1

您可以在適當的jQuery選擇器上使用highcharts插件。該 highcharts容器可以使用CSS選擇[data-highcharts-chart='0']

library(RSelenium) 
# Assume a Selenium server is accessible 
# $ docker run -d -p 4444:4444 selenium/standalone-firefox:2.53.0 
remDr <- remoteDriver() 
remDr$open() 
appURL <- "http://www.dotabuff.com/matches/2502387920" 
remDr$navigate(appURL) 
jsSTR <- 'var mychart = $("[data-highcharts-chart=\'0\']").highcharts(); 
    var xData = mychart.series[0].xData; 
    var yData = mychart.series[0].yData; 
    return {xdata:xData, ydata:yData};' 
remDr$executeScript(jsSTR) 
$xdata 
[1] 60 120 180 240 300 360 420 480 540 600 660 720 780 840 900 960 1020 
[18] 1080 1140 1200 1260 1320 1380 1440 1500 1560 1620 1680 1740 1800 1860 

$ydata 
[1] 126 203 -499 343 179 958 559 2858 496 686 483 -139 -722 -2627 
[15] -2914 -2472 -1427 -940 -1973 -1494 -1418 -1281 -1286 3176 4229 8278 9257 14010 
[29] 14490 14232 15150 
+0

這是正確的,當然在js世界中,但問題是解析數據後得到的[r] – jbkunst

+0

@jbkunst我已經擴展瞭如何使用R的代碼。 – jdharrison

+0

這是完美! – jbkunst