feat: replace Kaggle CSV with Wikipedia scraper for historical match data

Add scripts/scrape-wikipedia.ts that fetches all 22 World Cups (1930–2022)
from English Wikipedia via MediaWiki API, handles group sub-pages, AET/penalty
detection, and goal parsing, writing openfootball-format JSON to app/data/openfootball/.

Rewrite scripts/seed.ts to read these local JSON files instead of the Kaggle
CSV, producing 965 matches and 2716 goals with per-group assignments for all
historical tournaments (enabling group standings on tournament pages).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-15 11:39:53 +02:00
co-authored by Claude Sonnet 4.6
parent 83b1ad3e35
commit 5dcd22ad22
88 changed files with 95625 additions and 127 deletions
@@ -0,0 +1,76 @@
{
"groups": [
{
"name": "Group A",
"teams": [
"Germany",
"Costa Rica",
"Poland",
"Ecuador"
]
},
{
"name": "Group B",
"teams": [
"England",
"Paraguay",
"Trinidad and Tobago",
"Sweden"
]
},
{
"name": "Group C",
"teams": [
"Argentina",
"Ivory Coast",
"Serbia and Montenegro",
"Netherlands"
]
},
{
"name": "Group D",
"teams": [
"Mexico",
"Iran",
"Angola",
"Portugal"
]
},
{
"name": "Group E",
"teams": [
"United States",
"Czech Republic",
"Italy",
"Ghana"
]
},
{
"name": "Group F",
"teams": [
"Australia",
"Japan",
"Brazil",
"Croatia"
]
},
{
"name": "Group G",
"teams": [
"South Korea",
"Togo",
"France",
"Switzerland"
]
},
{
"name": "Group H",
"teams": [
"Spain",
"Ukraine",
"Tunisia",
"Saudi Arabia"
]
}
]
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,52 @@
{
"stadiums": [
{
"name": "Allianz Arena",
"city": "Munich"
},
{
"name": "Zentralstadion",
"city": "Leipzig"
},
{
"name": "Gottlieb-Daimler-Stadion",
"city": "Stuttgart"
},
{
"name": "Frankenstadion",
"city": "Nuremberg"
},
{
"name": "Fritz-Walter-Stadion",
"city": "Kaiserslautern"
},
{
"name": "RheinEnergieStadion",
"city": "Cologne"
},
{
"name": "Westfalenstadion",
"city": "Dortmund"
},
{
"name": "Niedersachsenstadion",
"city": "Hanover"
},
{
"name": "Olympiastadion",
"city": "Berlin"
},
{
"name": "Volksparkstadion",
"city": "Hamburg"
},
{
"name": "Arena AufSchalke",
"city": "Gelsenkirchen"
},
{
"name": "Waldstadion",
"city": "Frankfurt"
}
]
}