Boursicoteur à mes heures perdues, je m’intéresse surtout aux méthodes d’analyse graphique et aux traitements statistiques. J’utilise pour cela une base de données que j’alimente régulièrement avec les dernières cotations boursières.
Le site ABCBourse fournit gratuitement ces valeurs sous forme d’un fichier csv, téléchargeable par l’intermédiaire d’un formulaire. Ce dernier permet de spécifier la période et les catégories de valeurs souhaitées : http://download.abcbourse.com/historiques.aspx?f=ex
Pour corser un peu l’énoncé, le site n’autorise pas le téléchargement de l’intégralité des valeurs en une seule fois, si la période dépasse la journée. L’objectif de cet article, vous l’aurez compris, est de montrer comment automatiser la récupération de ces valeurs au jour le jour, en vue de leur intégration dans une base mysql.
Lynx, le navigateur en mode texte bien connu de tout geek qui se respecte, dispose d’une option très intéressante : il permet l’enregistrement de toutes les touches pressées lors de la navigation. Le fichier ainsi obtenu pourra ensuite être rejoué, un peu comme une macro.
En remplaçant dans ce fichier les dates saisies pour le formulaire par les dates souhaitées, le tour est joué…
Allez… Zou !!!
Etape 1 : Ca tourne !
$ lynx -accept_all_cookies -cmd_log=abc.log
http://download.abcbourse.com/historiques.aspx?f=ex
Complétons le formulaire en prenant soin de bien saisir la date de début, la date de fin et de cocher les catégories de valeurs souhaitées. Un ou deux essais peuvent s’avérer nécessaires quand on n’est pas familiarisé avec ce type de navigateur…
Un « pseudo clic » sur le bouton « Submit » (marqué [Télécharger.gif]-Submit), la liste des actions et leurs cours apparaît.
La touche « p » permet d’accéder au menu d’impression. Ce menu permet également d’enregistrer la page dans un fichier. Le nom du fichier par défaut est de la forme Cotations[aaaammjj].txt; Très bien ça !
Nous pouvons quitter Lynx, c’est dans la boîte ! La séquence de touches est enregistrée dans le fichier abc.log .
Pour vérifier son enregistrement, nous pouvons directement rejouer la « scène » :
lynx -accept_all_cookies -cmd_script=abc.log
http://download.abcbourse.com/historiques.aspx?f=ex
Etape 2 : Le montage
Editons maintenant le fichier abc.log. L’exercice va consister à repérer les dates et à remplacer leurs chiffres par des balises qui seront exploitables par un script. Je choisis arbitrairement :
- XXJ1 XXJ2 pour les deux chiffres du jour
- XXM1 XXM2 pour les deux chiffres du mois
- XXA1 XXA2 XXA3 XXA4 pour les quatre chiffres de l’année
$ vi abc.log
# Command logfile created by Lynx 2.8.5rel.1 (04 Feb 2004) # Arg0 = lynx # Arg1 = -accept_all_cookies # Arg2 = -cmd_log=abc.log # Arg3 = http://download.abcbourse.com/historiques.aspx?f=ex key <Down Arrow> key <Down Arrow> key <Down Arrow> ... key <delete> key <delete> key <delete> # Ici le jour de début # key 2 # key 3 key XXJ1 key XXJ2 key / # Ici le mois de début # key 0 # key 9 key XXM1 key XXM2 key / # Ici l'année de début # key 2 # key 0 # key 0 # key 8 key XXA1 key XXA2 key XXA3 key XXA4 key <Right Arrow> key <delete> key <delete> key <delete> ... # Ici le jour de fin # key 2 # key 3 key XXJ1 key XXJ2 key / # Ici le mois de fin # key 0 # key 9 key XXM1 key XXM2 key / # Ici l'année de fin # key 2 # key 0 # key 0 # key 8 key XXA1 key XXA2 key XXA3 key XXA4 key <Down Arrow> key <Down Arrow> ... key <Left Arrow> key <Left Arrow> key / key t key m key p key / key ^J key o key q key o |
Etape 3 : Le script
Il ne reste plus qu’à réaliser un script bash qui remplacera les balises XXJ1 à XXA4 par les chiffres de la date du jour, exécutera lynx avec sa nouvelle séquence de commandes et finalement, déclenchera l’importation dans la base de données.
#!/bin/bash # Récupération de la date du jour JOUR=`date "+%d/%m/%Y"` # "Explode" de la date en chiffres J1=${JOUR:0:1} J2=${JOUR:1:1} M1=${JOUR:3:1} M2=${JOUR:4:1} A1=${JOUR:6:1} A2=${JOUR:7:1} A3=${JOUR:8:1} A4=${JOUR:9:1} # Construction du nouveau fichier de commande # La variable PART sert à construire le nom de la Balise (XX$PART) # Et de "pointeur" vers les variables $J1, $J2, etc... ($$PART) CMD="cat abc.log" for PART in J1 J2 M1 M2 A1 A2 A3 A4; do eval CHIFFRE=$$PART CMD="$CMD|sed 's/XX$PART/$CHIFFRE/g'" done CMD="$CMD > /tmp/abc.cmd" eval $CMD # Exécution de Lynx lynx -accept_all_cookies -cmd_script=/tmp/abc.cmd http://download.abcbourse.com/historiques.aspx?f=ex 2>> /var/log/cotationabc.log # Appel du script d'import dans la base FICHIER="Cotations$A1$A2$A3$A4$M1$M2$J1$J2.txt" if [ -e /tmp/$FICHIER ]; then php import_batch.php /tmp/$FICHIER >> /var/log/cotationabc.log tail -n 1 /var/log/cotationabc.log mv /tmp/$FICHIER /var/cotations else echo "!!! Erreur de traitement du fichier $FICHIER !!!" fi |
Le lancement du script sera planifié dans un crontab afin de parfaire l’automatisation.
A titre d’exemple, voici le script import_batch.php qui se charge d’importer les valeurs dans la base de données. Il est très réduit car il utilise une classe fcours « maison » possédant les attributs nécessaires à l’enregistrement de cotations boursières et une méthode d’import à partir d’un fichier. L’intérêt de l’article ne résident pas dans cette partie, je ne vais pas la détailler.
#!/usr/bin/php -q <?php include_once "include/class_file_cours_inc.php"; if ($argc != 2 || in_array($argv[1], array('--help', '-help', '-h', '-?'))) { ?> Script d'import de données dans la base bourse... Usage: <?php echo $argv[0]; ?> <nomdefichier> <nomdefichier> Nom du fichier CSV issu d'ABCBourse au format Excel / ISIN <?php } else { echo "Traitement du fichier $argv[1]n"; $import = new amdr_fcours($argv[1],0); $import->import(); } ?> |