2014-03-01 9 views
6

Ich versuche, die folgenden Informationen zu extrahieren:Wie kratze ich diese Squawka-Seite?

auf der Seite

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

Drücken der roten „vollständigen statistiken“ Taste öffnet ein Menü, das (auf der linken Seite) auf den Button enthält " Kreuze ". Dies öffnet, auf der rechten Seite des Bildschirms, ein Bild von einem Fußballfeld mit 19 Pfeilen darauf, das sind die Kreuzpässe von Stoke im Stoke-Arsenal-Spiel. Sie sind farbcodiert, rot = nicht abgeschlossen, grün = abgeschlossen, gelb = Taste passiert. Wenn Sie auf einen Pfeil klicken, wird Ihnen angezeigt, wer den Pass gegeben hat und in welcher Minute des Spiels. Die Pfeile zeigen auch, wo der Spieler stand, als er den Pass gab und wo der Spieler war, an den er weitergeleitet wurde.

Ich mag wäre in der Lage sein, um diese Seite zu kratzen, so dass ich eine Tabelle mit den Spalten erhalten:

Team; Name des Absenders; Senderort; Ort des Empfängers; Minute; Pfeil-Farbe

Dies ist die Menge der Cross-Pässe von Stoke gemacht, ich möchte dies auch automatisch für Arsenal wiederholen (daher die Spalte "Club" in der Tabelle oben).

Obwohl ich Webseiten in der Vergangenheit geschabt habe, waren diese alle statisch ziemlich gerade Seiten, und ich bin total verblüfft, wie man die Informationen von dieser Seite kratzt. Ich würde wirklich Hilfe schätzen, wie man die Daten kratzt, die ich gerade beschrieb. Ich bin sehr versiert in R, daher würde ich besonders den Code schätzen, der mir helfen würde, dies in R zu erreichen, aber ich bin auch sehr dankbar für Hilfe, die andere Sprache oder Software verwendet.

Danke, Peter

+0

tun können, Sie werden wahrscheinlich einen Browser-Treiber verwenden müssen wie Selen. Es gibt R Schnittstellen; siehe http://lluisramon.github.io/relenium/ und http://johndharrison.github.io/RSelenium/. – Ista

+0

Ich hatte noch nie von so etwas gehört, neue Hausaufgaben! Wie würde ich das verwenden, um eine Seite wie diese auf Squawka zu kratzen? Irgendwelche Hinweise? –

+0

Es gibt ein schönes Beispiel dafür, wie man Selenium mit 'R' einfach [hier] (http://stackoverflow.com/a/22123344/1036500) verwendet, momentan eine Antwort auf die Frage direkt auf dem [R tag] (http://stackoverflow.com/questions/tagged/r) – Ben

Antwort

9

Peter als die Jungs angegeben Sie dies mit Selen zu tun. Ich benutze auch gerne die ausgezeichnete selectr package Die Idee ist, kurz mit der Website interagieren dann den Rest an anderer Stelle. SquawkData sollte alles enthalten, was benötigt wird.

# 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> 

HAFTUNGSAUSSCHLUSS Ich bin der Autor des RSelenium Paket. Eine grundlegende Vignette zum Betrieb kann unter RSelenium basics und RSelenium: Testing Shiny apps angesehen werden.

Weitere Informationen leicht mit selectr zugegriffen werden kann:

> 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:
Zum Beispiel in einem Datenrahmen verarbeiten Sie so etwas wie

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

Danke, John, das funktioniert sehr gut, ich habe es seit mehreren Stunden studiert. Ich habe zwei verbleibende Fragen: 1.Woher weißt du, dass du "squawkaDp.xml" ansprechen musst? 2. Ich würde ike einen Datenrahmen (oder so ähnlich) mit Säulen player_id, Minuten, Sekunden, minsec, Team, Typ, startX, startY, ENDX, Endy die 531 lesen würde erzeugen 4, 39, 279, 44, "Failed", 73.1, 87.1, 97.9, 49.1 311, 6 ", 33, 393, 31," Fehlgeschlagen ", 92.3, 13.1, 93.0, 31.0 376, 8, 57, 537, 31, "Failed", 97.7, 6.1, 96.7, 16.4 et cetera (für insgesamt 38 Zeilen) Wie kann ich das? XMLNodeSets immer total entkommen .. –

+0

@PeterVerbeet Ich bin froh, das Beispiel für Sie gearbeitet Es wäre möglich gewesen, auf Butto zu klicken ns usw. auf der Website, aber die Daten sind in einem skalierbaren Vektorgrafikformat enthalten. Es war einfacher, die Quelle zu bekommen. Ich schaute auf http://epl.squawka.com/scripts/squawkaDp_v10.30.js?v=7 in dieser Datei Suche nach 'showCrosses Funktion:' und in dieser Funktion beachten Sie die Zeile 'var Kreuze \t = \t $ (squawkaDp .xml) .find ('crosses') '. In Bezug auf Ihre zweite Frage werde ich einen kurzen Zeiger im obigen Code hinzufügen. – jdharrison

+0

Vielen Dank, John, das funktioniert hervorragend! Ich muss ganz klar in etwas Literatur eintauchen, um es auf anderen Webseiten besser verstehen zu können. Irgendwelche Tipps? Ich werde auf jeden Fall in Zukunft viel von Ihrem RSelenium-Paket Gebrauch machen, danke für Ihre sehr nützliche Hilfe und Zeit! –