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
parent 83b1ad3e35
commit 5dcd22ad22
88 changed files with 95625 additions and 127 deletions
@@ -0,0 +1,37 @@
{
"groups": [
{
"name": "Group 1",
"teams": [
"France",
"Mexico",
"Argentina",
"Chile"
]
},
{
"name": "Group 2",
"teams": [
"Yugoslavia",
"Brazil",
"Bolivia"
]
},
{
"name": "Group 3",
"teams": [
"Romania",
"Peru",
"Uruguay"
]
},
{
"name": "Group 4",
"teams": [
"United States",
"Belgium",
"Paraguay"
]
}
]
}
+605
View File
@@ -0,0 +1,605 @@
{
"matches": [
{
"round": "Group stage",
"group": "Group 1",
"date": "1930-07-13",
"time": "15:00",
"team1": "France",
"team2": "Mexico",
"score": {
"ft": [
4,
1
]
},
"goals1": [
{
"name": "L. Laurent",
"minute": 19
},
{
"name": "Langiller",
"minute": 40
},
{
"name": "Maschinot",
"minute": 43
},
{
"name": "Maschinot",
"minute": 87
}
],
"goals2": [
{
"name": "Carreño",
"minute": 70
}
],
"ground": "Estadio Pocitos, Montevideo"
},
{
"round": "Group stage",
"group": "Group 1",
"date": "1930-07-15",
"time": "16:00",
"team1": "Argentina",
"team2": "France",
"score": {
"ft": [
1,
0
]
},
"goals1": [
{
"name": "Monti",
"minute": 81
}
],
"ground": "Estadio Parque Central, Montevideo"
},
{
"round": "Group stage",
"group": "Group 1",
"date": "1930-07-16",
"time": "14:45",
"team1": "Chile",
"team2": "Mexico",
"score": {
"ft": [
3,
0
]
},
"goals1": [
{
"name": "Vidal",
"minute": 3
},
{
"name": "Vidal",
"minute": 65
},
{
"name": "M. Rosas",
"minute": 52,
"owngoal": true
}
],
"ground": "Estadio Parque Central, Montevideo"
},
{
"round": "Group stage",
"group": "Group 1",
"date": "1930-07-19",
"time": "12:50",
"team1": "Chile",
"team2": "France",
"score": {
"ft": [
1,
0
]
},
"goals1": [
{
"name": "Subiabre",
"minute": 67
}
],
"ground": "Estadio Centenario, Montevideo"
},
{
"round": "Group stage",
"group": "Group 1",
"date": "1930-07-19",
"time": "15:00",
"team1": "Argentina",
"team2": "Mexico",
"score": {
"ft": [
6,
3
]
},
"goals1": [
{
"name": "Stábile",
"minute": 8
},
{
"name": "Stábile",
"minute": 17
},
{
"name": "Stábile",
"minute": 80
},
{
"name": "Zumelzú",
"minute": 12
},
{
"name": "Zumelzú",
"minute": 55
},
{
"name": "Varallo",
"minute": 53
}
],
"goals2": [
{
"name": "M. Rosas",
"minute": 42,
"penalty": true
},
{
"name": "M. Rosas",
"minute": 65
},
{
"name": "Gayón",
"minute": 75
}
],
"ground": "Estadio Centenario, Montevideo"
},
{
"round": "Group stage",
"group": "Group 1",
"date": "1930-07-22",
"time": "14:45",
"team1": "Argentina",
"team2": "Chile",
"score": {
"ft": [
3,
1
]
},
"goals1": [
{
"name": "Stábile",
"minute": 12
},
{
"name": "Stábile",
"minute": 13
},
{
"name": "M. Evaristo",
"minute": 51
}
],
"goals2": [
{
"name": "Subiabre",
"minute": 15
}
],
"ground": "Estadio Centenario, Montevideo"
},
{
"round": "Group stage",
"group": "Group 2",
"date": "1930-07-14",
"time": "12:45",
"team1": "Yugoslavia",
"team2": "Brazil",
"score": {
"ft": [
2,
1
]
},
"goals1": [
{
"name": "Tirnanić",
"minute": 21
},
{
"name": "Bek",
"minute": 30
}
],
"goals2": [
{
"name": "Preguinho",
"minute": 62
}
],
"ground": "Estadio Parque Central, Montevideo"
},
{
"round": "Group stage",
"group": "Group 2",
"date": "1930-07-17",
"time": "12:45",
"team1": "Yugoslavia",
"team2": "Bolivia",
"score": {
"ft": [
4,
0
]
},
"goals1": [
{
"name": "Bek",
"minute": 60
},
{
"name": "Bek",
"minute": 67
},
{
"name": "Marjanović",
"minute": 65
},
{
"name": "Vujadinović",
"minute": 85
}
],
"ground": "Estadio Parque Central, Montevideo"
},
{
"round": "Group stage",
"group": "Group 2",
"date": "1930-07-20",
"time": "13:00",
"team1": "Brazil",
"team2": "Bolivia",
"score": {
"ft": [
4,
0
]
},
"goals1": [
{
"name": "Moderato",
"minute": 37
},
{
"name": "Moderato",
"minute": 73
},
{
"name": "Preguinho",
"minute": 57
},
{
"name": "Preguinho",
"minute": 83
}
],
"ground": "Estadio Centenario, Montevideo"
},
{
"round": "Group stage",
"group": "Group 3",
"date": "1930-07-14",
"time": "14:50",
"team1": "Romania",
"team2": "Peru",
"score": {
"ft": [
3,
1
]
},
"goals1": [
{
"name": "Deșu",
"minute": 1
},
{
"name": "Stanciu",
"minute": 79
},
{
"name": "Kovács",
"minute": 89
}
],
"goals2": [
{
"name": "De Souza",
"minute": 75
}
],
"ground": "Estadio Pocitos, Montevideo"
},
{
"round": "Group stage",
"group": "Group 3",
"date": "1930-07-18",
"time": "14:30",
"team1": "Uruguay",
"team2": "Peru",
"score": {
"ft": [
1,
0
]
},
"goals1": [
{
"name": "Castro",
"minute": 65
}
],
"ground": "Estadio Centenario, Montevideo"
},
{
"round": "Group stage",
"group": "Group 3",
"date": "1930-07-21",
"time": "14:50",
"team1": "Uruguay",
"team2": "Romania",
"score": {
"ft": [
4,
0
]
},
"goals1": [
{
"name": "Dorado",
"minute": 7
},
{
"name": "Scarone",
"minute": 26
},
{
"name": "Anselmo",
"minute": 31
},
{
"name": "Cea",
"minute": 35
}
],
"ground": "Estadio Centenario, Montevideo"
},
{
"round": "Group stage",
"group": "Group 4",
"date": "1930-07-13",
"time": "15:00",
"team1": "United States",
"team2": "Belgium",
"score": {
"ft": [
3,
0
]
},
"goals1": [
{
"name": "McGhee",
"minute": 23
},
{
"name": "Florie",
"minute": 45
},
{
"name": "Patenaude",
"minute": 69
}
],
"ground": "Estadio Parque Central, Montevideo"
},
{
"round": "Group stage",
"group": "Group 4",
"date": "1930-07-17",
"time": "14:45",
"team1": "United States",
"team2": "Paraguay",
"score": {
"ft": [
3,
0
]
},
"goals1": [
{
"name": "Patenaude",
"minute": 10
},
{
"name": "Patenaude",
"minute": 15
},
{
"name": "Patenaude",
"minute": 50
}
],
"ground": "Estadio Parque Central, Montevideo"
},
{
"round": "Group stage",
"group": "Group 4",
"date": "1930-07-20",
"time": "15:00",
"team1": "Paraguay",
"team2": "Belgium",
"score": {
"ft": [
1,
0
]
},
"goals1": [
{
"name": "Vargas Peña",
"minute": 40
}
],
"ground": "Estadio Centenario, Montevideo"
},
{
"round": "Semi-finals",
"date": "1930-07-26",
"time": "14:45",
"team1": "Argentina",
"team2": "United States",
"score": {
"ft": [
6,
1
]
},
"goals1": [
{
"name": "Monti",
"minute": 20
},
{
"name": "Scopelli",
"minute": 56
},
{
"name": "Stábile",
"minute": 69
},
{
"name": "Stábile",
"minute": 87
},
{
"name": "Peucelle",
"minute": 80
},
{
"name": "Peucelle",
"minute": 85
}
],
"goals2": [
{
"name": "Brown",
"minute": 89
}
],
"ground": "Estadio Centenario, Montevideo"
},
{
"round": "Semi-finals",
"date": "1930-07-27",
"time": "14:45",
"team1": "Uruguay",
"team2": "Yugoslavia",
"score": {
"ft": [
6,
1
]
},
"goals1": [
{
"name": "Cea",
"minute": 18
},
{
"name": "Cea",
"minute": 67
},
{
"name": "Cea",
"minute": 72
},
{
"name": "Anselmo",
"minute": 20
},
{
"name": "Anselmo",
"minute": 31
},
{
"name": "Iriarte",
"minute": 61
}
],
"goals2": [
{
"name": "Vujadinović",
"minute": 4
}
],
"ground": "Estadio Centenario, Montevideo"
},
{
"round": "Final",
"date": "1930-07-30",
"time": "12:45",
"team1": "Uruguay",
"team2": "Argentina",
"score": {
"ft": [
4,
2
]
},
"goals1": [
{
"name": "Dorado",
"minute": 12
},
{
"name": "Cea",
"minute": 57
},
{
"name": "Iriarte",
"minute": 68
},
{
"name": "Castro",
"minute": 89
}
],
"goals2": [
{
"name": "Peucelle",
"minute": 20
},
{
"name": "Stábile",
"minute": 37
}
],
"ground": "Estadio Centenario, Montevideo"
}
]
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,16 @@
{
"stadiums": [
{
"name": "Estadio Pocitos",
"city": "Montevideo"
},
{
"name": "Estadio Parque Central",
"city": "Montevideo"
},
{
"name": "Estadio Centenario",
"city": "Montevideo"
}
]
}