CBR Rijscholen informatie verkrijgen
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..
Gewijzigd op 01/12/2017 22:01:29 door Raymond Flaar
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.
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.
Toevoeging op 02/12/2017 11:48:21:
Nou omdat ik het wel leuk vond om te doen heb ik hier een opzetje voor je. Garantie tot aan de deur :-)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<?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;
}
}
?>
/*
* 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.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/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]
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]
Gewijzigd op 03/12/2017 12:48:32 door Aad B