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
-9
View File
@@ -54,15 +54,6 @@
"Croatia"
]
},
{
"name": "Group G",
"teams": [
"South Korea",
"Togo",
"France",
"Switzerland"
]
},
{
"name": "Group H",
"teams": [
+118 -266
View File
@@ -14,11 +14,11 @@
},
"goals1": [
{
"name": "Podolski",
"name": "Lukas Podolski",
"minute": 4
},
{
"name": "Podolski",
"name": "Lukas Podolski",
"minute": 12
}
],
@@ -42,17 +42,17 @@
},
"goals1": [
{
"name": "Crespo",
"name": "Hernán Crespo",
"minute": 10
},
{
"name": "Rodríguez",
"name": "Maxi Rodríguez",
"minute": 98
}
],
"goals2": [
{
"name": "Márquez",
"name": "Rafael Márquez",
"minute": 6
}
],
@@ -72,7 +72,7 @@
},
"goals1": [
{
"name": "Beckham",
"name": "David Beckham",
"minute": 60
}
],
@@ -112,7 +112,7 @@
},
"goals1": [
{
"name": "Totti",
"name": "Francesco Totti",
"minute": 90,
"offset": 5,
"penalty": true
@@ -185,22 +185,22 @@
},
"goals1": [
{
"name": "Villa",
"name": "David Villa",
"minute": 28,
"penalty": true
}
],
"goals2": [
{
"name": "Ribéry",
"name": "Franck Ribéry",
"minute": 41
},
{
"name": "Vieira",
"name": "Patrick Vieira",
"minute": 83
},
{
"name": "Zidane",
"name": "Zinedine Zidane",
"minute": 90,
"offset": 2
}
@@ -229,13 +229,13 @@
},
"goals1": [
{
"name": "Klose",
"name": "Miroslav Klose",
"minute": 80
}
],
"goals2": [
{
"name": "Ayala",
"name": "Roberto Ayala",
"minute": 49
}
],
@@ -255,15 +255,15 @@
},
"goals1": [
{
"name": "Zambrotta",
"name": "Gianluca Zambrotta",
"minute": 6
},
{
"name": "Toni",
"name": "Luca Toni",
"minute": 59
},
{
"name": "Toni",
"name": "Luca Toni",
"minute": 69
}
],
@@ -305,7 +305,7 @@
},
"goals2": [
{
"name": "Henry",
"name": "Thierry Henry",
"minute": 57
}
],
@@ -329,11 +329,11 @@
},
"goals2": [
{
"name": "Grosso",
"name": "Fabio Grosso",
"minute": 119
},
{
"name": "Del Piero",
"name": "Alessandro Del Piero",
"minute": 120,
"offset": 1
}
@@ -354,7 +354,7 @@
},
"goals2": [
{
"name": "Zidane",
"name": "Zinedine Zidane",
"minute": 33,
"penalty": true
}
@@ -375,11 +375,11 @@
},
"goals1": [
{
"name": "Schweinsteiger",
"name": "Bastian Schweinsteiger",
"minute": 56
},
{
"name": "Schweinsteiger",
"name": "Bastian Schweinsteiger",
"minute": 78
},
{
@@ -418,13 +418,13 @@
},
"goals1": [
{
"name": "Materazzi",
"name": "Marco Materazzi",
"minute": 19
}
],
"goals2": [
{
"name": "Zidane",
"name": "Zinedine Zidane",
"minute": 7,
"penalty": true
}
@@ -446,29 +446,29 @@
},
"goals1": [
{
"name": "Lahm",
"name": "Philipp Lahm",
"minute": 6
},
{
"name": "Klose",
"name": "Miroslav Klose",
"minute": 17
},
{
"name": "Klose",
"name": "Miroslav Klose",
"minute": 61
},
{
"name": "Frings",
"name": "Torsten Frings",
"minute": 87
}
],
"goals2": [
{
"name": "Wanchope",
"name": "Paulo Wanchope",
"minute": 12
},
{
"name": "Wanchope",
"name": "Paulo Wanchope",
"minute": 73
}
],
@@ -489,11 +489,11 @@
},
"goals2": [
{
"name": "C. Tenorio",
"name": "Carlos Tenorio",
"minute": 24
},
{
"name": "Delgado",
"name": "Agustín Delgado",
"minute": 80
}
],
@@ -514,7 +514,7 @@
},
"goals1": [
{
"name": "Neuville",
"name": "Oliver Neuville",
"minute": 90,
"offset": 1
}
@@ -536,15 +536,15 @@
},
"goals1": [
{
"name": "C. Tenorio",
"name": "Carlos Tenorio",
"minute": 8
},
{
"name": "Delgado",
"name": "Agustín Delgado",
"minute": 54
},
{
"name": "Kaviedes",
"name": "Iván Kaviedes",
"minute": 90,
"offset": 2
}
@@ -566,15 +566,15 @@
},
"goals2": [
{
"name": "Klose",
"name": "Miroslav Klose",
"minute": 4
},
{
"name": "Klose",
"name": "Miroslav Klose",
"minute": 44
},
{
"name": "Podolski",
"name": "Lukas Podolski",
"minute": 57
}
],
@@ -595,17 +595,17 @@
},
"goals1": [
{
"name": "Gómez",
"name": "Rónald Gómez",
"minute": 25
}
],
"goals2": [
{
"name": "Bosacki",
"name": "Bartosz Bosacki",
"minute": 33
},
{
"name": "Bosacki",
"name": "Bartosz Bosacki",
"minute": 65
}
],
@@ -626,7 +626,7 @@
},
"goals1": [
{
"name": "Gamarra",
"name": "Carlos Gamarra",
"minute": 4,
"owngoal": true
}
@@ -663,11 +663,11 @@
},
"goals1": [
{
"name": "Crouch",
"name": "Peter Crouch",
"minute": 83
},
{
"name": "Gerrard",
"name": "Steven Gerrard",
"minute": 90,
"offset": 1
}
@@ -689,7 +689,7 @@
},
"goals1": [
{
"name": "Ljungberg",
"name": "Freddie Ljungberg",
"minute": 89
}
],
@@ -710,21 +710,21 @@
},
"goals1": [
{
"name": "Allbäck",
"name": "Marcus Allbäck",
"minute": 51
},
{
"name": "Larsson",
"name": "Henrik Larsson",
"minute": 90
}
],
"goals2": [
{
"name": "J. Cole",
"name": "Joe Cole",
"minute": 34
},
{
"name": "Gerrard",
"name": "Steven Gerrard",
"minute": 85
}
],
@@ -745,12 +745,12 @@
},
"goals1": [
{
"name": "Sancho",
"name": "Brent Sancho",
"minute": 25,
"owngoal": true
},
{
"name": "Cuevas",
"name": "Nelson Cuevas",
"minute": 86
}
],
@@ -771,17 +771,17 @@
},
"goals1": [
{
"name": "Crespo",
"name": "Hernán Crespo",
"minute": 24
},
{
"name": "Saviola",
"name": "Javier Saviola",
"minute": 38
}
],
"goals2": [
{
"name": "Drogba",
"name": "Didier Drogba",
"minute": 82
}
],
@@ -802,7 +802,7 @@
},
"goals2": [
{
"name": "Robben",
"name": "Arjen Robben",
"minute": 18
}
],
@@ -823,27 +823,27 @@
},
"goals1": [
{
"name": "Rodríguez",
"name": "Maxi Rodríguez",
"minute": 6
},
{
"name": "Rodríguez",
"name": "Maxi Rodríguez",
"minute": 41
},
{
"name": "Cambiasso",
"name": "Esteban Cambiasso",
"minute": 31
},
{
"name": "Crespo",
"name": "Hernán Crespo",
"minute": 78
},
{
"name": "Tevez",
"name": "Carlos Tevez",
"minute": 84
},
{
"name": "Messi",
"name": "Lionel Messi",
"minute": 88
}
],
@@ -864,17 +864,17 @@
},
"goals1": [
{
"name": "Van Persie",
"name": "Robin van Persie",
"minute": 23
},
{
"name": "Van Nistelrooy",
"name": "Ruud van Nistelrooy",
"minute": 27
}
],
"goals2": [
{
"name": "B. Koné",
"name": "Bakari Koné",
"minute": 38
}
],
@@ -910,27 +910,27 @@
},
"goals1": [
{
"name": "Dindane",
"name": "Aruna Dindane",
"minute": 37,
"penalty": true
},
{
"name": "Dindane",
"name": "Aruna Dindane",
"minute": 67
},
{
"name": "Kalou",
"name": "Bonaventure Kalou",
"minute": 86,
"penalty": true
}
],
"goals2": [
{
"name": "Žigić",
"name": "Nikola Žigić",
"minute": 10
},
{
"name": "Ilić",
"name": "Saša Ilić",
"minute": 20
}
],
@@ -951,11 +951,11 @@
},
"goals1": [
{
"name": "Bravo",
"name": "Omar Bravo",
"minute": 28
},
{
"name": "Bravo",
"name": "Omar Bravo",
"minute": 76
},
{
@@ -965,7 +965,7 @@
],
"goals2": [
{
"name": "Golmohammadi",
"name": "Yahya Golmohammadi",
"minute": 36
}
],
@@ -1026,7 +1026,7 @@
"minute": 63
},
{
"name": "Ronaldo",
"name": "Cristiano Ronaldo",
"minute": 80,
"penalty": true
}
@@ -1052,14 +1052,14 @@
"minute": 6
},
{
"name": "Simão",
"name": "Simão Sabrosa",
"minute": 24,
"penalty": true
}
],
"goals2": [
{
"name": "Fonseca",
"name": "Francisco Fonseca",
"minute": 29
}
],
@@ -1080,13 +1080,13 @@
},
"goals1": [
{
"name": "Bakhtiarizadeh",
"name": "Sohrab Bakhtiarizadeh",
"minute": 75
}
],
"goals2": [
{
"name": "Flávio",
"name": "Flávio Amado",
"minute": 60
}
],
@@ -1107,15 +1107,15 @@
},
"goals2": [
{
"name": "Koller",
"name": "Jan Koller",
"minute": 5
},
{
"name": "Rosický",
"name": "Tomáš Rosický",
"minute": 36
},
{
"name": "Rosický",
"name": "Tomáš Rosický",
"minute": 76
}
],
@@ -1136,11 +1136,11 @@
},
"goals1": [
{
"name": "Pirlo",
"name": "Andrea Pirlo",
"minute": 40
},
{
"name": "Iaquinta",
"name": "Vincenzo Iaquinta",
"minute": 83
}
],
@@ -1161,11 +1161,11 @@
},
"goals2": [
{
"name": "Gyan",
"name": "Asamoah Gyan",
"minute": 2
},
{
"name": "Muntari",
"name": "Sulley Muntari",
"minute": 82
}
],
@@ -1186,13 +1186,13 @@
},
"goals1": [
{
"name": "Gilardino",
"name": "Alberto Gilardino",
"minute": 22
}
],
"goals2": [
{
"name": "Zaccardo",
"name": "Cristian Zaccardo",
"minute": 27,
"owngoal": true
}
@@ -1214,11 +1214,11 @@
},
"goals2": [
{
"name": "Materazzi",
"name": "Marco Materazzi",
"minute": 26
},
{
"name": "Inzaghi",
"name": "Filippo Inzaghi",
"minute": 87
}
],
@@ -1239,11 +1239,11 @@
},
"goals1": [
{
"name": "Draman",
"name": "Haminu Draman",
"minute": 22
},
{
"name": "Appiah",
"name": "Stephen Appiah",
"minute": 45,
"offset": 2,
"penalty": true
@@ -1251,7 +1251,7 @@
],
"goals2": [
{
"name": "Dempsey",
"name": "Clint Dempsey",
"minute": 43
}
],
@@ -1272,22 +1272,22 @@
},
"goals1": [
{
"name": "Cahill",
"name": "Tim Cahill",
"minute": 84
},
{
"name": "Cahill",
"name": "Tim Cahill",
"minute": 89
},
{
"name": "Aloisi",
"name": "John Aloisi",
"minute": 90,
"offset": 2
}
],
"goals2": [
{
"name": "Nakamura",
"name": "Shunsuke Nakamura",
"minute": 26
}
],
@@ -1369,7 +1369,7 @@
},
"goals1": [
{
"name": "Tamada",
"name": "Keiji Tamada",
"minute": 34
}
],
@@ -1384,7 +1384,7 @@
"minute": 81
},
{
"name": "Juninho",
"name": "Juninho Pernambucano",
"minute": 53
},
{
@@ -1409,175 +1409,27 @@
},
"goals1": [
{
"name": "Srna",
"name": "Darijo Srna",
"minute": 2
},
{
"name": "N. Kovač",
"name": "Niko Kovač",
"minute": 56
}
],
"goals2": [
{
"name": "Moore",
"name": "Craig Moore",
"minute": 38,
"penalty": true
},
{
"name": "Kewell",
"name": "Harry Kewell",
"minute": 79
}
],
"ground": "Gottlieb-Daimler-Stadion, Stuttgart"
},
{
"round": "Group stage",
"group": "Group G",
"date": "2006-06-13",
"time": "15:00",
"team1": "South Korea",
"team2": "Togo",
"score": {
"ft": [
2,
1
]
},
"goals1": [
{
"name": "Lee Chun-soo",
"minute": 54
},
{
"name": "Ahn Jung-hwan",
"minute": 72
}
],
"goals2": [
{
"name": "Kader",
"minute": 31
}
],
"ground": "Waldstadion, Frankfurt"
},
{
"round": "Group stage",
"group": "Group G",
"date": "2006-06-13",
"time": "18:00",
"team1": "France",
"team2": "Switzerland",
"score": {
"ft": [
0,
0
]
},
"ground": "Gottlieb-Daimler-Stadion, Stuttgart"
},
{
"round": "Group stage",
"group": "Group G",
"date": "2006-06-18",
"time": "21:00",
"team1": "France",
"team2": "South Korea",
"score": {
"ft": [
1,
1
]
},
"goals1": [
{
"name": "Henry",
"minute": 9
}
],
"goals2": [
{
"name": "Park Ji-sung",
"minute": 81
}
],
"ground": "Zentralstadion, Leipzig"
},
{
"round": "Group stage",
"group": "Group G",
"date": "2006-06-19",
"time": "15:00",
"team1": "Togo",
"team2": "Switzerland",
"score": {
"ft": [
0,
2
]
},
"goals2": [
{
"name": "Frei",
"minute": 16
},
{
"name": "Barnetta",
"minute": 88
}
],
"ground": "Westfalenstadion, Dortmund"
},
{
"round": "Group stage",
"group": "Group G",
"date": "2006-06-23",
"time": "21:00",
"team1": "Togo",
"team2": "France",
"score": {
"ft": [
0,
2
]
},
"goals2": [
{
"name": "Vieira",
"minute": 55
},
{
"name": "Henry",
"minute": 61
}
],
"ground": "RheinEnergieStadion, Cologne"
},
{
"round": "Group stage",
"group": "Group G",
"date": "2006-06-23",
"time": "21:00",
"team1": "Switzerland",
"team2": "South Korea",
"score": {
"ft": [
2,
0
]
},
"goals1": [
{
"name": "Senderos",
"minute": 23
},
{
"name": "Frei",
"minute": 77
}
],
"ground": "Niedersachsenstadion, Hanover"
},
{
"round": "Group stage",
"group": "Group H",
@@ -1593,20 +1445,20 @@
},
"goals1": [
{
"name": "Alonso",
"name": "Xabi Alonso",
"minute": 13
},
{
"name": "Villa",
"name": "David Villa",
"minute": 17
},
{
"name": "Villa",
"name": "David Villa",
"minute": 48,
"penalty": true
},
{
"name": "Torres",
"name": "Fernando Torres",
"minute": 81
}
],
@@ -1627,22 +1479,22 @@
},
"goals1": [
{
"name": "Jaziri",
"name": "Ziad Jaziri",
"minute": 23
},
{
"name": "Jaïdi",
"name": "Radhi Jaïdi",
"minute": 90,
"offset": 2
}
],
"goals2": [
{
"name": "Al-Qahtani",
"name": "Yasser Al Qahtani",
"minute": 57
},
{
"name": "Al-Jaber",
"name": "Sami Al Jaber",
"minute": 84
}
],
@@ -1663,19 +1515,19 @@
},
"goals2": [
{
"name": "Rusol",
"name": "Andriy Rusol",
"minute": 4
},
{
"name": "Rebrov",
"name": "Serhii Rebrov",
"minute": 36
},
{
"name": "Shevchenko",
"name": "Andriy Shevchenko",
"minute": 46
},
{
"name": "Kalynychenko",
"name": "Maksym Kalynychenko",
"minute": 84
}
],
@@ -1700,11 +1552,11 @@
"minute": 71
},
{
"name": "Torres",
"name": "Fernando Torres",
"minute": 76
},
{
"name": "Torres",
"name": "Fernando Torres",
"minute": 90,
"offset": 1,
"penalty": true
@@ -1712,7 +1564,7 @@
],
"goals2": [
{
"name": "Mnari",
"name": "Jawhar Mnari",
"minute": 8
}
],
@@ -1754,7 +1606,7 @@
},
"goals1": [
{
"name": "Shevchenko",
"name": "Andriy Shevchenko",
"minute": 70,
"penalty": true
}