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:
@@ -0,0 +1,692 @@
|
||||
{
|
||||
"matches": [
|
||||
{
|
||||
"round": "Round of 16",
|
||||
"date": "1938-06-04",
|
||||
"time": "17:00",
|
||||
"team1": "Switzerland",
|
||||
"team2": "Germany",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
1
|
||||
],
|
||||
"et": [
|
||||
1,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Abegglen",
|
||||
"minute": 43
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Gauchel",
|
||||
"minute": 29
|
||||
}
|
||||
],
|
||||
"ground": "Parc des Princes, Paris"
|
||||
},
|
||||
{
|
||||
"round": "Round of 16",
|
||||
"date": "1938-06-05",
|
||||
"time": "17:00",
|
||||
"team1": "Hungary",
|
||||
"team2": "Dutch East Indies",
|
||||
"score": {
|
||||
"ft": [
|
||||
6,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Kohut",
|
||||
"minute": 13
|
||||
},
|
||||
{
|
||||
"name": "Toldi",
|
||||
"minute": 15
|
||||
},
|
||||
{
|
||||
"name": "G. Sárosi",
|
||||
"minute": 25
|
||||
},
|
||||
{
|
||||
"name": "G. Sárosi",
|
||||
"minute": 89
|
||||
},
|
||||
{
|
||||
"name": "Zsengellér",
|
||||
"minute": 30
|
||||
},
|
||||
{
|
||||
"name": "Zsengellér",
|
||||
"minute": 76
|
||||
}
|
||||
],
|
||||
"ground": "Vélodrome Municipal, Reims"
|
||||
},
|
||||
{
|
||||
"round": "Round of 16",
|
||||
"date": "1938-06-05",
|
||||
"team1": "Sweden",
|
||||
"team2": "Austria",
|
||||
"ground": "Stade Gerland, Lyon"
|
||||
},
|
||||
{
|
||||
"round": "Round of 16",
|
||||
"date": "1938-06-05",
|
||||
"time": "17:00",
|
||||
"team1": "Cuba",
|
||||
"team2": "Romania",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
2
|
||||
],
|
||||
"et": [
|
||||
3,
|
||||
3
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Socorro",
|
||||
"minute": 44
|
||||
},
|
||||
{
|
||||
"name": "Socorro",
|
||||
"minute": 103
|
||||
},
|
||||
{
|
||||
"name": "Magriñá",
|
||||
"minute": 69
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Bindea",
|
||||
"minute": 35
|
||||
},
|
||||
{
|
||||
"name": "Barátky",
|
||||
"minute": 88
|
||||
},
|
||||
{
|
||||
"name": "Dobay",
|
||||
"minute": 105
|
||||
}
|
||||
],
|
||||
"ground": "Stade du T.O.E.C., Toulouse"
|
||||
},
|
||||
{
|
||||
"round": "Round of 16",
|
||||
"date": "1938-06-05",
|
||||
"time": "17:00",
|
||||
"team1": "France",
|
||||
"team2": "Belgium",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Veinante",
|
||||
"minute": 1
|
||||
},
|
||||
{
|
||||
"name": "Nicolas",
|
||||
"minute": 16
|
||||
},
|
||||
{
|
||||
"name": "Nicolas",
|
||||
"minute": 69
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Isemborghs",
|
||||
"minute": 38
|
||||
}
|
||||
],
|
||||
"ground": "Stade Olympique de Colombes, Colombes"
|
||||
},
|
||||
{
|
||||
"round": "Round of 16",
|
||||
"date": "1938-06-05",
|
||||
"time": "17:00",
|
||||
"team1": "Italy",
|
||||
"team2": "Norway",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
1
|
||||
],
|
||||
"et": [
|
||||
2,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Ferraris",
|
||||
"minute": 2
|
||||
},
|
||||
{
|
||||
"name": "Piola",
|
||||
"minute": 94
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Brustad",
|
||||
"minute": 83
|
||||
}
|
||||
],
|
||||
"ground": "Stade Vélodrome, Marseille"
|
||||
},
|
||||
{
|
||||
"round": "Round of 16",
|
||||
"date": "1938-06-05",
|
||||
"time": "17:00",
|
||||
"team1": "Brazil",
|
||||
"team2": "Poland",
|
||||
"score": {
|
||||
"ft": [
|
||||
4,
|
||||
4
|
||||
],
|
||||
"et": [
|
||||
6,
|
||||
5
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Leônidas",
|
||||
"minute": 18
|
||||
},
|
||||
{
|
||||
"name": "Leônidas",
|
||||
"minute": 93
|
||||
},
|
||||
{
|
||||
"name": "Leônidas",
|
||||
"minute": 104
|
||||
},
|
||||
{
|
||||
"name": "Romeu",
|
||||
"minute": 25
|
||||
},
|
||||
{
|
||||
"name": "Perácio",
|
||||
"minute": 44
|
||||
},
|
||||
{
|
||||
"name": "Perácio",
|
||||
"minute": 71
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Scherfke",
|
||||
"minute": 23,
|
||||
"penalty": true
|
||||
},
|
||||
{
|
||||
"name": "Wilimowski",
|
||||
"minute": 53
|
||||
},
|
||||
{
|
||||
"name": "Wilimowski",
|
||||
"minute": 59
|
||||
},
|
||||
{
|
||||
"name": "Wilimowski",
|
||||
"minute": 89
|
||||
},
|
||||
{
|
||||
"name": "Wilimowski",
|
||||
"minute": 118
|
||||
}
|
||||
],
|
||||
"ground": "Stade de la Meinau, Strasbourg"
|
||||
},
|
||||
{
|
||||
"round": "Round of 16",
|
||||
"date": "1938-06-05",
|
||||
"time": "17:00",
|
||||
"team1": "Czechoslovakia",
|
||||
"team2": "Netherlands",
|
||||
"score": {
|
||||
"ft": [
|
||||
0,
|
||||
0
|
||||
],
|
||||
"et": [
|
||||
3,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Košťálek",
|
||||
"minute": 96
|
||||
},
|
||||
{
|
||||
"name": "Nejedlý",
|
||||
"minute": 111
|
||||
},
|
||||
{
|
||||
"name": "Zeman",
|
||||
"minute": 118
|
||||
}
|
||||
],
|
||||
"ground": "Stade municipal, Le Havre"
|
||||
},
|
||||
{
|
||||
"round": "Round of 16",
|
||||
"date": "1938-06-09",
|
||||
"time": "18:00",
|
||||
"team1": "Switzerland",
|
||||
"team2": "Germany",
|
||||
"score": {
|
||||
"ft": [
|
||||
4,
|
||||
2
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Walaschek",
|
||||
"minute": 42
|
||||
},
|
||||
{
|
||||
"name": "Bickel",
|
||||
"minute": 64
|
||||
},
|
||||
{
|
||||
"name": "Abegglen",
|
||||
"minute": 75
|
||||
},
|
||||
{
|
||||
"name": "Abegglen",
|
||||
"minute": 78
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Hahnemann",
|
||||
"minute": 8
|
||||
},
|
||||
{
|
||||
"name": "Lörtscher",
|
||||
"minute": 22,
|
||||
"owngoal": true
|
||||
}
|
||||
],
|
||||
"ground": "Parc des Princes, Paris"
|
||||
},
|
||||
{
|
||||
"round": "Round of 16",
|
||||
"date": "1938-06-09",
|
||||
"time": "18:00",
|
||||
"team1": "Cuba",
|
||||
"team2": "Romania",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Socorro",
|
||||
"minute": 51
|
||||
},
|
||||
{
|
||||
"name": "Fernández",
|
||||
"minute": 57
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Dobay",
|
||||
"minute": 35
|
||||
}
|
||||
],
|
||||
"ground": "Stade du T.O.E.C., Toulouse"
|
||||
},
|
||||
{
|
||||
"round": "Quarter-finals",
|
||||
"date": "1938-06-12",
|
||||
"time": "17:00",
|
||||
"team1": "Hungary",
|
||||
"team2": "Switzerland",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "G. Sárosi",
|
||||
"minute": 40
|
||||
},
|
||||
{
|
||||
"name": "Zsengellér",
|
||||
"minute": 89
|
||||
}
|
||||
],
|
||||
"ground": "Stade Victor Boucquey, Lille"
|
||||
},
|
||||
{
|
||||
"round": "Quarter-finals",
|
||||
"date": "1938-06-12",
|
||||
"time": "17:00",
|
||||
"team1": "Sweden",
|
||||
"team2": "Cuba",
|
||||
"score": {
|
||||
"ft": [
|
||||
8,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "H. Andersson",
|
||||
"minute": 9
|
||||
},
|
||||
{
|
||||
"name": "H. Andersson",
|
||||
"minute": 81
|
||||
},
|
||||
{
|
||||
"name": "H. Andersson",
|
||||
"minute": 89
|
||||
},
|
||||
{
|
||||
"name": "Wetterström",
|
||||
"minute": 22
|
||||
},
|
||||
{
|
||||
"name": "Wetterström",
|
||||
"minute": 37
|
||||
},
|
||||
{
|
||||
"name": "Wetterström",
|
||||
"minute": 44
|
||||
},
|
||||
{
|
||||
"name": "Keller",
|
||||
"minute": 80
|
||||
},
|
||||
{
|
||||
"name": "Nyberg",
|
||||
"minute": 84
|
||||
}
|
||||
],
|
||||
"ground": "Stade du Fort Carré, Antibes"
|
||||
},
|
||||
{
|
||||
"round": "Quarter-finals",
|
||||
"date": "1938-06-12",
|
||||
"time": "17:00",
|
||||
"team1": "Italy",
|
||||
"team2": "France",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Colaussi",
|
||||
"minute": 9
|
||||
},
|
||||
{
|
||||
"name": "Piola",
|
||||
"minute": 51
|
||||
},
|
||||
{
|
||||
"name": "Piola",
|
||||
"minute": 72
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Heisserer",
|
||||
"minute": 10
|
||||
}
|
||||
],
|
||||
"ground": "Stade Olympique de Colombes, Colombes"
|
||||
},
|
||||
{
|
||||
"round": "Quarter-finals",
|
||||
"date": "1938-06-12",
|
||||
"time": "17:00",
|
||||
"team1": "Brazil",
|
||||
"team2": "Czechoslovakia",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
1
|
||||
],
|
||||
"et": [
|
||||
1,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Leônidas",
|
||||
"minute": 30
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Nejedlý",
|
||||
"minute": 65,
|
||||
"penalty": true
|
||||
}
|
||||
],
|
||||
"ground": "Parc Lescure, Bordeaux"
|
||||
},
|
||||
{
|
||||
"round": "Quarter-finals",
|
||||
"date": "1938-06-14",
|
||||
"time": "18:00",
|
||||
"team1": "Brazil",
|
||||
"team2": "Czechoslovakia",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Leônidas",
|
||||
"minute": 57
|
||||
},
|
||||
{
|
||||
"name": "Roberto",
|
||||
"minute": 62
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Kopecký",
|
||||
"minute": 25
|
||||
}
|
||||
],
|
||||
"ground": "Parc Lescure, Bordeaux"
|
||||
},
|
||||
{
|
||||
"round": "Semi-finals",
|
||||
"date": "1938-06-16",
|
||||
"time": "18:00",
|
||||
"team1": "Hungary",
|
||||
"team2": "Sweden",
|
||||
"score": {
|
||||
"ft": [
|
||||
5,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Jacobsson",
|
||||
"minute": 19,
|
||||
"owngoal": true
|
||||
},
|
||||
{
|
||||
"name": "Titkos",
|
||||
"minute": 37
|
||||
},
|
||||
{
|
||||
"name": "Zsengellér",
|
||||
"minute": 39
|
||||
},
|
||||
{
|
||||
"name": "Zsengellér",
|
||||
"minute": 85
|
||||
},
|
||||
{
|
||||
"name": "G. Sárosi",
|
||||
"minute": 65
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Nyberg",
|
||||
"minute": 1
|
||||
}
|
||||
],
|
||||
"ground": "Parc des Princes, Paris"
|
||||
},
|
||||
{
|
||||
"round": "Semi-finals",
|
||||
"date": "1938-06-16",
|
||||
"time": "18:00",
|
||||
"team1": "Italy",
|
||||
"team2": "Brazil",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Colaussi",
|
||||
"minute": 51
|
||||
},
|
||||
{
|
||||
"name": "Meazza",
|
||||
"minute": 60,
|
||||
"penalty": true
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Romeu",
|
||||
"minute": 87
|
||||
}
|
||||
],
|
||||
"ground": "Stade Vélodrome, Marseille"
|
||||
},
|
||||
{
|
||||
"round": "Third-place match",
|
||||
"date": "1938-06-19",
|
||||
"time": "17:00",
|
||||
"team1": "Brazil",
|
||||
"team2": "Sweden",
|
||||
"score": {
|
||||
"ft": [
|
||||
4,
|
||||
2
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Romeu",
|
||||
"minute": 44
|
||||
},
|
||||
{
|
||||
"name": "Leônidas",
|
||||
"minute": 63
|
||||
},
|
||||
{
|
||||
"name": "Leônidas",
|
||||
"minute": 74
|
||||
},
|
||||
{
|
||||
"name": "Perácio",
|
||||
"minute": 80
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Jonasson",
|
||||
"minute": 28
|
||||
},
|
||||
{
|
||||
"name": "Nyberg",
|
||||
"minute": 38
|
||||
}
|
||||
],
|
||||
"ground": "Parc Lescure, Bordeaux"
|
||||
},
|
||||
{
|
||||
"round": "Final",
|
||||
"date": "1938-06-19",
|
||||
"time": "17:00",
|
||||
"team1": "Italy",
|
||||
"team2": "Hungary",
|
||||
"score": {
|
||||
"ft": [
|
||||
4,
|
||||
2
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Colaussi",
|
||||
"minute": 6
|
||||
},
|
||||
{
|
||||
"name": "Colaussi",
|
||||
"minute": 35
|
||||
},
|
||||
{
|
||||
"name": "Piola",
|
||||
"minute": 16
|
||||
},
|
||||
{
|
||||
"name": "Piola",
|
||||
"minute": 82
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Titkos",
|
||||
"minute": 8
|
||||
},
|
||||
{
|
||||
"name": "G. Sárosi",
|
||||
"minute": 70
|
||||
}
|
||||
],
|
||||
"ground": "Stade Olympique de Colombes, Paris"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
{
|
||||
"stadiums": [
|
||||
{
|
||||
"name": "Parc des Princes",
|
||||
"city": "Paris"
|
||||
},
|
||||
{
|
||||
"name": "Vélodrome Municipal",
|
||||
"city": "Reims"
|
||||
},
|
||||
{
|
||||
"name": "Stade Gerland",
|
||||
"city": "Lyon"
|
||||
},
|
||||
{
|
||||
"name": "Stade du T.O.E.C.",
|
||||
"city": "Toulouse"
|
||||
},
|
||||
{
|
||||
"name": "Stade Olympique de Colombes",
|
||||
"city": "Colombes"
|
||||
},
|
||||
{
|
||||
"name": "Stade Vélodrome",
|
||||
"city": "Marseille"
|
||||
},
|
||||
{
|
||||
"name": "Stade de la Meinau",
|
||||
"city": "Strasbourg"
|
||||
},
|
||||
{
|
||||
"name": "Stade municipal",
|
||||
"city": "Le Havre"
|
||||
},
|
||||
{
|
||||
"name": "Stade Victor Boucquey",
|
||||
"city": "Lille"
|
||||
},
|
||||
{
|
||||
"name": "Stade du Fort Carré",
|
||||
"city": "Antibes"
|
||||
},
|
||||
{
|
||||
"name": "Parc Lescure",
|
||||
"city": "Bordeaux"
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user