rajtastic
7/20/2019 - 6:07 PM

WhoScored Player Grabber

WhoScored Player Grabber

/*
####################
### INSTRUCTIONS ###
####################

1) Copy all of this code
2) Go to "https://www.whoscored.com/"
3) Open the developer console
4) Paste the code in and run it (with ENTER)

Tips : 

- You can amend players returned by changing value of 'numberOfPlayers' below (if you have too many the CSV download will fail for some reason)

*/


var numberOfPlayers = 7500;

console.log("LOG | number of players per call=" + numberOfPlayers);

whoScoredData = {};
whoScoredData.players = {};
whoScoredData.functions = {};
whoScoredData.apiQueue = [];

whoScoredData.csv = {};
whoScoredData.csv.full = [];
whoScoredData.csv.headers = [];
whoScoredData.csv.full.export = [];

whoScoredData.functions.csvPrepper = function (){

	console.log("LOG | CSV prepper beginning");
	//whoScoredData.csv = {};
	//whoScoredData.csv.full = [];
	//whoScoredData.csv.headers = [];
	//whoScoredData.csv.full.export = [];



	for (attribute in whoScoredData.players[Object.keys(whoScoredData.players)[0]]){

		whoScoredData.csv.headers.push(attribute);

	}

	whoScoredData.csv.full.push(whoScoredData.csv.headers);

	console.log("LOG | CSV headers defined");

	for (playerId in whoScoredData.players){

		var playerArray = [];

		for (attribute in whoScoredData.players[playerId]){

			playerArray.push(whoScoredData.players[playerId][attribute]);

		}

		whoScoredData.csv.full.push(playerArray);


	}

	whoScoredData.functions.csvExporter(whoScoredData.csv.full);


}

whoScoredData.functions.apiQueuer = function (endpoint){

	whoScoredData.apiQueue.push(endpoint);
	console.log("LOG | API call queued : endpoint=" + endpoint);

}

whoScoredData.functions.apiQueueDispatcher = function (){

	if(whoScoredData.apiQueue.length > 0){

		console.log("LOG | API queue has " + whoScoredData.apiQueue.length + " calls remaining");
		var apiCall = whoScoredData.apiQueue.pop();
		whoScoredData.functions.apiCaller(apiCall);

	} else {

		console.log("LOG | API queue completed");
		whoScoredData.functions.csvPrepper();

	}
	


}

whoScoredData.functions.apiCaller = function(endpoint) {

	console.log("LOG | API call being made : endpoint=" + endpoint);

	// send data to API
	jQuery.ajax({
		type: "GET", // GET/POST/PUT ETC
		url: endpoint, // change to your URL endpoint
		//data: data, 
		dataType: "json",
		//success: success() // build throttling
		contentType: "application/json"

	}).success(function(playerData) {

		// Success
		console.log("LOG | SUCCESS");
		
		// 1) Prep 
		for (var i = 0; i < playerData.playerTableStats.length; i++) {
			
			whoScoredData.players[playerData.playerTableStats[i].playerId] = whoScoredData.players[playerData.playerTableStats[i].playerId] || {};			

			for (attribute in playerData.playerTableStats[i]){

				whoScoredData.players[playerData.playerTableStats[i].playerId][attribute] = playerData.playerTableStats[i][attribute];

			}			
		}

		// Dispatch more calls
		whoScoredData.functions.apiQueueDispatcher();

	}).fail(function(err) {

		// Fail

		// ADD ERROR DETAILS		
		console.log("LOG | FAIL | " + err);

	});
}

// FUNCTION : CSV EXPORTER
whoScoredData.functions.csvExporter = function(data) {

	console.log("LOG | CSV Exporter called : Creating CSV");
	// data must be formatted in arrays of arrays of data (one big array with an array per line, e.g. [[line1data1,line1data2],[line2data1,line2data2]])
	var csvContent = "data:text/csv;charset=utf-8,";

	csvContent += "NOTE : All commas have been replaced by '-' to ensure CSV could be generated correctly" + "\n" + "\n";	

	// Loop through and build rows
	for (var i = 0; i < data.length; i++) {

		// Loop through and remove ','s
		for (var j = 0; j < data[i].length; j++) {

			if (data[i][j]) {

				data[i][j] = data[i][j].toString().replace(/,/g, "-");

			}


		}

		var dataString = data[i].join(",");
		csvContent += dataString + "\n";

	}

	// Get date
	var d = new Date();
	var year = d.getFullYear();
	var month = d.getMonth() + 1;
	var day = d.getDate();
	var hour = d.getHours() + 1;
	var minute = d.getMinutes() + 1;
	var seconds = d.getSeconds() + 1;

	// Fix dates
	var dateFixer = function(date) {
		if (date.toString().length === 1) {
			date = "0" + date.toString();
		}
		return date;
	}

	// Fix dates
	var month = dateFixer(month);
	var day = dateFixer(day);
	var hour = dateFixer(hour);
	var minute = dateFixer(minute);
	var seconds = dateFixer(seconds);

	// Set Date 
	var timestamp = year + "-" + month + "-" + day + "_" + hour + "-" + minute + "-" + seconds;

	var encodedUri = encodeURI(csvContent);
	var link = document.createElement("a");
	link.setAttribute("href", encodedUri);
	link.setAttribute("download", "Top_" + numberOfPlayers + "players_" + timestamp + ".csv");
	document.body.appendChild(link); // Required for FF

	link.click(); // This will download the data file named "my_data.csv".
	console.log("LOG | CSV created");

}

// Queue API Calls
whoScoredData.functions.apiQueuer("https://www.whoscored.com/StatisticsFeed/1/GetPlayerStatistics?category=summary&subcategory=all&statsAccumulationType=0&isCurrent=true&playerId=&teamIds=&matchId=&stageId=&tournamentOptions=2,3,4,5,22&sortBy=Rating&sortAscending=&age=&ageComparisonType=&appearances=&appearancesComparisonType=&field=Overall&nationality=&positionOptions=&timeOfTheGameEnd=&timeOfTheGameStart=&isMinApp=false&page=&includeZeroValues=true&numberOfPlayersToPick=" + numberOfPlayers);
whoScoredData.functions.apiQueuer("https://www.whoscored.com/StatisticsFeed/1/GetPlayerStatistics?category=summary&subcategory=defensive&statsAccumulationType=0&isCurrent=true&playerId=&teamIds=&matchId=&stageId=&tournamentOptions=2,3,4,5,22&sortBy=Rating&sortAscending=&age=&ageComparisonType=&appearances=&appearancesComparisonType=&field=Overall&nationality=&positionOptions=&timeOfTheGameEnd=&timeOfTheGameStart=&isMinApp=true&page=&includeZeroValues=&numberOfPlayersToPick=" + numberOfPlayers);
whoScoredData.functions.apiQueuer("https://www.whoscored.com/StatisticsFeed/1/GetPlayerStatistics?category=summary&subcategory=offensive&statsAccumulationType=0&isCurrent=true&playerId=&teamIds=&matchId=&stageId=&tournamentOptions=2,3,4,5,22&sortBy=Rating&sortAscending=&age=&ageComparisonType=&appearances=&appearancesComparisonType=&field=Overall&nationality=&positionOptions=&timeOfTheGameEnd=&timeOfTheGameStart=&isMinApp=true&page=&includeZeroValues=&numberOfPlayersToPick=" + numberOfPlayers);
whoScoredData.functions.apiQueuer("https://www.whoscored.com/StatisticsFeed/1/GetPlayerStatistics?category=summary&subcategory=passing&statsAccumulationType=0&isCurrent=true&playerId=&teamIds=&matchId=&stageId=&tournamentOptions=2,3,4,5,22&sortBy=Rating&sortAscending=&age=&ageComparisonType=&appearances=&appearancesComparisonType=&field=Overall&nationality=&positionOptions=&timeOfTheGameEnd=&timeOfTheGameStart=&isMinApp=true&page=&includeZeroValues=&numberOfPlayersToPick=" + numberOfPlayers);
whoScoredData.functions.apiQueuer("https://www.whoscored.com/StatisticsFeed/1/GetPlayerStatistics?category=shots&subcategory=zones&statsAccumulationType=0&isCurrent=true&playerId=&teamIds=&matchId=&stageId=&tournamentOptions=2,3,4,5,22&sortBy=Rating&sortAscending=&age=&ageComparisonType=0&appearances=&appearancesComparisonType=0&field=&nationality=&positionOptions=&timeOfTheGameEnd=&timeOfTheGameStart=0&isMinApp=&page=1&includeZeroValues=&numberOfPlayersToPick=" + numberOfPlayers);
whoScoredData.functions.apiQueuer("https://www.whoscored.com/StatisticsFeed/1/GetPlayerStatistics?category=dribbles&subcategory=success&statsAccumulationType=0&isCurrent=true&playerId=&teamIds=&matchId=&stageId=&tournamentOptions=2,3,4,5,22&sortBy=Rating&sortAscending=&age=&ageComparisonType=0&appearances=&appearancesComparisonType=0&field=&nationality=&positionOptions=&timeOfTheGameEnd=&timeOfTheGameStart=0&isMinApp=&page=1&includeZeroValues=&numberOfPlayersToPick=" + numberOfPlayers);
whoScoredData.functions.apiQueuer("https://www.whoscored.com/StatisticsFeed/1/GetPlayerStatistics?category=shots&subcategory=accuracy&statsAccumulationType=0&isCurrent=true&playerId=&teamIds=&matchId=&stageId=&tournamentOptions=2,3,4,5,22&sortBy=Rating&sortAscending=&age=&ageComparisonType=0&appearances=&appearancesComparisonType=0&field=&nationality=&positionOptions=&timeOfTheGameEnd=&timeOfTheGameStart=0&isMinApp=&page=1&includeZeroValues=&numberOfPlayersToPick=" + numberOfPlayers);


// Dispatch Queue
whoScoredData.functions.apiQueueDispatcher();