Como disse no primeiro post desta série, encontrei esta página com os resultados eleitorais de 2009. Nessa página, descobri que os resultados são carregados via AJAX, e que o resultado do pedido (via, se não me engano, url rewrite, que não sei até que ponto coise…) é uma string JSON. Melhor que isto, nem na farmácia.
Daí a descobrir quais os números que variam de distrito para distrito (de 010000 a 180000 nos continentais, 300000 para a Madeira, 400000 para os Açores) foi um saltinho, e depois era questão de se fazer umas chamadas (eu usei cURL, mas há mais maneiras do gato ir às filhoses), uns ciclos, aproveitar os campos que queríamos, et voilá, resultados prontos a serem inseridos numa base de dados.
Como bónus adicional, estes dados trazem também os resultados de 2005, o que é ainda mais porreiro, pá.
$distritos = array("01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "40", "30"); // isto é apenas um id de controle, para guardar as quantidades // de brancos e nulos $brancosNulosId = 20; $partidoId = 0; // para guardar os acrónimos dos partidos // o primeiro elemento já está preenchido, // para os ids baterem certo $partidos = array('empty'); $site = "http://www.legislativas2009.mj.pt/legislativas2009/static-data/territory-results/TERRITORY-RESULTS-LOCAL-"; foreach($distritos as $distrito) { $ch = curl_init($site . $distrito . "0000-AR.json"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch,CURLOPT_HTTPHEADER,array ( "Content-Type: text/xml; charset=utf-8" )); $ret = json_decode(curl_exec($ch), true); // na base de dados, tinha os Açores e Madeira com ids diferentes $distrito_id = ($distrito != "30") ? ($distrito != "40") ? intval($distrito) : 19 : 20; // existiam estes dois objectos com as mesmas propriedades, é só iterar foreach(array('currentResults', 'previousResults') as $resultados) { $res = $ret[$resultados]; // eleicao_id é da estrutura da BD if($resultados == 'currentResults') $eleicao_id = 1; else $eleicao_id = 2; // estou a mostrar as queries (depois foi só copiar e inserir), // mas podia ter inserido directamente numa BD echo "INSERT INTO eleitores (distrito_id, eleicao_id, qtd) VALUES(" . $distrito_id . ", " . $eleicao_id . ", " . $res['subscribedVoters'] . ");"; echo "INSERT INTO votacoes (eleicao_id, distrito_id, partido_id, qtd) VALUES(" . $eleicao_id . ", " . $distrito_id . ", " . $brancosNulosId . ", " . ($res['blankVotes'] + $res['nullVotes']) . ");"; foreach($res['resultsParty'] as $party) { $party['acronym'] = str_replace(".", "", $party['acronym']); if(!in_array($party['acronym'], $partidos)) { $partidos[] = $party['acronym']; // a orientação é um número que indica a posição "esquerda-direita" do partido echo "INSERT INTO partidos (partido_id, nome, \"real\", cor, orientacao) VALUES(" . ++$partidoId . ", '" . $party['acronym'] . "', 1, '', 0);"; } echo "INSERT INTO votacoes (eleicao_id, distrito_id, partido_id, qtd) VALUES(" . $eleicao_id . ", " . $distrito_id, ", " . array_search($party['acronym'], $partidos) . ", " . $party['votes'] . ");"; } } }
Uma última nota em relação às posições dos partidos: eu defini mais ou menos por senso comum, e ainda por cima, esse binómio é tudo menos pacífico hoje em dia. Fazemos assim: eu deixo aqui o que tenho, e se alguém tiver uma solução melhor, by all means, é só deixar um comentário.
POUS > PCTP/MRPP > PCP-PEV > BE > PTP > PS > MEP > PDA > MMS > PPM > PPD/PSD > CDS-PP > PND > PPV > PNR > MPT-PH > PH > MPT