2014-03-01 105 views
6

我試圖以提取下列信息:如何刮這個squawka頁面?

在頁面

http://epl.squawka.com/stoke-city-vs-arsenal/01-03-2014/english-barclays-premier-league/matches

按下紅色「完整統計」按鈕,打開一個含有菜單(左側)按鈕「十字架」。在屏幕的右側打開一個帶有19個箭頭的足球場的圖像,這些是Stoke-Arsenal比賽中Stoke的十字路口。它們是彩色編碼的,紅色=未完成,綠色=已完成,黃色=關鍵傳球。 當你點擊一個箭頭時,它會告訴你誰是誰傳球並在比賽的哪一分鐘。 此外,箭頭顯示了球員在傳球時的位置以及球員被傳球的位置。

我希望能夠湊這個頁面,這樣我得到一個表中的列:

團隊;名稱的發送者;位置的發送者;位置的接收器;分鐘;顏色的箭頭

這是斯托克做的交叉傳球,我也想自動地重複這個阿森納(因此,在上表中的「俱樂部」列)。

儘管我過去曾經刮過網頁,但這些網頁都是靜態的,相當直接的頁面,我對如何從這個頁面上刮取信息完全傻眼了。 我真的很感謝如何刮掉剛剛描述的數據。我對R很熟悉,所以我會特別欣賞能夠幫助我在R中實現這一目標的代碼,但我也非常感謝使用其他語言或軟件的幫助。

謝謝 彼得

+0

你可能必須使用瀏覽器驅動器,如硒。有R接口;請參閱http://lluisramon.github.io/relenium/和http://johndharrison.github.io/RSelenium/。 – Ista

+0

我從來沒有聽說過這樣的事情,新作業!我將如何使用它在squawka上刮這樣一個頁面?任何提示? –

+0

有一個很好的例子,就是如何在R中使用Selenium [這裏](http://stackoverflow.com/a/22123344/1036500),目前這個問題的答案正好在你的[R標籤]之上, (http://stackoverflow.com/questions/tagged/r) – Ben

回答

9

彼得的人表示可以用硒做到這一點。我也喜歡用優秀的selectr package 這個想法是簡單地與網站互動,然後在其他地方做。 squawkData應該包含所需的一切。

# RSelenium::startServer() # if needed 
require(RSelenium) 
remDr <- remoteDriver() 
remDr$open() 
remDr$setImplicitWaitTimeout(3000) 
remDr$navigate("http://epl.squawka.com/stoke-city-vs-arsenal/01-03-2014/english-barclays-premier-league/matches") 
squawkData <- remDr$executeScript("return new XMLSerializer().serializeToString(squawkaDp.xml);", list()) 
require(selectr) 
example <- querySelectorAll(xmlParse(squawkData[[1]]), "crosses time_slice") 
example[[1]] 


<time_slice name="0 - 5" id="1"> 
    <event player_id="531" mins="4" secs="39" minsec="279" team="44" type="Failed"> 
    <start>73.1,87.1</start> 
    <end>97.9,49.1</end> 
    </event> 
</time_slice> 

免責聲明我是RSelenium軟件包的作者。操作的基本小貼士可以在RSelenium basicsRSelenium: Testing Shiny apps查看。

進一步信息可以很容易地使用selectr訪問:

> xmlValue(querySelectorAll(xmlParse(squawkData[[1]]), "players #531 name")[[1]]) 
[1] "Charlie Adam" 

> xmlValue(querySelectorAll(xmlParse(squawkData[[1]]), "game team#44 long_name")[[1]]) 
[1] "Stoke City" 

UPDATE:
要處理例如成數據幀,你可以這樣做

out <- lapply(example, function(x){ 
# handle each event 
    if(length(x['event']) > 0){ 
    res <- lapply(x['event'], function(y){ 
     matchAttrs <- as.list(xmlAttrs(y)) 
     matchAttrs$start <- xmlValue(y['start']$start) 
     matchAttrs$end <- xmlValue(y['end']$end) 
     matchAttrs 
    }) 
    return(do.call(rbind.data.frame, res)) 
    } 
} 
) 

> head(do.call(rbind, out)) 
     player_id mins secs minsec team type  start  end 
event   531 4 39 279 44 Failed 73.1,87.1 97.9,49.1 
event5  311 6 33 393 31 Failed 92.3,13.1 93.0,31.0 
event1  376 8 57 537 31 Failed 97.7,6.1 96.7,16.4 
event6  311 13 50 830 31 Failed 99.5,0.5 94.9,42.6 
event11  311 14 11 851 31 Failed 99.5,0.5 93.1,51.0 
event7  311 17 41 1061 31 Failed 99.5,99.5 92.6,50.1 
+0

謝謝,約翰,這工作得很好,我已經研究了好幾個小時了。 我還有兩個問題:1。你怎麼知道解決「squawkaDp.xml」? 2.我會艾克產生的列 player_id,分鐘,秒,MINSEC,團隊,類型,運行startx,startY,endX,恩迪 一個數據框(或類似的東西),這將讀取 531 ,4,39,279,44,「失敗」,73.1,87.1,97.9,49.1, 311,6「,33,393,31,」失敗「,92.3,13.1,93.0,31.0, ,376,85, 537,31,「失敗」,97.7,6.1,96.7,16.4 等等(總共38行) 我該怎麼做?XMLNodeSets總是完全逃脫我.. –

+0

@PeterVerbeet我很高興這個例子爲你工作。可以開始點擊butto ns等,但是數據包含在可縮放矢量圖形格式中。獲取源代碼更容易。我查看了http://epl.squawka.com/scripts/squawkaDp_v10.30.js?v=7在這個文件中搜索'showCrosses函數:',在這個函數中注意到'var var line \t = \t $(squawkaDp .xml).find('crosses')'。關於你的第二個問題,我將在上面的代碼中添加一個快速指針。 – jdharrison

+0

非常感謝,約翰,這個作品非常出色!我顯然需要深入瞭解一些文獻,以便能夠在其他網站上進一步瞭解和執行此操作。有小費嗎? 無論如何,我將在未來使用您的RSelenium軟件包,感謝您提供非常有用的幫助和時間! –