Ik ben al tijd op zoek naar een API voor het verkrijgen van informatie wat betreft rijscholen waaronder de slagingspercentages en overige informatie.
Weet iemand toevallig een API hiervoor, ben wel bij de Open Data van CBR gekomen alleen weet echter niet wat ik daarmee moet.

Ik hoop dat iemand mij verder wil helpen hiermee..
Ik heb even snel gekeken naar de open data van het CBR maar hier is niet echt een API voor volgens mij. Wat ik wel gevonden heb zijn CSV bestanden. Deze kunnen met PHP ingelezen worden en desgewenst in een (mysql) database weggeschreven worden waarna je er met SQL relevante informatie uit kunt filteren.

Het beste kun je eens een CSV bestand downloaden en openen in Excel en vervolgens bekijken of hier de informatie in staat waarnaar je op zoek bent. Als dat inderdaad zo is zou je periodiek met behulp van PHP dit bestand kunnen inlezen.

Met php's fgetcsv kun je regel voor regel uit een csv bestand omzetten in een array.
Bedankt, ik wist al van het bestaan van de CSV files vroeg me al af of dat het geen was wat ik zocht.
Met fgetcsv kun ik deze wel in de database inserten.
Heb je enig idee hoe ik dit geautomatiseerd kan maken zodat dit zelf elke keer als er een nieuwe CSV file komt dit automatisch update ?
Want ik wil een submit maken, waar de gebruikers de rijscholen op een rij verkrijgen bv als ze "Amsterdam" intoesten dat ze de rijscholen in Amsterdam verkrijgen met de slagingspercentage, en overige gegevens etc.
Raymond Flaar op 01/12/2017 23:14:46

Heb je enig idee hoe ik dit geautomatiseerd kan maken zodat dit zelf elke keer als er een nieuwe CSV file komt dit automatisch update ?


Dat wordt een leuke uitdaging. Gelukkig zit er wel enigszins een vast patroon in de bestanden.

Je zou een cronjob kunnen maken die regelmatig deze rss uitleest. Het veld pubDate is in PHP om te zetten naar een DateTime object en biedt dus een methode om te zien of er een nieuw nieuwsbericht bijgekomen is. Dan kan je de titel scannen op "Diploma's" of "Examens" (Not sure welke jij wilt hebben). Indien dit keyword in de titel aanwezig is kun je de link volgen in het link veld. Hier zul je de HTML dan nog moeten scannen om de download link te vinden...

Omdat er ongetwijfeld wat onzekerheden in zitten zou ik een verslag genereren door de code en naar mijzelf laten mailen. Dan zou je in je mail kunnen lezen wat het laatste nieuws was en of er een bestand geimporteerd is.

[size=xsmall]Toevoeging op 02/12/2017 11:48:21:[/size]

Nou omdat ik het wel leuk vond om te doen heb ik hier een opzetje voor je. Garantie tot aan de deur :-)

<?php
/*
* Functie om CSV bestanden uit te lezen
*/
function parseCSV($filename)
{
$row = 1;
if (($handle = fopen($filename, 'r')) !== FALSE) {
while (($data = fgetcsv($handle, 0, ';')) !== FALSE) {
// echo de array. Ga dit aanpassen en opslaan in je database.
echo '<pre>' . print_r($data, true ) . '<\pre>'; // even laten zien wat we nu hebben!
}
fclose($handle);
}
}

/*
* Deze functie tracht om van de gegeven url een download link te maken.
*
* van: Opleiderresultaten-1-oktober-2016-t/m-30-september-2017
* naar: https://www.cbr.nl/download/opleiderresultaten_01102016_tm_30092017.csv
*/
function guessCBRDownloadLink($url)
{
$maanden = array('januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december');

// verkrijg de query string uit de url. Bijvoorbeeld id=1494&utm_source=rss&utm_medium=link&utm_campaign=Opleiderresultaten-1-oktober-2016-t/m-30-september-2017
parse_str(parse_url($url, PHP_URL_QUERY), $result);

// explode de variabele "Opleiderresultaten-1-oktober-2016-t/m-30-september-2017" op de "-" tekens
$words = explode('-', $result['utm_campaign']);

// zet nederlandse maanden om naar een getal. Bijvoorbeeld 'oktober' wordt 10.
$m1 = array_search($words[2], $maanden) + 1;
$m2 = array_search($words[6], $maanden) + 1;

// maak van de datums een DateTime object
$date1 = new DateTime($words[1] . '-' . $m1 . '-' . $words[3]);
$date2 = new DateTime($words[5] . '-' . $m2 . '-' . $words[7]);

// gebruik de DateTime objects om de download link te genereren
return 'https://www.cbr.nl/download/opleiderresultaten_'; . $date1->format('dmY') . '_tm_' . $date2->format('dmY') . '.csv';
}

/*
* Begin met het inlezen van de RSS
*/
$xmlString= file_get_contents('https://www.cbr.nl/downloadrss.pp?accountgroupid=1&categoryids=35';);

if(FALSE === $xmlString) {
throw new Exception('RSS feed kon niet gelezen worden.');
}

/*
* zet de inhoud van de RSS om in een XML object
*/
$xml = new SimpleXMLElement($xmlString);

/*
* Doorloop alle nieuwsberichten in de RSS
*/
foreach($xml->channel->item as $item) {
// pik de titels er tussen uit met het woord Opleiderresultaten.
if(FALSE !== strpos($item->title, 'Opleiderresultaten')) {
// sleutel de download link in elkaar voor het CSV bestand.
$csvFilename = guessCBRDownloadLink($item->link);
// Verwerk het CSV bestand
parseCSV($csvFilename);
// Nu dat we de nieuwste Opleiderresultaten verwerkt hebben zijn we niet meer benieuwd naar de oudere versies
break;
}
}
?>
Misschien aardige tip in verband met onzekerheid met betrekking tot hetgeen in de CSV aangeleverd wordt... Één en ander wegschrijven in MongoDB als document wegschrijven in een collection. Vervolgens kun je er achteraf wat checks op los laten. Het voordeel van MongoDB is dat in de collection zeer gevarieerde reeksen straffeloos kunnen worden weggeschreven. Je hoeft dus niet eerst velden te definiëren zoals in een mySQL database.
Het zijn gewone gestructureerde CSV bestanden die moeiteloos in een MySQL tabel passen. Daaruit kan je dan opvragingen doen. Het is even zoeken of CBR de structuur en naamgeving van de bestanden (url's) gestandaardiseerd heeft maar dan kan je met cron en als je OS toegang hebt met commandline script MySQL laden en zonodig een foutmelding emailen naar jezelf. Ik doe dat zelf met specifieke vaarweg informatie van Rijkswaterstaat en hieronder een voorbeeld script (linux commandline)
[code]
#!/bin/bash
DATE=`date +%d%m%Y`
URL='https://www.vaarweginformatie.nl/fdd/main/wicket/resource/org.apache.wicket.Application/downloadCsv?layoutId=44688553&berichtType=FTM&from=';
URL=$URL"$DATE"
/usr/bin/mysql -uuser -pwachtwoord -e "delete from vaarweginfo" vaarweginfo
# declare an array called array and define vales
array=( '409364' '409365' '561452' '561979' '562194' '562112' '562203' '562096' '562193' '562238' '562239' )
# wget alle gebieden uit de array.
# wget is geparameteriseerd via .wgetrc in de home directory van de user.
# /home/user/.wgetrc
# header = User-Agent: Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11
# header = Referer: http://www.vaarweginformatie.nl/
# header = accept-Encoding: compress, gzip
# header = Accept-Language: nl
# output_document = info.csv
# check_certificate = off
for gebied_rec in "${array[@]}"
do
echo '&gebied='$gebied_rec
REGIO='&gebied='$gebied_rec
wget $URL"$REGIO"
/usr/bin/mysql -uuser -pwachtwoord -e "source /home/aad/import.sql" vaarweginfo
mv /home/aad/info.csv /home/aad/$gebied_rec.csv
done
[/script]

Reageren