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
+123 -123
View File
@@ -14,11 +14,11 @@
},
"goals1": [
{
"name": "Negrete",
"name": "Manuel Negrete Arias",
"minute": 34
},
{
"name": "Servín",
"name": "Raúl Servín",
"minute": 61
}
],
@@ -42,34 +42,34 @@
},
"goals1": [
{
"name": "Belanov",
"name": "Igor Belanov",
"minute": 27
},
{
"name": "Belanov",
"name": "Igor Belanov",
"minute": 70
},
{
"name": "Belanov",
"name": "Igor Belanov",
"minute": 111,
"penalty": true
}
],
"goals2": [
{
"name": "Scifo",
"name": "Enzo Scifo",
"minute": 56
},
{
"name": "Ceulemans",
"name": "Jan Ceulemans",
"minute": 77
},
{
"name": "Demol",
"name": "Stéphane Demol",
"minute": 102
},
{
"name": "Claesen",
"name": "Nico Claesen",
"minute": 110
}
],
@@ -98,7 +98,7 @@
"minute": 55
},
{
"name": "Edinho",
"name": "Edino Nazareth Filho",
"minute": 79
},
{
@@ -123,7 +123,7 @@
},
"goals1": [
{
"name": "Pasculli",
"name": "Pedro Pasculli",
"minute": 42
}
],
@@ -143,11 +143,11 @@
},
"goals2": [
{
"name": "Platini",
"name": "Michel Platini",
"minute": 15
},
{
"name": "Stopyra",
"name": "Yannick Stopyra",
"minute": 57
}
],
@@ -158,7 +158,7 @@
"date": "1986-06-17",
"time": "16:00",
"team1": "Morocco",
"team2": "West Germany",
"team2": "Germany",
"score": {
"ft": [
0,
@@ -167,7 +167,7 @@
},
"goals2": [
{
"name": "Matthäus",
"name": "Lothar Matthäus",
"minute": 88
}
],
@@ -187,15 +187,15 @@
},
"goals1": [
{
"name": "Lineker",
"name": "Gary Lineker",
"minute": 31
},
{
"name": "Lineker",
"name": "Gary Lineker",
"minute": 73
},
{
"name": "Beardsley",
"name": "Peter Beardsley",
"minute": 56
}
],
@@ -215,31 +215,31 @@
},
"goals1": [
{
"name": "J. Olsen",
"name": "Jesper Olsen",
"minute": 33,
"penalty": true
}
],
"goals2": [
{
"name": "Butragueño",
"name": "Emilio Butragueño",
"minute": 43
},
{
"name": "Butragueño",
"name": "Emilio Butragueño",
"minute": 56
},
{
"name": "Butragueño",
"name": "Emilio Butragueño",
"minute": 80
},
{
"name": "Butragueño",
"name": "Emilio Butragueño",
"minute": 88,
"penalty": true
},
{
"name": "Goikoetxea",
"name": "Andoni Goikoetxea Olaskoaga",
"minute": 68,
"penalty": true
}
@@ -274,7 +274,7 @@
],
"goals2": [
{
"name": "Platini",
"name": "Michel Platini",
"minute": 40
}
],
@@ -284,7 +284,7 @@
"round": "Quarter-finals",
"date": "1986-06-21",
"time": "16:00",
"team1": "West Germany",
"team1": "Germany",
"team2": "Mexico",
"score": {
"ft": [
@@ -316,17 +316,17 @@
},
"goals1": [
{
"name": "Maradona",
"name": "Diego Maradona",
"minute": 51
},
{
"name": "Maradona",
"name": "Diego Maradona",
"minute": 55
}
],
"goals2": [
{
"name": "Lineker",
"name": "Gary Lineker",
"minute": 81
}
],
@@ -354,13 +354,13 @@
},
"goals1": [
{
"name": "Señor",
"name": "Juan Antonio Señor",
"minute": 85
}
],
"goals2": [
{
"name": "Ceulemans",
"name": "Jan Ceulemans",
"minute": 35
}
],
@@ -371,7 +371,7 @@
"date": "1986-06-25",
"time": "12:00",
"team1": "France",
"team2": "West Germany",
"team2": "Germany",
"score": {
"ft": [
0,
@@ -380,11 +380,11 @@
},
"goals2": [
{
"name": "Brehme",
"name": "Andreas Brehme",
"minute": 9
},
{
"name": "Völler",
"name": "Rudi Völler",
"minute": 90
}
],
@@ -404,11 +404,11 @@
},
"goals1": [
{
"name": "Maradona",
"name": "Diego Maradona",
"minute": 51
},
{
"name": "Maradona",
"name": "Diego Maradona",
"minute": 63
}
],
@@ -432,29 +432,29 @@
},
"goals1": [
{
"name": "Ceulemans",
"name": "Jan Ceulemans",
"minute": 11
},
{
"name": "Claesen",
"name": "Nico Claesen",
"minute": 73
}
],
"goals2": [
{
"name": "Ferreri",
"name": "Jean-Marc Ferreri",
"minute": 27
},
{
"name": "Papin",
"name": "Jean-Pierre Papin",
"minute": 43
},
{
"name": "Genghini",
"name": "Bernard Genghini",
"minute": 104
},
{
"name": "Amoros",
"name": "Manuel Amoros",
"minute": 111,
"penalty": true
}
@@ -466,7 +466,7 @@
"date": "1986-06-29",
"time": "12:00",
"team1": "Argentina",
"team2": "West Germany",
"team2": "Germany",
"score": {
"ft": [
3,
@@ -475,25 +475,25 @@
},
"goals1": [
{
"name": "Brown",
"name": "José Luis Brown",
"minute": 23
},
{
"name": "Valdano",
"name": "Jorge Valdano",
"minute": 56
},
{
"name": "Burruchaga",
"name": "Jorge Burruchaga",
"minute": 84
}
],
"goals2": [
{
"name": "Rummenigge",
"name": "Karl-Heinz Rummenigge",
"minute": 74
},
{
"name": "Völler",
"name": "Rudi Völler",
"minute": 81
}
],
@@ -514,13 +514,13 @@
},
"goals1": [
{
"name": "Sirakov",
"name": "Nasko Sirakov",
"minute": 85
}
],
"goals2": [
{
"name": "Altobelli",
"name": "Alessandro Altobelli",
"minute": 44
}
],
@@ -541,15 +541,15 @@
},
"goals1": [
{
"name": "Valdano",
"name": "Jorge Valdano",
"minute": 6
},
{
"name": "Valdano",
"name": "Jorge Valdano",
"minute": 46
},
{
"name": "Ruggeri",
"name": "Oscar Ruggeri",
"minute": 18
}
],
@@ -576,14 +576,14 @@
},
"goals1": [
{
"name": "Altobelli",
"name": "Alessandro Altobelli",
"minute": 6,
"penalty": true
}
],
"goals2": [
{
"name": "Maradona",
"name": "Diego Maradona",
"minute": 34
}
],
@@ -610,7 +610,7 @@
],
"goals2": [
{
"name": "Getov",
"name": "Plamen Getov",
"minute": 11
}
],
@@ -641,11 +641,11 @@
],
"goals2": [
{
"name": "Altobelli",
"name": "Alessandro Altobelli",
"minute": 17
},
{
"name": "Altobelli",
"name": "Alessandro Altobelli",
"minute": 73
},
{
@@ -671,11 +671,11 @@
},
"goals1": [
{
"name": "Valdano",
"name": "Jorge Valdano",
"minute": 4
},
{
"name": "Burruchaga",
"name": "Jorge Burruchaga",
"minute": 77
}
],
@@ -696,17 +696,17 @@
},
"goals1": [
{
"name": "Vandenbergh",
"name": "Erwin Vandenbergh",
"minute": 45
}
],
"goals2": [
{
"name": "Quirarte",
"name": "Fernando Quirarte",
"minute": 23
},
{
"name": "Sánchez",
"name": "Hugo Sánchez",
"minute": 39
}
],
@@ -727,7 +727,7 @@
},
"goals1": [
{
"name": "Romero",
"name": "Julio César Romero",
"minute": 35
}
],
@@ -748,13 +748,13 @@
},
"goals1": [
{
"name": "Flores",
"name": "Luis Flores",
"minute": 3
}
],
"goals2": [
{
"name": "Romero",
"name": "Julio César Romero",
"minute": 85
}
],
@@ -775,17 +775,17 @@
},
"goals1": [
{
"name": "Radhi",
"name": "Ahmed Radhi",
"minute": 59
}
],
"goals2": [
{
"name": "Scifo",
"name": "Enzo Scifo",
"minute": 16
},
{
"name": "Claesen",
"name": "Nico Claesen",
"minute": 21,
"penalty": true
}
@@ -807,21 +807,21 @@
},
"goals1": [
{
"name": "Cabañas",
"name": "Roberto Cabañas",
"minute": 50
},
{
"name": "Cabañas",
"name": "Roberto Cabañas",
"minute": 76
}
],
"goals2": [
{
"name": "Vercauteren",
"name": "Franky Vercauteren",
"minute": 30
},
{
"name": "Veyt",
"name": "Daniel Veyt",
"minute": 59
}
],
@@ -842,7 +842,7 @@
},
"goals2": [
{
"name": "Quirarte",
"name": "Fernando Quirarte",
"minute": 54
}
],
@@ -863,7 +863,7 @@
},
"goals2": [
{
"name": "Papin",
"name": "Jean-Pierre Papin",
"minute": 79
}
],
@@ -884,29 +884,29 @@
},
"goals1": [
{
"name": "Yakovenko",
"name": "Pavlo Yakovenko",
"minute": 2
},
{
"name": "Aleinikov",
"name": "Sergei Aleinikov",
"minute": 4
},
{
"name": "Belanov",
"name": "Igor Belanov",
"minute": 24,
"penalty": true
},
{
"name": "Yaremchuk",
"name": "Ivan Yaremchuk",
"minute": 66
},
{
"name": "Dajka",
"name": "László Dajka",
"minute": 73,
"owngoal": true
},
{
"name": "Rodionov",
"name": "Sergey Rodionov",
"minute": 80
}
],
@@ -927,13 +927,13 @@
},
"goals1": [
{
"name": "Fernández",
"name": "Luis Fernández",
"minute": 62
}
],
"goals2": [
{
"name": "Rats",
"name": "Vasyl Rats",
"minute": 53
}
],
@@ -954,11 +954,11 @@
},
"goals1": [
{
"name": "Esterházy",
"name": "Márton Esterházy",
"minute": 2
},
{
"name": "Détári",
"name": "Lajos Détári",
"minute": 75
}
],
@@ -979,15 +979,15 @@
},
"goals2": [
{
"name": "Stopyra",
"name": "Yannick Stopyra",
"minute": 29
},
{
"name": "Tigana",
"name": "Jean Tigana",
"minute": 62
},
{
"name": "Rocheteau",
"name": "Dominique Rocheteau",
"minute": 84
}
],
@@ -1008,11 +1008,11 @@
},
"goals1": [
{
"name": "Blokhin",
"name": "Oleg Blokhin",
"minute": 58
},
{
"name": "Zavarov",
"name": "Oleksandr Zavarov",
"minute": 74
}
],
@@ -1054,13 +1054,13 @@
},
"goals1": [
{
"name": "Zidane",
"name": "Djamel Zidane",
"minute": 59
}
],
"goals2": [
{
"name": "Whiteside",
"name": "Norman Whiteside",
"minute": 6
}
],
@@ -1102,17 +1102,17 @@
},
"goals1": [
{
"name": "Clarke",
"name": "Colin Clarke",
"minute": 46
}
],
"goals2": [
{
"name": "Butragueño",
"name": "Emilio Butragueño",
"minute": 1
},
{
"name": "Salinas",
"name": "Julio Salinas",
"minute": 18
}
],
@@ -1162,11 +1162,11 @@
},
"goals2": [
{
"name": "Calderé",
"name": "Ramón Calderé",
"minute": 15
},
{
"name": "Calderé",
"name": "Ramón Calderé",
"minute": 68
},
{
@@ -1182,7 +1182,7 @@
"date": "1986-06-04",
"time": "12:00",
"team1": "Uruguay",
"team2": "West Germany",
"team2": "Germany",
"score": {
"ft": [
1,
@@ -1191,13 +1191,13 @@
},
"goals1": [
{
"name": "Alzamendi",
"name": "Antonio Alzamendi",
"minute": 4
}
],
"goals2": [
{
"name": "Allofs",
"name": "Klaus Allofs",
"minute": 84
}
],
@@ -1218,7 +1218,7 @@
},
"goals2": [
{
"name": "Elkjær",
"name": "Preben Elkjær",
"minute": 57
}
],
@@ -1229,7 +1229,7 @@
"group": "Group E",
"date": "1986-06-08",
"time": "12:00",
"team1": "West Germany",
"team1": "Germany",
"team2": "Scotland",
"score": {
"ft": [
@@ -1239,17 +1239,17 @@
},
"goals1": [
{
"name": "Völler",
"name": "Rudi Völler",
"minute": 23
},
{
"name": "Allofs",
"name": "Klaus Allofs",
"minute": 49
}
],
"goals2": [
{
"name": "Strachan",
"name": "Gordon Strachan",
"minute": 18
}
],
@@ -1270,33 +1270,33 @@
},
"goals1": [
{
"name": "Elkjær",
"name": "Preben Elkjær",
"minute": 11
},
{
"name": "Elkjær",
"name": "Preben Elkjær",
"minute": 67
},
{
"name": "Elkjær",
"name": "Preben Elkjær",
"minute": 80
},
{
"name": "Lerby",
"name": "Søren Lerby",
"minute": 41
},
{
"name": "Laudrup",
"name": "Michael Laudrup",
"minute": 52
},
{
"name": "J. Olsen",
"name": "Jesper Olsen",
"minute": 88
}
],
"goals2": [
{
"name": "Francescoli",
"name": "Enzo Francescoli",
"minute": 45,
"penalty": true
}
@@ -1309,7 +1309,7 @@
"date": "1986-06-13",
"time": "12:00",
"team1": "Denmark",
"team2": "West Germany",
"team2": "Germany",
"score": {
"ft": [
2,
@@ -1318,12 +1318,12 @@
},
"goals1": [
{
"name": "J. Olsen",
"name": "Jesper Olsen",
"minute": 43,
"penalty": true
},
{
"name": "Eriksen",
"name": "John Eriksen",
"minute": 62
}
],
@@ -1410,7 +1410,7 @@
},
"goals1": [
{
"name": "Smolarek",
"name": "Włodzimierz Smolarek",
"minute": 68
}
],
@@ -1431,15 +1431,15 @@
},
"goals1": [
{
"name": "Lineker",
"name": "Gary Lineker",
"minute": 8
},
{
"name": "Lineker",
"name": "Gary Lineker",
"minute": 14
},
{
"name": "Lineker",
"name": "Gary Lineker",
"minute": 36
}
],
@@ -1460,21 +1460,21 @@
},
"goals1": [
{
"name": "Diamantino",
"name": "Diamantino Miranda",
"minute": 80
}
],
"goals2": [
{
"name": "Khairi",
"name": "Abderrazak Khairi",
"minute": 19
},
{
"name": "Khairi",
"name": "Abderrazak Khairi",
"minute": 27
},
{
"name": "A. Merry",
"name": "Abdelkrim Merry",
"minute": 62
}
],