Ecrire un robot pour le web avec… Lynx

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

Formulaire ABCBourse

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.

Lynx 2

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 !

Lynx 3

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 :

$ vi abc.log

?View Code ACTIONSCRIPT
# 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();
}
?>

Laissez votre message après le bip...Biiiiip

Commentaires

Bizarre… Ya pas de Fonera ici !

ipkg list |grep lynx
_
a ben non…Ya pas de Fonera ici !

Bonjour,
excellent cet article…
je cherche à copier automatiquement des tableaux d’une page web sur open office cal, je pense qu’avec cette méthode je pourrais m’en sortir mais je ne connais pas (encore) lynx, ni les scripts mais je me débrouille en php

aurais tu quelques conseils…

merci
Zil…

Bjs,

un super systeme

je cherche un robot pour mon sites, qui me propose ces services

Laisser un commentaire

(requis)

(requis)