refactor: consolidate data/ into single root directory, fix historical player names

Merge data/wikipedia/{year}/ into data/{year}/ so there is a single
canonical location for World Cup JSON files. Update scrape and seed
scripts to use data/ instead of data/wikipedia/.

Re-scraped all 22 years (1930-2022) with fixed player name extraction
(full name from <a title="..."> rather than abbreviated display text)
so historical goals now show e.g. "Thomas Müller" not "Müller".

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-15 18:27:35 +02:00
parent 9ce2a4e27c
commit d37ebe201e
48 changed files with 2488 additions and 3630 deletions
+94 -231
View File
@@ -24,7 +24,7 @@
],
"goals2": [
{
"name": "Causio",
"name": "Franco Causio",
"minute": 38
}
],
@@ -48,21 +48,21 @@
},
"goals1": [
{
"name": "Kempes",
"name": "Mario Kempes",
"minute": 38
},
{
"name": "Kempes",
"name": "Mario Kempes",
"minute": 105
},
{
"name": "Bertoni",
"name": "Daniel Bertoni",
"minute": 115
}
],
"goals2": [
{
"name": "Nanninga",
"name": "Dick Nanninga",
"minute": 82
}
],
@@ -83,17 +83,17 @@
},
"goals1": [
{
"name": "Rossi",
"name": "Paolo Rossi",
"minute": 29
},
{
"name": "Zaccarelli",
"name": "Renato Zaccarelli",
"minute": 54
}
],
"goals2": [
{
"name": "Lacombe",
"name": "Bernard Lacombe",
"minute": 1
}
],
@@ -114,17 +114,17 @@
},
"goals1": [
{
"name": "Luque",
"name": "Leopoldo Luque",
"minute": 14
},
{
"name": "Bertoni",
"name": "Daniel Bertoni",
"minute": 83
}
],
"goals2": [
{
"name": "Csapó",
"name": "Károly Csapó",
"minute": 9
}
],
@@ -145,21 +145,21 @@
},
"goals1": [
{
"name": "Rossi",
"name": "Paolo Rossi",
"minute": 34
},
{
"name": "Bettega",
"name": "Roberto Bettega",
"minute": 35
},
{
"name": "Benetti",
"name": "Romeo Benetti",
"minute": 61
}
],
"goals2": [
{
"name": "A. Tóth",
"name": "András Tóth",
"minute": 81,
"penalty": true
}
@@ -181,18 +181,18 @@
},
"goals1": [
{
"name": "Passarella",
"name": "Daniel Passarella",
"minute": 45,
"penalty": true
},
{
"name": "Luque",
"name": "Leopoldo Luque",
"minute": 73
}
],
"goals2": [
{
"name": "Platini",
"name": "Michel Platini",
"minute": 60
}
],
@@ -213,21 +213,21 @@
},
"goals1": [
{
"name": "Lopez",
"name": "Christian Lopez",
"minute": 23
},
{
"name": "Berdoll",
"name": "Marc Berdoll",
"minute": 38
},
{
"name": "Rocheteau",
"name": "Dominique Rocheteau",
"minute": 42
}
],
"goals2": [
{
"name": "Zombori",
"name": "Sándor Zombori",
"minute": 41
}
],
@@ -248,7 +248,7 @@
},
"goals2": [
{
"name": "Bettega",
"name": "Roberto Bettega",
"minute": 67
}
],
@@ -259,7 +259,7 @@
"group": "Group 2",
"date": "1978-06-01",
"time": "15:00",
"team1": "West Germany",
"team1": "Germany",
"team2": "Poland",
"score": {
"ft": [
@@ -284,21 +284,21 @@
},
"goals1": [
{
"name": "Kaabi",
"name": "Ali Kaabi",
"minute": 55
},
{
"name": "Ghommidh",
"name": "Néjib Ghommidh",
"minute": 79
},
{
"name": "Dhouieb",
"name": "Mokhtar Dhouieb",
"minute": 87
}
],
"goals2": [
{
"name": "Vázquez Ayala",
"name": "Arturo Vázquez Ayala",
"minute": 45,
"penalty": true
}
@@ -310,7 +310,7 @@
"group": "Group 2",
"date": "1978-06-06",
"time": "16:45",
"team1": "West Germany",
"team1": "Germany",
"team2": "Mexico",
"score": {
"ft": [
@@ -320,27 +320,27 @@
},
"goals1": [
{
"name": "D. Müller",
"name": "Dieter Müller",
"minute": 15
},
{
"name": "H. Müller",
"name": "Hansi Müller",
"minute": 30
},
{
"name": "Rummenigge",
"name": "Karl-Heinz Rummenigge",
"minute": 38
},
{
"name": "Rummenigge",
"name": "Karl-Heinz Rummenigge",
"minute": 73
},
{
"name": "Flohe",
"name": "Heinz Flohe",
"minute": 44
},
{
"name": "Flohe",
"name": "Heinz Flohe",
"minute": 89
}
],
@@ -361,7 +361,7 @@
},
"goals1": [
{
"name": "Lato",
"name": "Grzegorz Lato",
"minute": 43
}
],
@@ -372,7 +372,7 @@
"group": "Group 2",
"date": "1978-06-10",
"time": "16:45",
"team1": "West Germany",
"team1": "Germany",
"team2": "Tunisia",
"score": {
"ft": [
@@ -397,163 +397,26 @@
},
"goals1": [
{
"name": "Boniek",
"name": "Zbigniew Boniek",
"minute": 43
},
{
"name": "Boniek",
"name": "Zbigniew Boniek",
"minute": 84
},
{
"name": "Deyna",
"name": "Kazimierz Deyna",
"minute": 56
}
],
"goals2": [
{
"name": "Rangel",
"name": "Víctor Rangel",
"minute": 52
}
],
"ground": "Estadio Gigante de Arroyito, Rosario"
},
{
"round": "Group stage",
"group": "Group 3",
"date": "1978-06-03",
"time": "13:45",
"team1": "Austria",
"team2": "Spain",
"score": {
"ft": [
2,
1
]
},
"goals1": [
{
"name": "Schachner",
"minute": 10
},
{
"name": "Krankl",
"minute": 76
}
],
"goals2": [
{
"name": "Dani",
"minute": 21
}
],
"ground": "Estadio José Amalfitani, Buenos Aires"
},
{
"round": "Group stage",
"group": "Group 3",
"date": "1978-06-03",
"time": "13:45",
"team1": "Brazil",
"team2": "Sweden",
"score": {
"ft": [
1,
1
]
},
"goals1": [
{
"name": "Reinaldo",
"minute": 45
}
],
"goals2": [
{
"name": "Sjöberg",
"minute": 37
}
],
"ground": "Estadio José Maria Minella, Mar del Plata"
},
{
"round": "Group stage",
"group": "Group 3",
"date": "1978-06-07",
"time": "13:45",
"team1": "Austria",
"team2": "Sweden",
"score": {
"ft": [
1,
0
]
},
"goals1": [
{
"name": "Krankl",
"minute": 42,
"penalty": true
}
],
"ground": "Estadio José Amalfitani, Buenos Aires"
},
{
"round": "Group stage",
"group": "Group 3",
"date": "1978-06-07",
"time": "13:45",
"team1": "Brazil",
"team2": "Spain",
"score": {
"ft": [
0,
0
]
},
"ground": "Estadio José Maria Minella, Mar del Plata"
},
{
"round": "Group stage",
"group": "Group 3",
"date": "1978-06-11",
"time": "13:45",
"team1": "Spain",
"team2": "Sweden",
"score": {
"ft": [
1,
0
]
},
"goals1": [
{
"name": "Asensi",
"minute": 75
}
],
"ground": "Estadio José Amalfitani, Buenos Aires"
},
{
"round": "Group stage",
"group": "Group 3",
"date": "1978-06-11",
"time": "13:45",
"team1": "Brazil",
"team2": "Austria",
"score": {
"ft": [
1,
0
]
},
"goals1": [
{
"name": "Dinamite",
"minute": 40
}
],
"ground": "Estadio José Maria Minella, Mar del Plata"
},
{
"round": "Group stage",
"group": "Group 4",
@@ -569,21 +432,21 @@
},
"goals1": [
{
"name": "Cueto",
"name": "César Cueto",
"minute": 43
},
{
"name": "Cubillas",
"name": "Teófilo Cubillas",
"minute": 71
},
{
"name": "Cubillas",
"name": "Teófilo Cubillas",
"minute": 77
}
],
"goals2": [
{
"name": "Jordan",
"name": "Joe Jordan",
"minute": 14
}
],
@@ -604,16 +467,16 @@
},
"goals1": [
{
"name": "Rensenbrink",
"name": "Rob Rensenbrink",
"minute": 40,
"penalty": true
},
{
"name": "Rensenbrink",
"name": "Rob Rensenbrink",
"minute": 62
},
{
"name": "Rensenbrink",
"name": "Rob Rensenbrink",
"minute": 78,
"penalty": true
}
@@ -635,14 +498,14 @@
},
"goals1": [
{
"name": "Eskandarian",
"name": "Andranik Eskandarian",
"minute": 43,
"owngoal": true
}
],
"goals2": [
{
"name": "Danaeifard",
"name": "Iraj Danaeifard",
"minute": 60
}
],
@@ -678,27 +541,27 @@
},
"goals1": [
{
"name": "Velásquez",
"name": "José Velásquez",
"minute": 2
},
{
"name": "Cubillas",
"name": "Teófilo Cubillas",
"minute": 36,
"penalty": true
},
{
"name": "Cubillas",
"name": "Teófilo Cubillas",
"minute": 39,
"penalty": true
},
{
"name": "Cubillas",
"name": "Teófilo Cubillas",
"minute": 79
}
],
"goals2": [
{
"name": "Rowshan",
"name": "Hassan Rowshan",
"minute": 41
}
],
@@ -719,27 +582,27 @@
},
"goals1": [
{
"name": "Dalglish",
"name": "Kenny Dalglish",
"minute": 45
},
{
"name": "A. Gemmill",
"name": "Archie Gemmill",
"minute": 46,
"penalty": true
},
{
"name": "A. Gemmill",
"name": "Archie Gemmill",
"minute": 68
}
],
"goals2": [
{
"name": "Rensenbrink",
"name": "Rob Rensenbrink",
"minute": 34,
"penalty": true
},
{
"name": "Rep",
"name": "Johnny Rep",
"minute": 71
}
],
@@ -760,30 +623,30 @@
},
"goals1": [
{
"name": "Obermayer",
"name": "Erich Obermayer",
"minute": 80
}
],
"goals2": [
{
"name": "Brandts",
"name": "Ernie Brandts",
"minute": 6
},
{
"name": "Rensenbrink",
"name": "Rob Rensenbrink",
"minute": 35,
"penalty": true
},
{
"name": "Rep",
"name": "Johnny Rep",
"minute": 36
},
{
"name": "Rep",
"name": "Johnny Rep",
"minute": 53
},
{
"name": "W. van de Kerkhof",
"name": "Willy van de Kerkhof",
"minute": 82
}
],
@@ -795,7 +658,7 @@
"date": "1978-06-14",
"time": "13:45",
"team1": "Italy",
"team2": "West Germany",
"team2": "Germany",
"score": {
"ft": [
0,
@@ -810,7 +673,7 @@
"date": "1978-06-18",
"time": "16:45",
"team1": "Netherlands",
"team2": "West Germany",
"team2": "Germany",
"score": {
"ft": [
2,
@@ -819,21 +682,21 @@
},
"goals1": [
{
"name": "Haan",
"name": "Arie Haan",
"minute": 27
},
{
"name": "R. van de Kerkhof",
"name": "René van de Kerkhof",
"minute": 82
}
],
"goals2": [
{
"name": "Abramczik",
"name": "Rüdiger Abramczik",
"minute": 3
},
{
"name": "D. Müller",
"name": "Dieter Müller",
"minute": 70
}
],
@@ -854,7 +717,7 @@
},
"goals1": [
{
"name": "Rossi",
"name": "Paolo Rossi",
"minute": 13
}
],
@@ -866,7 +729,7 @@
"date": "1978-06-21",
"time": "13:45",
"team1": "Austria",
"team2": "West Germany",
"team2": "Germany",
"score": {
"ft": [
3,
@@ -875,26 +738,26 @@
},
"goals1": [
{
"name": "Vogts",
"name": "Berti Vogts",
"minute": 59,
"owngoal": true
},
{
"name": "Krankl",
"name": "Hans Krankl",
"minute": 66
},
{
"name": "Krankl",
"name": "Hans Krankl",
"minute": 87
}
],
"goals2": [
{
"name": "Rummenigge",
"name": "Karl-Heinz Rummenigge",
"minute": 19
},
{
"name": "Hölzenbein",
"name": "Bernd Hölzenbein",
"minute": 68
}
],
@@ -915,18 +778,18 @@
},
"goals1": [
{
"name": "Brandts",
"name": "Ernie Brandts",
"minute": 19,
"owngoal": true
}
],
"goals2": [
{
"name": "Brandts",
"name": "Ernie Brandts",
"minute": 49
},
{
"name": "Haan",
"name": "Arie Haan",
"minute": 76
}
],
@@ -977,11 +840,11 @@
},
"goals1": [
{
"name": "Kempes",
"name": "Mario Kempes",
"minute": 16
},
{
"name": "Kempes",
"name": "Mario Kempes",
"minute": 71
}
],
@@ -1002,7 +865,7 @@
},
"goals2": [
{
"name": "Szarmach",
"name": "Andrzej Szarmach",
"minute": 65
}
],
@@ -1042,17 +905,17 @@
"minute": 13
},
{
"name": "Dinamite",
"name": "Roberto Dinamite",
"minute": 58
},
{
"name": "Dinamite",
"name": "Roberto Dinamite",
"minute": 63
}
],
"goals2": [
{
"name": "Lato",
"name": "Grzegorz Lato",
"minute": 45
}
],
@@ -1073,27 +936,27 @@
},
"goals1": [
{
"name": "Kempes",
"name": "Mario Kempes",
"minute": 21
},
{
"name": "Kempes",
"name": "Mario Kempes",
"minute": 49
},
{
"name": "Tarantini",
"name": "Alberto Tarantini",
"minute": 43
},
{
"name": "Luque",
"name": "Leopoldo Luque",
"minute": 50
},
{
"name": "Luque",
"name": "Leopoldo Luque",
"minute": 72
},
{
"name": "Houseman",
"name": "René Houseman",
"minute": 67
}
],