Python TD4

Python et le web





Exercice 1

Écrire un script qui prend comme paramètre une url et télécharge dans le répertoire courant toutes les images contenues dans la page.

On utilisera urllib pour récupérer le code html, une classe dérivée de HTMLParser pour récupérer les attributs src de toutes les balises img, et le module urlparse pour construire l'url de téléchargement de chaque image.

Comme des images provenant de sites différents peuvent avoir le même nom, on utilisera le module time pour préfixer au nom du fichier la date et l'heure du téléchargement. Le résultat pourra ressembler à ceci :

$ dnld-imgs http://www-igm.univ-mlv.fr/~jyt/
$ ls -l
-rw-r--r-- 1 jyt adm    130 janv.  5 16:10 2014-01-05_16-10-14_barre.gif
-rw-r--r-- 1 jyt adm   1587 janv.  5 16:10 2014-01-05_16-10-14_iuf.gif
-rw-r--r-- 1 jyt adm   2344 janv.  5 16:10 2014-01-05_16-10-14_logoCNRS.jpg
-rw-r--r-- 1 jyt adm   4153 janv.  5 16:10 2014-01-05_16-10-14_logoigm.gif
-rw-r--r-- 1 jyt adm    553 janv.  5 16:10 2014-01-05_16-10-14_mail.gif
-rw-r--r-- 1 jyt adm  13462 janv.  5 16:10 2014-01-05_16-10-14_thibon.gif
-rw-r--r-- 1 jyt adm   4554 janv.  5 16:10 2014-01-05_16-10-14_titre-petit.jpg
-rw-r--r-- 1 jyt adm   3196 janv.  5 16:10 2014-01-05_16-10-15_scholar_sm.gif

On pourra ensuite ajouter des options ad libitum, par exemple un répertoire de téléchargement, un préfixe autre que la date et l'heure, etc.



Exercice 2
Lorsque le protocole SOAP a été introduit, il existait un serveur destiné à tester les clients.
Il renvoyait des injures aléatoires puisées dans le répertoire du capitaine Haddock (en anglais).
Cette institution ayant disparu, nous avons installé (provisoirement) un service similaire sur le serveur de l'IGM,
http://monge.univ-mlv.fr:8888
Pour n'utiliser que les ressources natives de Python, nous avons employé le protocole xmlrpc (qui est l'ancêtre de SOAP) de sorte que l'accès au serveur ne nécéssitera que deux ou trois lignes de Python, l'une d'entre elles consistant à importer une classe du module xmlrpclib.
0) Parcourir rapidement la documentation du module xmlrpclib.
1) Le serveur accepte l'introspection. Découvrir ses méthodes, et les essayer.
2) Ecrire un serveur identique et le lancer sur "localhost" (voir la documentation de SimpleXMLRPCServer).
En python 3, les modules s'appellent xmlrpc.client et xmlrpc.server.


Exercice 3
Bien que le protocole xmlrpc soit assez primitif, il est suffisant pour de petites applications, et il existe encore de nombreux serveurs, par exemple celui de PyPi (Python Package Index).
1) Lancer l'interpréteur Python, et essayer les commandes de l'exemple donné sur la page web. Essayer aussi listMethods et comparer avec la liste donnée sur la page.
Ne pas essayer list_packages() (pourquoi ?).
2) Toujours depuis l'interpréteur Python, rechercher un paquetage lié à la plateforme (framework) Flask permettant d'écrire facilement un serveur de type REST.
On utilisera pour cela la méthode browse, les trove classifier strings sont ici.
On fera d'abord imprimer les noms des paquetages trouvés avec leur champ summary, puis le champ description du paquetage sélectionné.



Exercice 4
Récuperer le paquetage restlite. Il ne nécessite pas d'installation, et son code tient dans un seul fichier de taille modeste restlite.py. Il s'appuie sur le module (complexe) wsgiref de Python (ne pas lire la documentation maintenant).
Le fichier example.py montre les diverses possibilités.
Écrire un serveur d'injures du capitaine Haddock sur ce modèle.
1) On devra pouvoir obtenir une injure en tapant
curl http://127.0.0.1:8888/juron ou depuis Python avec urllib.urlopen.
2) On remarque que, contrairement au serveur xmlrpc, on obtient quelque chose en accédant à l'url ci-dessus avec un navigateur. Profiter de cette circonstance pour implémenter une méthode renvoyant une liste de n jurons sous forme d'une page html convenablement formatée lorsqu'on consulte l'url http://127.0.0.1:8888/jurons?nombre=42.
3) Imaginez des fonctionalités supplémentaires, et implémentez les avec la syntaxe simplifiée utilisant le décorateur @restlite.resource.
exemple : http://monge.univ-mlv.fr:8889
4) Reprogrammez un serveur identique en utilisant Flask.