Scraping
Browser-Setup
- WebDriver: thirtyfour 0.35
- ChromeDriver: localhost:9515 (systemd Service)
- Modus: Headless (konfigurierbar via
HEADLESSenv) - Navigation: 4 Versuche mit exponentiellem Backoff
- HTML-Parsing:
driver.source()+scrapercrate (eval_js gibt null zurueck!)
Neobet
URL: https://neobet.de/de/Sportwetten/Heute+Morgen/Fussball/Alle
Ablauf:
- Seite laden, bis zu 30s auf Rendering warten
- HTML-Source holen
- Liga-Links parsen:
a[href*="/Fussball/"] - Land + Liga aus Breadcrumbs extrahieren
Ergebnis: Vec<NeobetLeague> mit Land, Liga, Spielanzahl
Einzelne Liga-Matches: URL Sportwetten/{Heute|Morgen}/Fussball/{Land}/{Liga}
- Team-Paare aus Match-Containern extrahieren
Flashscore
Base URL: https://www.flashscore.com/
Match-Liste
Date Picker Navigation (URL-Param ?d= wird von der SPA ignoriert!):
- Flashscore laden, Cookies wegklicken
- Tage-Differenz berechnen (Heute = 0)
- Overlay-iFrames verstecken (
display:none) - Pfeil-Button klicken:
button[data-day-picker-arrow="next"]oder"prev" - 1.5s Pause nach jedem Klick
- Validierung:
button[data-testid="wcl-dayPickerButton"]Text pruefen (Format “DD/MM Tag”)
Match-Extraktion aus HTML:
- Laender-Header:
div.event__headermitspan.event__title--type - Match-Rows:
div.event__match - Match-ID:
id="g_1_{matchId}" - Team-IDs:
a.event__participant→ href/team/{name}/{teamId}/ - Zeiten:
div.event__time - Scores (beendete Spiele):
span.event__score
H2H (3 Seiten pro Match)
URL-Schema: /match/football/{homeId}/{awayId}/h2h/{tab}/?mid={matchId}
| Tab | Was |
|---|---|
home | Nur Heimspiele des Heimteams + Auswaertsspiele des Auswaertsteams |
away | Umgekehrt |
overall | Alle Spiele beider Teams |
Ablauf pro Seite:
- Navigieren, 3s warten
- “Show more” Buttons in allen Sektionen klicken
- HTML-Source holen
- Score-Elemente:
span.h2h__result > span > span(2 Child-Spans!) - Letzte 15 Ergebnisse pro Team extrahieren
Berechnungen aus Ergebnissen:
- Durchschnitte: avg_scored, avg_conceded (Tore erzielt/kassiert)
- Intervalle: Spiele zwischen Events fuer o1.5, o2.5, o3.5, o4.5, u0.5, u1.5, BTS, 1TS
- Streaks: Aktuelle Serie seit letztem Event
Odds (7 Seiten pro Match)
URL-Schema: Aus h2h_url die Match-Base ableiten, dann /odds/{suffix}/
| Seite | URL-Suffix | Spalten |
|---|---|---|
| O/U Full Time | odds/over-under/full-time/ | 2 + Threshold |
| O/U 1st Half | odds/over-under/1st-half/ | 2 + Threshold |
| O/U 2nd Half | odds/over-under/2nd-half/ | 2 + Threshold |
| BTTS | odds/both-teams-to-score/ | 2 |
| 1X2 | odds/1x2-odds/full-time/ | 3 |
| Double Chance | odds/double-chance/ | 3 |
| Draw No Bet | odds/draw-no-bet/ | 2 |
HTML-Selektoren:
- Zeile:
.ui-table__row - Buchmacher:
img[class*="logoImage"]→ alt - Schwellwert (O/U):
[class*="oddsValue"]→ Text - Quoten:
.oddsCell__odd→ Text
Averaging: Alle Buchmacher-Quoten pro Schwellwert gemittelt.
Error Handling: Graceful - Fehler bei einer Odds-Seite = warn-Log, Match wird ohne diese Quoten gespeichert.