Datenscraping

Was ist Datenscraping?

Datenscraping ist der Prozess des automatisierten Extrahierens von Informationen aus Webseiten. In diesem Projekt verwende ich Datenscraping, um aktuelle Fußballspieldaten zu sammeln, die ich für die Bewertung der Spieler benötige.

Tools und Bibliotheken

Um Daten zu scrapen, können verschiedene Tools und Bibliotheken verwendet werden. Zu den beliebtesten gehören:

  • BeautifulSoup: Eine Bibliothek zum Parsen von HTML- und XML-Dokumenten und zum Extrahieren von Daten daraus.

  • Selenium: Ein Tool zur Automatisierung von Webbrowsern, das auch zum Scrapen von dynamisch geladenen Inhalten verwendet werden kann.

  • Requests: Eine Bibliothek zum Senden von HTTP-Anfragen und zum Abrufen von Inhalten aus Webseiten.

Wer bietet überhaupt Event-Daten auf seiner Internetseite an?

Für einige andere Projekte habe ich bereits eigene Scraper geschrieben, um z.B. Spielerdaten von transfermarkt oder Match-Statistiken vom DFB. Unsere Event-Daten beziehen wir von whoscored.com. Es gab in der Vergangenheit immer auch mal andere Seiten und Anbieter (DFB MatchCenter oder Fivethirtyeight), aber Stand heute (Juni 2024) ist whoscored die beste Quelle für eine Vielzahl an Wettbewerben und Saisons. Whoscored bietet ein eigenes Matchcenter an, welches auf Basis von Eventdaten visualisiert wird. Diese Daten liegen im Quellcode der Seite vor und können mit einem Scraper ausgelesen werden. Whoscored Daten basieren auf den Daten von Opta.

Welche Wettbewerbe werden von whoscored abgedeckt?

Detailed statistics (Opta) for Premier League (England), Serie A (Italy), La Liga (Spain), Bundesliga (Germany), Ligue 1 (France), Championship (England), Eredivisie (Netherlands), Premier League (Russia), MLS (USA), Super Lig (Turkey), Serie A (Brazil) & UEFA Champions League & Europa League (https://www.whoscored.com/AboutUs)

Wie funktioniert das Scrapen von Daten nun konkret?

Das Scrapen von Daten erfolgt in mehreren Schritten:

Zuerst benötigen wir die URL des Spiels, von dem wir die Daten sammeln möchten. Diese URL wird dann an den Scraper übergeben, der die Seite herunterlädt und den HTML-Code extrahiert.

Dann müssen wir die relevanten Daten aus dem HTML-Code extrahieren. Dazu verwenden wir die BeautifulSoup-Bibliothek, die es uns ermöglicht, den HTML-Code zu durchsuchen und die gewünschten Daten zu finden.

Aus dem HTML-Code können wir dann die benötigten Daten extrahieren und in einem geeigneten Format speichern, z.B. in einer CSV-Datei oder in eine JSON-Datei. Ich rate zu JSON-Dateien, da diese später einfach mit Python zu verarbeiten sind.

Ein Spiel sind nicht alle Spiele. Damit ich nicht jede einzelne URL von Hand eingeben muss, scrape ich vorher noch die URLs aller Spiele einer Saison und speichere sie in einer Datei ab. Diese Datei wird dann vom Scraper gelesen und so werden nach und nach die Daten für jedes Spiel gesammelt.

Herausforderungen

Da whoscored einige Maßnahmen ergriffen hat, um das Scrapen ihrer Seite zu erschweren, müssen wir auch einige Tricks anwenden, um die Daten zu erhalten:

  • Setzen von Headern und Cookies, um den Zugriff auf die Seite als Mensch zu simulieren (Selenium)

  • Verwendung von Zeitverzögerungen, um zu verhindern, dass die Seite den Zugriff blockiert

  • Verwendung von Proxies, um den Zugriff auf die Seite zu anonymisieren und zu verhindern, dass die IP-Adresse blockiert wird

Es gibt viele Bibliotheken und Tools, die das Scrapen von Daten erleichtern, aber es erfordert immer noch ein gewisses Maß an technischem Verständnis und Erfahrung, um die Daten erfolgreich zu sammeln. Die meisten Webseiten ändern regelmäßig ihre Struktur, um das Scrapen ihrer Daten zu erschweren. Daher ist es wichtig, den Scraper regelmäßig zu überprüfen und anzupassen, um sicherzustellen, dass er weiterhin funktioniert.

Ich habe mit der Bibliothek Soccerdata gearbeitet, musste aber immer wieder Teile im Code verändern und individuell anpassen, da whoscored immer wieder minimale Änderungen vorgenommen hat und die Bibliothek bis zum neuen Release nicht mehr funktioniert hat.

Fazit

Über Monate hinweg habe ich die Daten für die Saisons 2022/23 und 2023/24 gesammelt und den Datenbestand immer wieder aktualisiert: Über 8000 Spiele aus 13 Wettbewerben machen mehr als 10 Millionen Events und schon mehr als 10 GB an (Roh-)Daten.

  • Empfehlung für ein tieferes Verständnis bzgl. Datenscraping auf aktuellem Stand: John Watson Rooney

Code Beispiel

Snippet für die Anwendung von Soccerdata, um die Daten der Bundesliga aus der Saison 2023-24 zu sammeln:

import soccerdata as sd

league = 'GER-Bundesliga'
season = '23-24'

whoscored = sd.WhoScored(leagues=[league], seasons=season)
# load the schedule for the selected leagues and seasons and store all gameurls in a dataframe
df = whoscored.read_schedule()

# remove all games that are not finished yet
df = df.loc[~df['url'].str.contains('Show')]
df = df.sort_values(by='date')

# iterate over all rows in the dataframe and process each game
def process_row(row):
    match_id = row['game_id']
    try:
        print(f"processing match: {match_id}")
        whoscored.read_events(match_id=match_id, force_cache=True, output_fmt='events')
    except Exception as e:
        print(f"error while processing match: {match_id}")
        print(f"errordetails: {e}")

df.apply(process_row, axis=1)