AW: Webabfrage
29.05.2021 01:23:31
Zwenn
Hallo kabumdada
Ich habe jetzt etwas Detektiv gespielt und drei Makros geschrieben, an denen Du exemplarisch sehen kannst, wie Du Daten zu Spielern und H2H auslesen kannst. Das ist nicht vollständig, da ich nicht zeige, wie Du ein in HTML eingebettetes JSON verarbeiten musst. Es sind auch keine Schleifen enthalten, sonder nur statische Werte für IDs und Seitenzahlen. Ich habe weitestgehend alles in den Kommentaren erklärt. Wenn Du die Makros ausprobieren willst, brauchst Du nur die Pfade zum Speichern der Dateien ändern, damit sie zu Deinem System passen.
Ein Hinweis zu den Daten, die Du schon bearbeitet hast:
Dieses kryptische Format sind quasi drei ineinander verschachtelte CSV Dateien. Du kannst die als erstes mit Split und dem Delimiter (Trennzeichen) ~ auseinandernehmen. Das machst Du bereits. Jeden Datensatz im daraus entstehenden Array kannst Du dann aber weiter mit dem Delimiter ÷ noch einmal splitten. Im dann entstehenden Array splittest Du wiederum jeden Datensatz mit dem Delimiter ¬ So kommst Du mit einer Schleifenstruktur sauber an jeden Wert, ohne irgendwelche Stringoperationen durchführen zu müssen. Du brauchst Dann "nur noch" ein System, um die gewünschten Daten zu identifizieren. Ich nehme an, dass geht über die Buchstabenkürzel oder die Reihenfolge. Bin aber nicht sicher.
Übrigens stehen in den von Dir bereits bearbeiteten Daten auch die Spiel- und Satzergenisse drin. Wenn Du so eine Zeichenkette mal mit "Text in Spalten" und den von mir beschriebenen Delimitern auseinander genommen hast (nach ~ nur eine Zeile weiter verarbeiten und transponieren), kannst Du die leicht finden. Da musst Du nur sehen, wie Du bis zu sieben Sätze identifizierst. Aber auch da geht es evtl. über die Buchstabenkürzel oder Reihenfolge.
Hier die drei Makros
Spiel anhand der von Dir bereits isolierten ID:
Sub TischTennisSpiel()
'Aus dem zurückgelieferten HTML-Dokument,
'kann ein JSON ausgelesen werden, welches
'weiterverarbeitet werden muss, um daraus
'die Spieler-IDs auszulesen
'Diese werden im Makro TischTennisSpieler() verwendet
Const urlBase As String = "https://www.flashscore.de/spiel/"
Dim urlSpieleID As String
'Die Spiele-ID stammt aus den Basisdaten der Bereinigt-Tabelle
'Dies ist nur ein Beispiel, für die produktive Umsetzung wird
'eine Schleife verwendet, um alle Spiele abzuarbeiten
urlSpieleID = "6B6ehlk9"
With CreateObject("MSXML2.serverXMLHTTP.6.0")
.Open "GET", urlBase & urlSpieleID, False
.Send
'Speichern des zurückgelieferten HTML-Quelltextes
'Gewünschte Daten müssen ausgelesen werden
'(Dazu wird das Dokument nicht gespeichert)
'Das ist NICHT die Seite, die im Browser unter
'dem gleichen Link angezeigt wird
'Es ist eine HTML-Datei, die die auf der Seite
'verwendeten Daten im Rohformat in Form eines JSON
'enthält. Dieses befindet sich im ersten script-Tag
'im body und ist ziemlich groß
'Für den vorliegenden Zweck werden nur die SpielerIDs
'aus dem Bereich "participantsData" benötigt
'Das JSON muss also entsprechend auseinander genommen
'werden. Das geht entweder mit dem JsonConverter von
'Tim Hall:
'https://github.com/VBA-tools/VBA-JSON/blob/master/JsonConverter.bas
'über reguläre Ausdrücke oder mit String-Methoden, wie Instr(), usw.
'Den HTML-Quellcode, wie im Browser, bekommt man über xhr nicht,
'weil xhr kein JavaScript verarbeiten kann
Close
'Pfad anpassen
Open "D:\Documents\Sven\Herber Excel Forum\TischTennis Turnier Infos auslesen\resultSpiel.htm" For Output As #1
Print #1, .responsetext
Close
End With
End Sub
Spieldaten zu einem Spieler:
Sub TischTennisSpieler()
'In diesem Makro werden die SpielerIDs verwendet,
'die mit dem Makro TischTennisSpiel() in einem
'JSON geliefert werden
Const urlBase As String = "https://d.flashscore.de/x/feed/pr_25_158_"
Const urlEnde As String = "_2_de_1"
Dim urlSpielerID As String
Dim urlSeite As Long
'Die SpielerID und die Seitenzahl sind
'der dynamische Bestandteil einer URL
'zu den Daten eines bestimmten Spielers
'SpielerID Beispiel Vasily Shirshov
'In der Praxis eine äußere Schleife
urlSpielerID = "hnmgv9kK"
'Kryptische Textdatei mit den ersten beendeten Spielen
'Heutige und laufende Spiele sind da erstmal nicht mit
'drin soweit ich gesehen habe
'Dei Seitenzahl wird in einer inneren Schleife so lange
'hochgezählt, bis ein leerer String zurückgeliefert wird
'Bei Vasily Shirshov sind das 20 Seiten mit Daten
'In wei weit doppelte dabei sind habe ich nicht untersucht
urlSeite = 0
With CreateObject("MSXML2.serverXMLHTTP.6.0")
'https://d.flashscore.de/x/feed/pr_25_158_hnmgv9kK_1_2_de_1
.Open "GET", urlBase & urlSpielerID & "_" & urlSeite & urlEnde, False
.setRequestHeader "X-Fsign", "SW9D1eZo"
.Send
'Speichern der zurückgelieferten Zeichenkette
'Nur zur Veranschaulichung
'Gewünschte Daten müssen ausgelesen werden
'(Dazu wird das Dokument nicht gespeichert)
Close
'Pfad anpassen
Open "D:\Documents\Sven\Herber Excel Forum\TischTennis Turnier Infos auslesen\resultSpieler.txt" For Output As #1
Print #1, .responsetext
Close
End With
End Sub
H2H Daten zu einem Spiel:
Sub TischTennisH2H()
'Dieses Makro liefert die H2H Daten zu einem Spiel
'Diese liegen im gleichen kryptischen Format vor,
'wie die als erstes geholten Daten zur Übersicht
'aller Spiele
Const urlBase As String = "https://d.flashscore.de/x/feed/df_hh_1_"
Dim urlSpieleID As String
urlSpieleID = "6B6ehlk9"
With CreateObject("MSXML2.serverXMLHTTP.6.0")
.Open "GET", urlBase & urlSpieleID, False
.setRequestHeader "X-Fsign", "SW9D1eZo"
.Send
'Speichern der zurückgelieferten Zeichenkette
'Nur zur Veranschaulichung
'Gewünschte Daten müssen ausgelesen werden
'(Dazu wird das Dokument nicht gespeichert)
Close
'Pfad anpassen
Open "D:\Documents\Sven\Herber Excel Forum\TischTennis Turnier Infos auslesen\resultH2H.txt " For Output As #1
Print #1, .responsetext
Close
End With
End Sub
Beachte bitte, falls Du alle Daten auf einmal ausliest, also dann wirklich zu allen SpieleIDs, dann kommt da eine große Menge zusammen. Überlege Dir also gut, wie Du die Daten in den Tabellen organisieren willst, damit Du anschließend noch etwas damit anfangen kannst. So rate ich z.B. dringend davon ab, für jeden H2H-Abruf eine eigene Tabelle anzulegen. Hau alle Datensätze zu einem Thema in eine Tabelle. Sonst kommst Du sehr schnell über 1.000 Tabellen. Du musst Dir vermutlich auch überlegen, wie Du doppelte Datensätze los wirst, da z.B. zu unterschiedlichen Spielern, die aufeinander getroffen sind, gleiche Datenätze bei Beiden ausgelesen werden.
Ich hoffe das hilft Dir weiter.
Viele Grüße,
Zwenn