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
+125 -125
View File
@@ -14,11 +14,11 @@
},
"goals1": [
{
"name": "Suárez",
"name": "Luis Suárez",
"minute": 8
},
{
"name": "Suárez",
"name": "Luis Suárez",
"minute": 80
}
],
@@ -48,18 +48,18 @@
},
"goals1": [
{
"name": "Donovan",
"name": "Landon Donovan",
"minute": 62,
"penalty": true
}
],
"goals2": [
{
"name": "Boateng",
"name": "Kevin-Prince Boateng",
"minute": 5
},
{
"name": "Gyan",
"name": "Asamoah Gyan",
"minute": 93
}
],
@@ -79,25 +79,25 @@
},
"goals1": [
{
"name": "Klose",
"name": "Miroslav Klose",
"minute": 20
},
{
"name": "Podolski",
"name": "Lukas Podolski",
"minute": 32
},
{
"name": "Müller",
"name": "Thomas Müller",
"minute": 67
},
{
"name": "Müller",
"name": "Thomas Müller",
"minute": 70
}
],
"goals2": [
{
"name": "Upson",
"name": "Matthew Upson",
"minute": 37
}
],
@@ -117,21 +117,21 @@
},
"goals1": [
{
"name": "Tevez",
"name": "Carlos Tevez",
"minute": 26
},
{
"name": "Tevez",
"name": "Carlos Tevez",
"minute": 52
},
{
"name": "Higuaín",
"name": "Gonzalo Higuaín",
"minute": 33
}
],
"goals2": [
{
"name": "Hernández",
"name": "Javier Hernández",
"minute": 71
}
],
@@ -151,17 +151,17 @@
},
"goals1": [
{
"name": "Robben",
"name": "Arjen Robben",
"minute": 18
},
{
"name": "Sneijder",
"name": "Wesley Sneijder",
"minute": 84
}
],
"goals2": [
{
"name": "Vittek",
"name": "Róbert Vittek",
"minute": 90,
"offset": 4,
"penalty": true
@@ -233,7 +233,7 @@
},
"goals1": [
{
"name": "Villa",
"name": "David Villa",
"minute": 63
}
],
@@ -253,11 +253,11 @@
},
"goals1": [
{
"name": "Sneijder",
"name": "Wesley Sneijder",
"minute": 53
},
{
"name": "Sneijder",
"name": "Wesley Sneijder",
"minute": 68
}
],
@@ -291,13 +291,13 @@
},
"goals1": [
{
"name": "Forlán",
"name": "Diego Forlán",
"minute": 55
}
],
"goals2": [
{
"name": "Muntari",
"name": "Sulley Muntari",
"minute": 45,
"offset": 2
}
@@ -318,19 +318,19 @@
},
"goals2": [
{
"name": "Müller",
"name": "Thomas Müller",
"minute": 3
},
{
"name": "Klose",
"name": "Miroslav Klose",
"minute": 68
},
{
"name": "Klose",
"name": "Miroslav Klose",
"minute": 89
},
{
"name": "Friedrich",
"name": "Arne Friedrich",
"minute": 74
}
],
@@ -350,7 +350,7 @@
},
"goals2": [
{
"name": "Villa",
"name": "David Villa",
"minute": 83
}
],
@@ -370,26 +370,26 @@
},
"goals1": [
{
"name": "Forlán",
"name": "Diego Forlán",
"minute": 41
},
{
"name": "M. Pereira",
"name": "Maxi Pereira",
"minute": 90,
"offset": 2
}
],
"goals2": [
{
"name": "Van Bronckhorst",
"name": "Giovanni van Bronckhorst",
"minute": 18
},
{
"name": "Sneijder",
"name": "Wesley Sneijder",
"minute": 70
},
{
"name": "Robben",
"name": "Arjen Robben",
"minute": 73
}
],
@@ -409,7 +409,7 @@
},
"goals2": [
{
"name": "Puyol",
"name": "Carles Puyol",
"minute": 73
}
],
@@ -429,25 +429,25 @@
},
"goals1": [
{
"name": "Cavani",
"name": "Edinson Cavani",
"minute": 28
},
{
"name": "Forlán",
"name": "Diego Forlán",
"minute": 51
}
],
"goals2": [
{
"name": "Müller",
"name": "Thomas Müller",
"minute": 19
},
{
"name": "Jansen",
"name": "Marcell Jansen",
"minute": 56
},
{
"name": "Khedira",
"name": "Sami Khedira",
"minute": 82
}
],
@@ -471,7 +471,7 @@
},
"goals2": [
{
"name": "Iniesta",
"name": "Andrés Iniesta",
"minute": 116
}
],
@@ -492,13 +492,13 @@
},
"goals1": [
{
"name": "Tshabalala",
"name": "Siphiwe Tshabalala",
"minute": 55
}
],
"goals2": [
{
"name": "Márquez",
"name": "Rafael Márquez",
"minute": 79
}
],
@@ -534,16 +534,16 @@
},
"goals2": [
{
"name": "Forlán",
"name": "Diego Forlán",
"minute": 24
},
{
"name": "Forlán",
"name": "Diego Forlán",
"minute": 80,
"penalty": true
},
{
"name": . Pereira",
"name": lvaro Pereira",
"minute": 90,
"offset": 5
}
@@ -565,11 +565,11 @@
},
"goals2": [
{
"name": "Hernández",
"name": "Javier Hernández",
"minute": 64
},
{
"name": "Blanco",
"name": "Cuauhtémoc Blanco",
"minute": 79,
"penalty": true
}
@@ -591,7 +591,7 @@
},
"goals2": [
{
"name": "Suárez",
"name": "Luis Suárez",
"minute": 43
}
],
@@ -612,17 +612,17 @@
},
"goals1": [
{
"name": "Malouda",
"name": "Florent Malouda",
"minute": 70
}
],
"goals2": [
{
"name": "Khumalo",
"name": "Bongani Khumalo",
"minute": 20
},
{
"name": "Mphela",
"name": "Katlego Mphela",
"minute": 37
}
],
@@ -668,7 +668,7 @@
},
"goals1": [
{
"name": "Heinze",
"name": "Gabriel Heinze",
"minute": 6
}
],
@@ -694,15 +694,15 @@
"owngoal": true
},
{
"name": "Higuaín",
"name": "Gonzalo Higuaín",
"minute": 33
},
{
"name": "Higuaín",
"name": "Gonzalo Higuaín",
"minute": 76
},
{
"name": "Higuaín",
"name": "Gonzalo Higuaín",
"minute": 80
}
],
@@ -730,17 +730,17 @@
},
"goals1": [
{
"name": "Salpingidis",
"name": "Dimitris Salpingidis",
"minute": 44
},
{
"name": "Torosidis",
"name": "Vasilis Torosidis",
"minute": 71
}
],
"goals2": [
{
"name": "Uche",
"name": "Kalu Uche",
"minute": 16
}
],
@@ -761,7 +761,7 @@
},
"goals1": [
{
"name": "Uche",
"name": "Kalu Uche",
"minute": 12
},
{
@@ -797,11 +797,11 @@
},
"goals2": [
{
"name": "Demichelis",
"name": "Martín Demichelis",
"minute": 77
},
{
"name": "Palermo",
"name": "Martín Palermo",
"minute": 89
}
],
@@ -822,13 +822,13 @@
},
"goals1": [
{
"name": "Gerrard",
"name": "Steven Gerrard",
"minute": 4
}
],
"goals2": [
{
"name": "Dempsey",
"name": "Clint Dempsey",
"minute": 40
}
],
@@ -849,7 +849,7 @@
},
"goals2": [
{
"name": "Koren",
"name": "Robert Koren",
"minute": 79
}
],
@@ -870,21 +870,21 @@
},
"goals1": [
{
"name": "Birsa",
"name": "Valter Birsa",
"minute": 13
},
{
"name": "Ljubijankić",
"name": "Zlatan Ljubijankić",
"minute": 42
}
],
"goals2": [
{
"name": "Donovan",
"name": "Landon Donovan",
"minute": 48
},
{
"name": "Bradley",
"name": "Michael Bradley",
"minute": 82
}
],
@@ -920,7 +920,7 @@
},
"goals2": [
{
"name": "Defoe",
"name": "Jermain Defoe",
"minute": 23
}
],
@@ -941,7 +941,7 @@
},
"goals1": [
{
"name": "Donovan",
"name": "Landon Donovan",
"minute": 90,
"offset": 1
}
@@ -963,7 +963,7 @@
},
"goals2": [
{
"name": "Gyan",
"name": "Asamoah Gyan",
"minute": 85,
"penalty": true
}
@@ -985,15 +985,15 @@
},
"goals1": [
{
"name": "Podolski",
"name": "Lukas Podolski",
"minute": 8
},
{
"name": "Klose",
"name": "Miroslav Klose",
"minute": 26
},
{
"name": "Müller",
"name": "Thomas Müller",
"minute": 68
},
{
@@ -1018,7 +1018,7 @@
},
"goals2": [
{
"name": "Jovanović",
"name": "Milan Jovanović",
"minute": 38
}
],
@@ -1039,14 +1039,14 @@
},
"goals1": [
{
"name": "Gyan",
"name": "Asamoah Gyan",
"minute": 25,
"penalty": true
}
],
"goals2": [
{
"name": "Holman",
"name": "Brett Holman",
"minute": 11
}
],
@@ -1067,7 +1067,7 @@
},
"goals2": [
{
"name": "Özil",
"name": "Mesut Özil",
"minute": 60
}
],
@@ -1088,17 +1088,17 @@
},
"goals1": [
{
"name": "Cahill",
"name": "Tim Cahill",
"minute": 69
},
{
"name": "Holman",
"name": "Brett Holman",
"minute": 73
}
],
"goals2": [
{
"name": "Pantelić",
"name": "Marko Pantelić",
"minute": 84
}
],
@@ -1119,12 +1119,12 @@
},
"goals1": [
{
"name": "Agger",
"name": "Daniel Agger",
"minute": 46,
"owngoal": true
},
{
"name": "Kuyt",
"name": "Dirk Kuyt",
"minute": 85
}
],
@@ -1145,7 +1145,7 @@
},
"goals1": [
{
"name": "Honda",
"name": "Keisuke Honda",
"minute": 39
}
],
@@ -1166,7 +1166,7 @@
},
"goals1": [
{
"name": "Sneijder",
"name": "Wesley Sneijder",
"minute": 53
}
],
@@ -1187,17 +1187,17 @@
},
"goals1": [
{
"name": "Eto'o",
"name": "Samuel Eto'o",
"minute": 10
}
],
"goals2": [
{
"name": "Bendtner",
"name": "Nicklas Bendtner",
"minute": 33
},
{
"name": "Rommedahl",
"name": "Dennis Rommedahl",
"minute": 61
}
],
@@ -1218,21 +1218,21 @@
},
"goals1": [
{
"name": "Tomasson",
"name": "Jon Dahl Tomasson",
"minute": 81
}
],
"goals2": [
{
"name": "Honda",
"name": "Keisuke Honda",
"minute": 17
},
{
"name": "Endō",
"name": "Yasuhito Endō",
"minute": 30
},
{
"name": "Okazaki",
"name": "Shinji Okazaki",
"minute": 87
}
],
@@ -1253,18 +1253,18 @@
},
"goals1": [
{
"name": "Eto'o",
"name": "Samuel Eto'o",
"minute": 65,
"penalty": true
}
],
"goals2": [
{
"name": "Van Persie",
"name": "Robin van Persie",
"minute": 36
},
{
"name": "Huntelaar",
"name": "Klaas-Jan Huntelaar",
"minute": 83
}
],
@@ -1285,13 +1285,13 @@
},
"goals1": [
{
"name": "De Rossi",
"name": "Daniele De Rossi",
"minute": 63
}
],
"goals2": [
{
"name": "Alcaraz",
"name": "Antolín Alcaraz",
"minute": 39
}
],
@@ -1312,14 +1312,14 @@
},
"goals1": [
{
"name": "Reid",
"name": "Winston Reid",
"minute": 90,
"offset": 3
}
],
"goals2": [
{
"name": "Vittek",
"name": "Róbert Vittek",
"minute": 50
}
],
@@ -1340,11 +1340,11 @@
},
"goals2": [
{
"name": "Vera",
"name": "Enrique Vera",
"minute": 27
},
{
"name": "Riveros",
"name": "Cristian Riveros",
"minute": 86
}
],
@@ -1365,14 +1365,14 @@
},
"goals1": [
{
"name": "Iaquinta",
"name": "Vincenzo Iaquinta",
"minute": 29,
"penalty": true
}
],
"goals2": [
{
"name": "Smeltz",
"name": "Shane Smeltz",
"minute": 7
}
],
@@ -1393,25 +1393,25 @@
},
"goals1": [
{
"name": "Vittek",
"name": "Róbert Vittek",
"minute": 25
},
{
"name": "Vittek",
"name": "Róbert Vittek",
"minute": 73
},
{
"name": "Kopúnek",
"name": "Kamil Kopúnek",
"minute": 89
}
],
"goals2": [
{
"name": "Di Natale",
"name": "Antonio Di Natale",
"minute": 81
},
{
"name": "Quagliarella",
"name": "Fabio Quagliarella",
"minute": 90,
"offset": 2
}
@@ -1463,7 +1463,7 @@
},
"goals1": [
{
"name": "Maicon",
"name": "Maicon Sisenando",
"minute": 55
},
{
@@ -1508,7 +1508,7 @@
],
"goals2": [
{
"name": "Drogba",
"name": "Didier Drogba",
"minute": 79
}
],
@@ -1529,23 +1529,23 @@
},
"goals1": [
{
"name": "Meireles",
"name": "Raul Meireles",
"minute": 29
},
{
"name": "Simão",
"name": "Simão Sabrosa",
"minute": 53
},
{
"name": "Almeida",
"name": "Hugo Almeida",
"minute": 56
},
{
"name": "Tiago",
"name": "Tiago Mendes",
"minute": 60
},
{
"name": "Tiago",
"name": "Tiago Mendes",
"minute": 89
},
{
@@ -1553,7 +1553,7 @@
"minute": 81
},
{
"name": "Ronaldo",
"name": "Cristiano Ronaldo",
"minute": 87
}
],
@@ -1589,7 +1589,7 @@
},
"goals2": [
{
"name": "Y. Touré",
"name": "Yaya Touré",
"minute": 14
},
{
@@ -1597,7 +1597,7 @@
"minute": 20
},
{
"name": "Kalou",
"name": "Salomon Kalou",
"minute": 82
}
],
@@ -1618,7 +1618,7 @@
},
"goals2": [
{
"name": "Beausejour",
"name": "Jean Beausejour",
"minute": 34
}
],
@@ -1639,7 +1639,7 @@
},
"goals2": [
{
"name": "Fernandes",
"name": "Gelson Fernandes",
"minute": 52
}
],
@@ -1660,7 +1660,7 @@
},
"goals1": [
{
"name": "González",
"name": "Mark González",
"minute": 75
}
],
@@ -1681,11 +1681,11 @@
},
"goals1": [
{
"name": "Villa",
"name": "David Villa",
"minute": 17
},
{
"name": "Villa",
"name": "David Villa",
"minute": 51
}
],
@@ -1706,17 +1706,17 @@
},
"goals1": [
{
"name": "Millar",
"name": "Rodrigo Millar",
"minute": 47
}
],
"goals2": [
{
"name": "Villa",
"name": "David Villa",
"minute": 24
},
{
"name": "Iniesta",
"name": "Andrés Iniesta",
"minute": 37
}
],