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
+2 -10
View File
@@ -12,7 +12,7 @@
{
"name": "Group 2",
"teams": [
"West Germany",
"Germany",
"Algeria",
"Chile",
"Austria"
@@ -54,18 +54,10 @@
"New Zealand"
]
},
{
"name": "Group A",
"teams": [
"Poland",
"Belgium",
"Soviet Union"
]
},
{
"name": "Group B",
"teams": [
"West Germany",
"Germany",
"England",
"Spain"
]
+141 -206
View File
@@ -14,11 +14,11 @@
},
"goals2": [
{
"name": "Rossi",
"name": "Paolo Rossi",
"minute": 22
},
{
"name": "Rossi",
"name": "Paolo Rossi",
"minute": 73
}
],
@@ -28,7 +28,7 @@
"round": "Semi-finals",
"date": "1982-07-08",
"time": "21:00",
"team1": "West Germany",
"team1": "Germany",
"team2": "France",
"score": {
"ft": [
@@ -46,30 +46,30 @@
},
"goals1": [
{
"name": "Littbarski",
"name": "Pierre Littbarski",
"minute": 17
},
{
"name": "Rummenigge",
"name": "Karl-Heinz Rummenigge",
"minute": 102
},
{
"name": "Fischer",
"name": "Klaus Fischer",
"minute": 108
}
],
"goals2": [
{
"name": "Platini",
"name": "Michel Platini",
"minute": 26,
"penalty": true
},
{
"name": "Trésor",
"name": "Marius Trésor",
"minute": 92
},
{
"name": "Giresse",
"name": "Alain Giresse",
"minute": 98
}
],
@@ -89,25 +89,25 @@
},
"goals1": [
{
"name": "Szarmach",
"name": "Andrzej Szarmach",
"minute": 40
},
{
"name": "Majewski",
"name": "Stefan Majewski",
"minute": 44
},
{
"name": "Kupcewicz",
"name": "Janusz Kupcewicz",
"minute": 46
}
],
"goals2": [
{
"name": "Girard",
"name": "René Girard",
"minute": 13
},
{
"name": "Couriol",
"name": "Alain Couriol",
"minute": 72
}
],
@@ -118,7 +118,7 @@
"date": "1982-07-11",
"time": "20:00",
"team1": "Italy",
"team2": "West Germany",
"team2": "Germany",
"score": {
"ft": [
3,
@@ -127,21 +127,21 @@
},
"goals1": [
{
"name": "Rossi",
"name": "Paolo Rossi",
"minute": 57
},
{
"name": "Tardelli",
"name": "Marco Tardelli",
"minute": 69
},
{
"name": "Altobelli",
"name": "Alessandro Altobelli",
"minute": 81
}
],
"goals2": [
{
"name": "Breitner",
"name": "Paul Breitner",
"minute": 83
}
],
@@ -192,13 +192,13 @@
},
"goals1": [
{
"name": "Conti",
"name": "Bruno Conti",
"minute": 18
}
],
"goals2": [
{
"name": "Díaz",
"name": "Rubén Toribio Díaz",
"minute": 83
}
],
@@ -234,29 +234,29 @@
},
"goals1": [
{
"name": "Smolarek",
"name": "Włodzimierz Smolarek",
"minute": 55
},
{
"name": "Lato",
"name": "Grzegorz Lato",
"minute": 58
},
{
"name": "Boniek",
"name": "Zbigniew Boniek",
"minute": 61
},
{
"name": "Buncol",
"name": "Andrzej Buncol",
"minute": 68
},
{
"name": "Ciołek",
"name": "Włodzimierz Ciołek",
"minute": 76
}
],
"goals2": [
{
"name": "La Rosa",
"name": "Guillermo La Rosa",
"minute": 83
}
],
@@ -277,13 +277,13 @@
},
"goals1": [
{
"name": "Graziani",
"name": "Francesco Graziani",
"minute": 60
}
],
"goals2": [
{
"name": "M'Bida",
"name": "Grégoire M'Bida",
"minute": 61
}
],
@@ -294,7 +294,7 @@
"group": "Group 2",
"date": "1982-06-16",
"time": "17:15",
"team1": "West Germany",
"team1": "Germany",
"team2": "Algeria",
"score": {
"ft": [
@@ -304,17 +304,17 @@
},
"goals1": [
{
"name": "Rummenigge",
"name": "Karl-Heinz Rummenigge",
"minute": 67
}
],
"goals2": [
{
"name": "Madjer",
"name": "Rabah Madjer",
"minute": 54
},
{
"name": "Belloumi",
"name": "Lakhdar Belloumi",
"minute": 68
}
],
@@ -335,7 +335,7 @@
},
"goals2": [
{
"name": "Schachner",
"name": "Walter Schachner",
"minute": 22
}
],
@@ -346,7 +346,7 @@
"group": "Group 2",
"date": "1982-06-20",
"time": "17:15",
"team1": "West Germany",
"team1": "Germany",
"team2": "Chile",
"score": {
"ft": [
@@ -356,25 +356,25 @@
},
"goals1": [
{
"name": "Rummenigge",
"name": "Karl-Heinz Rummenigge",
"minute": 9
},
{
"name": "Rummenigge",
"name": "Karl-Heinz Rummenigge",
"minute": 57
},
{
"name": "Rummenigge",
"name": "Karl-Heinz Rummenigge",
"minute": 66
},
{
"name": "Reinders",
"name": "Uwe Reinders",
"minute": 83
}
],
"goals2": [
{
"name": "Moscoso",
"name": "Gustavo Moscoso",
"minute": 90
}
],
@@ -395,11 +395,11 @@
},
"goals2": [
{
"name": "Schachner",
"name": "Walter Schachner",
"minute": 55
},
{
"name": "Krankl",
"name": "Hans Krankl",
"minute": 67
}
],
@@ -420,26 +420,26 @@
},
"goals1": [
{
"name": "Assad",
"name": "Salah Assad",
"minute": 7
},
{
"name": "Assad",
"name": "Salah Assad",
"minute": 31
},
{
"name": "Bensaoula",
"name": "Tedj Bensaoula",
"minute": 35
}
],
"goals2": [
{
"name": "Neira",
"name": "Miguel Ángel Neira",
"minute": 59,
"penalty": true
},
{
"name": "Letelier",
"name": "Juan Carlos Letelier",
"minute": 73
}
],
@@ -450,7 +450,7 @@
"group": "Group 2",
"date": "1982-06-25",
"time": "17:15",
"team1": "West Germany",
"team1": "Germany",
"team2": "Austria",
"score": {
"ft": [
@@ -460,7 +460,7 @@
},
"goals1": [
{
"name": "Hrubesch",
"name": "Horst Hrubesch",
"minute": 10
}
],
@@ -481,7 +481,7 @@
},
"goals2": [
{
"name": "Vandenbergh",
"name": "Erwin Vandenbergh",
"minute": 62
}
],
@@ -502,49 +502,49 @@
},
"goals1": [
{
"name": "Nyilasi",
"name": "Tibor Nyilasi",
"minute": 4
},
{
"name": "Nyilasi",
"name": "Tibor Nyilasi",
"minute": 83
},
{
"name": "Pölöskei",
"name": "Gábor Pölöskei",
"minute": 11
},
{
"name": "Fazekas",
"name": "László Fazekas",
"minute": 23
},
{
"name": "Fazekas",
"name": "László Fazekas",
"minute": 54
},
{
"name": "Tóth",
"name": "József Tóth",
"minute": 50
},
{
"name": "L. Kiss",
"name": "László Kiss",
"minute": 69
},
{
"name": "L. Kiss",
"name": "László Kiss",
"minute": 72
},
{
"name": "L. Kiss",
"name": "László Kiss",
"minute": 76
},
{
"name": "Szentes",
"name": "Lázár Szentes",
"minute": 70
}
],
"goals2": [
{
"name": "Ramírez",
"name": "Luis Ramírez Zapata",
"minute": 64
}
],
@@ -565,25 +565,25 @@
},
"goals1": [
{
"name": "Bertoni",
"name": "Daniel Bertoni",
"minute": 26
},
{
"name": "Maradona",
"name": "Diego Maradona",
"minute": 28
},
{
"name": "Maradona",
"name": "Diego Maradona",
"minute": 57
},
{
"name": "Ardiles",
"name": "Osvaldo Ardiles",
"minute": 60
}
],
"goals2": [
{
"name": "Pölöskei",
"name": "Gábor Pölöskei",
"minute": 76
}
],
@@ -604,7 +604,7 @@
},
"goals1": [
{
"name": "Coeck",
"name": "Ludo Coeck",
"minute": 19
}
],
@@ -625,13 +625,13 @@
},
"goals1": [
{
"name": "Czerniatynski",
"name": "Alexandre Czerniatynski",
"minute": 76
}
],
"goals2": [
{
"name": "Varga",
"name": "József Varga",
"minute": 27
}
],
@@ -652,12 +652,12 @@
},
"goals1": [
{
"name": "Passarella",
"name": "Daniel Passarella",
"minute": 22,
"penalty": true
},
{
"name": "Bertoni",
"name": "Daniel Bertoni",
"minute": 54
}
],
@@ -678,21 +678,21 @@
},
"goals1": [
{
"name": "Robson",
"name": "Bryan Robson",
"minute": 1
},
{
"name": "Robson",
"name": "Bryan Robson",
"minute": 67
},
{
"name": "Mariner",
"name": "Paul Mariner",
"minute": 83
}
],
"goals2": [
{
"name": "Soler",
"name": "Gérard Soler",
"minute": 24
}
],
@@ -713,14 +713,14 @@
},
"goals1": [
{
"name": "Panenka",
"name": "Antonín Panenka",
"minute": 21,
"penalty": true
}
],
"goals2": [
{
"name": "Al-Dakhil",
"name": "Faisal Al-Dakhil",
"minute": 57
}
],
@@ -741,11 +741,11 @@
},
"goals1": [
{
"name": "Francis",
"name": "Trevor Francis",
"minute": 62
},
{
"name": "Barmoš",
"name": "Jozef Barmoš",
"minute": 66,
"owngoal": true
}
@@ -767,25 +767,25 @@
},
"goals1": [
{
"name": "Genghini",
"name": "Bernard Genghini",
"minute": 31
},
{
"name": "Platini",
"name": "Michel Platini",
"minute": 43
},
{
"name": "Six",
"name": "Didier Six",
"minute": 48
},
{
"name": "Bossis",
"name": "Maxime Bossis",
"minute": 89
}
],
"goals2": [
{
"name": "Abdull. Al-Buloushi",
"name": "Abdullah Al-Buloushi",
"minute": 75
}
],
@@ -806,13 +806,13 @@
},
"goals1": [
{
"name": "Six",
"name": "Didier Six",
"minute": 66
}
],
"goals2": [
{
"name": "Panenka",
"name": "Antonín Panenka",
"minute": 84,
"penalty": true
}
@@ -834,7 +834,7 @@
},
"goals1": [
{
"name": "Francis",
"name": "Trevor Francis",
"minute": 27
}
],
@@ -855,14 +855,14 @@
},
"goals1": [
{
"name": "López Ufarte",
"name": "Roberto López Ufarte",
"minute": 65,
"penalty": true
}
],
"goals2": [
{
"name": "Zelaya",
"name": "Héctor Zelaya",
"minute": 8
}
],
@@ -903,13 +903,13 @@
"penalty": true
},
{
"name": "Saura",
"name": "Enrique Saura",
"minute": 66
}
],
"goals2": [
{
"name": "Gudelj",
"name": "Ivan Gudelj",
"minute": 10
}
],
@@ -930,13 +930,13 @@
},
"goals1": [
{
"name": "Laing",
"name": "Eduardo Laing",
"minute": 60
}
],
"goals2": [
{
"name": "Armstrong",
"name": "Gerry Armstrong",
"minute": 10
}
],
@@ -957,7 +957,7 @@
},
"goals2": [
{
"name": "Petrović",
"name": "Vladimir Petrović",
"minute": 88,
"penalty": true
}
@@ -979,7 +979,7 @@
},
"goals2": [
{
"name": "Armstrong",
"name": "Gerry Armstrong",
"minute": 47
}
],
@@ -1004,13 +1004,13 @@
"minute": 75
},
{
"name": "Éder",
"name": "Éder Aleixo de Assis",
"minute": 88
}
],
"goals2": [
{
"name": "Bal",
"name": "Andriy Bal",
"minute": 34
}
],
@@ -1031,33 +1031,33 @@
},
"goals1": [
{
"name": "Dalglish",
"name": "Kenny Dalglish",
"minute": 18
},
{
"name": "Wark",
"name": "John Wark",
"minute": 29
},
{
"name": "Wark",
"name": "John Wark",
"minute": 32
},
{
"name": "Robertson",
"name": "John Robertson",
"minute": 73
},
{
"name": "Archibald",
"name": "Steve Archibald",
"minute": 79
}
],
"goals2": [
{
"name": "Sumner",
"name": "Steve Sumner",
"minute": 54
},
{
"name": "Wooddin",
"name": "Steve Wooddin",
"minute": 64
}
],
@@ -1086,17 +1086,17 @@
"minute": 48
},
{
"name": "Éder",
"name": "Éder Aleixo de Assis",
"minute": 63
},
{
"name": "Falcão",
"name": "Paulo Roberto Falcão",
"minute": 87
}
],
"goals2": [
{
"name": "Narey",
"name": "David Narey",
"minute": 18
}
],
@@ -1117,15 +1117,15 @@
},
"goals1": [
{
"name": "Gavrilov",
"name": "Yuri Gavrilov",
"minute": 24
},
{
"name": "Blokhin",
"name": "Oleh Blokhin",
"minute": 48
},
{
"name": "Baltacha",
"name": "Sergei Pavlovich Baltacha",
"minute": 68
}
],
@@ -1146,21 +1146,21 @@
},
"goals1": [
{
"name": "Chivadze",
"name": "Aleksandre Chivadze",
"minute": 59
},
{
"name": "Shengelia",
"name": "Ramaz Shengelia",
"minute": 84
}
],
"goals2": [
{
"name": "Jordan",
"name": "Joe Jordan",
"minute": 15
},
{
"name": "Souness",
"name": "Graeme Souness",
"minute": 86
}
],
@@ -1189,87 +1189,22 @@
"minute": 31
},
{
"name": "Falcão",
"name": "Paulo Roberto Falcão",
"minute": 64
},
{
"name": "Serginho",
"name": "Serginho Chulapa",
"minute": 70
}
],
"ground": "Estadio Benito Villamarín, Seville"
},
{
"round": "Second group stage",
"group": "Group A",
"date": "1982-06-28",
"time": "21:00",
"team1": "Poland",
"team2": "Belgium",
"score": {
"ft": [
3,
0
]
},
"goals1": [
{
"name": "Boniek",
"minute": 4
},
{
"name": "Boniek",
"minute": 26
},
{
"name": "Boniek",
"minute": 53
}
],
"ground": "Camp Nou, Barcelona"
},
{
"round": "Second group stage",
"group": "Group A",
"date": "1982-07-01",
"time": "21:00",
"team1": "Belgium",
"team2": "Soviet Union",
"score": {
"ft": [
0,
1
]
},
"goals2": [
{
"name": "Oganesian",
"minute": 48
}
],
"ground": "Camp Nou, Barcelona"
},
{
"round": "Second group stage",
"group": "Group A",
"date": "1982-07-04",
"time": "21:00",
"team1": "Soviet Union",
"team2": "Poland",
"score": {
"ft": [
0,
0
]
},
"ground": "Camp Nou, Barcelona"
},
{
"round": "Second group stage",
"group": "Group B",
"date": "1982-06-29",
"time": "21:00",
"team1": "West Germany",
"team1": "Germany",
"team2": "England",
"score": {
"ft": [
@@ -1284,7 +1219,7 @@
"group": "Group B",
"date": "1982-07-02",
"time": "21:00",
"team1": "West Germany",
"team1": "Germany",
"team2": "Spain",
"score": {
"ft": [
@@ -1294,17 +1229,17 @@
},
"goals1": [
{
"name": "Littbarski",
"name": "Pierre Littbarski",
"minute": 50
},
{
"name": "Fischer",
"name": "Klaus Fischer",
"minute": 75
}
],
"goals2": [
{
"name": "Zamora",
"name": "Jesús María Zamora",
"minute": 82
}
],
@@ -1340,17 +1275,17 @@
},
"goals1": [
{
"name": "Tardelli",
"name": "Marco Tardelli",
"minute": 57
},
{
"name": "Cabrini",
"name": "Antonio Cabrini",
"minute": 67
}
],
"goals2": [
{
"name": "Passarella",
"name": "Daniel Passarella",
"minute": 83
}
],
@@ -1371,7 +1306,7 @@
},
"goals1": [
{
"name": "Díaz",
"name": "Ramón Díaz",
"minute": 89
}
],
@@ -1381,11 +1316,11 @@
"minute": 11
},
{
"name": "Serginho",
"name": "Serginho Chulapa",
"minute": 66
},
{
"name": "Júnior",
"name": "Leovegildo Lins da Gama Júnior",
"minute": 75
}
],
@@ -1406,15 +1341,15 @@
},
"goals1": [
{
"name": "Rossi",
"name": "Paolo Rossi",
"minute": 5
},
{
"name": "Rossi",
"name": "Paolo Rossi",
"minute": 25
},
{
"name": "Rossi",
"name": "Paolo Rossi",
"minute": 74
}
],
@@ -1424,7 +1359,7 @@
"minute": 12
},
{
"name": "Falcão",
"name": "Paulo Roberto Falcão",
"minute": 68
}
],
@@ -1445,7 +1380,7 @@
},
"goals2": [
{
"name": "Genghini",
"name": "Bernard Genghini",
"minute": 39
}
],
@@ -1466,21 +1401,21 @@
},
"goals1": [
{
"name": "Pezzey",
"name": "Bruno Pezzey",
"minute": 50
},
{
"name": "Hintermaier",
"name": "Reinhold Hintermaier",
"minute": 68
}
],
"goals2": [
{
"name": "Hamilton",
"name": "Billy Hamilton",
"minute": 27
},
{
"name": "Hamilton",
"name": "Billy Hamilton",
"minute": 75
}
],
@@ -1501,25 +1436,25 @@
},
"goals1": [
{
"name": "Giresse",
"name": "Alain Giresse",
"minute": 33
},
{
"name": "Giresse",
"name": "Alain Giresse",
"minute": 80
},
{
"name": "Rocheteau",
"name": "Dominique Rocheteau",
"minute": 46
},
{
"name": "Rocheteau",
"name": "Dominique Rocheteau",
"minute": 68
}
],
"goals2": [
{
"name": "Armstrong",
"name": "Gerry Armstrong",
"minute": 75
}
],
+1 -1
View File
@@ -2,7 +2,7 @@
"host": "Spain",
"teams_count": 24,
"winner": "Italy",
"runner_up": "West Germany",
"runner_up": "Germany",
"third_place": "Poland",
"fourth_place": "France"
}