Anzeige
Archiv - Navigation
1832to1836
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Webabfrage

Webabfrage
28.05.2021 14:52:43
kabumdada
Hallo Zwenn und alle anderen,
kurz zur erklärung:
dank Zwenn konnte ich einen Kryptischen Datenstrom von der Homepage auslesen.
Diesen Datenstrom habe ich jetzt entschlüsselt und so aufbereitet wie ich ihn brauche ( in dem untenstehenden Arbeitsblatt auf dem Sheet Bereinigt zu finden).
Mein Problem ist jetzt folgendes:
in der Spalte a hab ich jetzt alle ID´s aufgeführt die ich benötige und möchte mit dem Unterprogramm "Game" im Modul1 jetzt selbiges spiel wie im Unterprogramm "tischtennis" durchführen. Leider bekomme ich dabei keinen Inhalt mit dem ich was anfangen kann von der Webseite zurück.
Wäre super, wenn mir jemand helfen könnte.
Um Aktuelle Daten abzurufen einfach Main() unter Modul2 ausführen. (Der Programmcode ist noch nicht perfekt aber funktioniert so bisher).
Excel-Datei ist hier zu finden:
https://www.herber.de/bbs/user/146413.xlsm
Vielen Dank schonmal für eure Hilfe.

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
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
Anzeige
AW: Webabfrage
29.05.2021 22:01:39
Zwenn
Hallo kabumdada
Ich habe Dir das Auslesen der Spiele komplett neu programmiert. Das Makro in der Datei ist ausführlich kommentiert. Du solltest damit in der Lage sein, die H2H Daten selber aufzubereiten. Die Tabelle Spiele enthält globale Formatierungen, wie Rahmen, Kopfzeile inkl. Färbung, Spaltenbreiten, Textausrichtung in den Spalten. Das Makro kümmert sich um individuelle Formatierungen für Sieger in Fett, gewonnen grün, verloren rot, sowohl für das ganze Spiel (Hintergründe der Zellen), wie auch für die einzelnen Sätze (Schriftfarbe der erreichten Pukte).
Ich habe insgesamt bis zu 7 Sätze vorgesehen, weil die Webseite diese abdeckt. Aber soweit ich es sehe, gibt es maximal 3 Gewinnsätze, was maximal 5 Sätze pro Spiel ergibt richtig? Du kannst dann die letzten 4 Spalten in der Tabelle einfach löschen. Das Makro würde Satz 6 und 7 zwar holen, wenn vorhanden, aber wenn nicht, dann eben nicht.
Falls Du die Spalten umsortieren willst, kannst Du das machen. Dazu änderst Du die Kopfzeile in der Tabelle und passt oben im Makro die Konstanten für die Spaltennummern an, fertig.
Insgesamt braucht das Makro bei mir keine 5 Sekunden, um die Tabelle voll formatiert mit (im Moment) 738 Spielen und den Daten dazu zu füllen. Dazu schalte ich die Bildschirmaktualisierung zu Beginn ab und am Ende wieder ein, was etwa 10 bis 15 Sekunden spart. Ich habe viele Testläufe gemacht, um unterschiedliche Dinge auszuprobieren. Der Datenabruf von der Webseite hat jedesmal ohne zu zicken funktioniert.
Aus dem abgerufenen String lassen sich noch andere Daten auslesen. Ich weiß aber nicht, wofür die alle im Einzelnen stehen. Was aber drin steht, sind unter anderem die vollen Namen, also inklusive ausgeschriebenen Vornamen. Du kannst Dir das Ganze ja so anpassen, wie Du es benötigst. Im Moment werden alle Spiele eingetragen, die im Datenstrom stehen. Das sind die beendeten der letzten X Stunden, die aktuell laufenden (mit aktellem Spielstand) und auch die kommenden für Y Stunden. Zu den kommenden werden natürlich keine Ergebnisse eingetragen oder Sieger hervorgehoben. Wenn Du nicht alle Spiele brauchst, musst Du die nicht benötigten rausschmeißen oder dafür sorgen, dass sie gar nicht erst mit in die Tabelle geschrieben werden. Bei jedem Abruf von Daten werden die neuen geholten Spiele hinter die bestehenden in der Tabelle geschrieben. Wenn Du einen Abgleich bestehender Spiele brauchst, musst Du Dir was basteln. Dazu habe ich mir keine Gedanken gemacht, das geht über die SpieleID aber auf jeden Fall.
Du solltest mit den Infos aus meinem vorherigen Posting und dem Makro in der angehängten Datei nun ohne größere Probleme erreichen, was Du möchtest.
https://www.herber.de/bbs/user/146436.xlsm
Viele Grüße,
Zwenn
Anzeige
AW: Webabfrage
29.05.2021 22:51:51
Zwenn
Eine Berichtigung
Habe im Makro für die Farbgebung der Spiel- und Satz-Ergebnisse ausversehen Strings miteinander verglichen. Kommt etwas schlecht, weil dann ist z.B. 11 kleiner als 9 und die Farbgebung war deshalb in solchen Fällen falsch. Habe das gefixt:
https://www.herber.de/bbs/user/146437.xlsm
AW: Webabfrage
31.05.2021 06:44:08
kabumdada
Hallo Zwenn,
ersteinmal vielen vielen Dank für deine Mühe. Werde das ganze mal ausprobieren und testen.
Du hast mir aber schon extrem weiter geholfen.
Ich hätte nur noch eine Frage:
Um beim Tischtennis die erste abfrage durchlaufen zu lassen hast du folgenden Pfad gewählt:
"http.Open "GET", "https://d.flashscore.de/x/feed/f_25_0_2_de_1", False
http.setRequestHeader "X-Fsign", "SW9D1eZo"
http.Send"
Wie bist du auf diesen Pfad gekommen? Beziehungsweise wie kann ich für andere Sportarten bspw. Basketball, Eishockey oder so diesen Pfad bestimmen um dann auf den Seiteninhalt zu zugreifen? Es ist ja nicht der normale Pfad um auf die Internetseite zu kommen.
Falls das ganze zu kompliziert zum erklären ist, könntest du mir für Basketball und Eishockey die Pfade noch zukommen lassen?
Vielen Dank nochmal für deine ganze Hilfe :)
Anzeige
AW: Webabfrage
31.05.2021 14:04:39
Zwenn
Hallo Marcel,
ich gebe Dir eine Schritt-Für-Schritt-Liste, wie Du an die URLs kommst. Natürlich habe ich auch bereits verschiedene Sportarten ausprobiert ;-) Für Tennis sieht es als sehr ähnliche Sportart so aus, als gehe es direkt. Ich glaube Frauen oder Männer wird nicht richtig erfasst. Aber Du musst sowieso für jede Sportart eine eigene Tabelle entwickeln, so wie ich es für Tischtennis gemacht habe.
Alles in allem brauchst Du meiner Wahrnehmung nach immer nur rausfinden, welche Daten sich hinter welchen Buchstabenkombinationen verbergen und dem entsprechend den Teil im Makro anzupassen, der für das Auslesen der gewünschten Daten aus dem Dictionary und das Schreiben in die Excel-Tabelle zuständig ist. Davon abweichend und im Makro eher umständlich gelöst, sind die Datensätze, die keine Spiele repräsentieren, aus denen Du aber Daten brauchst. Für Tischtennis sind das die beiden Werte ob Frauen oder Männer und der Name des Turniers.
Wie man an die URLs für die Sportarten kommt:
(Ich verwende dafür den FireFox. Wie es in anderen Browsern geht, musst Du ggf. selbst rausfinden.)
  • https://flashscore.de aufrufen

  • F12 drücken (es geht unten im Browser ein eigener Bereich auf)

  • Im unten erscheinenden Bereich auf den Tab Netzwerkanalyse klicken

  • Auf der Seite die Sportart auswählen, zu der Du die URL haben möchtest

  • Im unteren Bereich rattern alle Dateien durch, die zu der abgerufenen Seite geladen werden

  • Klicke in der Kopfzeile von Netzwerkanalyse auf Typ. Damit sortierst Du die Dateien nach Datentyp

  • Scrolle in den Bereich mit dem Datentyp plain

  • Dort suchst Du die Datei raus, die am größten ist (mehrere KB in der Spalte Größe) und klickst die Zeile an
    Hinweis: In der Spalte Datei kannst Du bereits die Endung der URL sehen. Die sind alle sehr ähnlich, weil die Sportarten wohl durchnummeriert sind. Im erscheinenden Tooltip am Mauszeiger steht die ganze URL

  • Im rechten Bereich geht ein weiterer Dialog mit eigenen Tabs auf. Dort klickst Du auf den Tab Antwort
    Du solltest jetzt den kryptisch anmutenden String sehen und weißt, das ist die richtige Datei

  • Klicke mit der rechten Maustaste auf die Zeile mit dem Dateieintrag

  • Im Kontextmenü gehst Du auf den obersten Eintrag Kopieren

  • Es klappt ein weiteres Menü aus, in dem Du wiederum den obersten Eintrag Adresse anklickst

  • Jetzt hast Du die URL in die Zwischenablage von Windows kopiert und kannst sie da einfügen, wo Du sie haben willst

  • Damit solltest Du klar kommen.
    Viele Grüße,
    Zwenn
    Anzeige
    AW: Webabfrage
    01.06.2021 13:29:13
    kabumdada
    Hallo Zwenn,
    vielen Dank für alles. Ich habe die Excel jetzt so zum laufen gebracht, wie ich mir das ganze gedacht habe. Das wäre ohne deine Hilfe nicht gegangen.
    Danke dafür und auch für die Anleitung für andere Sportarten.
    Somit ist mein Thread erledigt :)
    Vielen Dank und dir nur das Beste :)
    Das freut mich :-) [kwT]
    01.06.2021 15:31:15
    Zwenn

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige