Dans cette version avancée, nous allons nous intéresser à une autre manière de récupérer des données depuis un site internet : via l'utilisation de formulaires.
Les formulaires, ce sont ces pages avec plein de champs à remplir et que vous soumettez ensuite pour vous créer un compte, contacter votre hotline ou que sais-je. Leur utilisation permet de contourner une limitation importante de la soumission d'informations via des adresses internet (ou URL pour "Uniform Resource Locator") : le volume de données (au fait, saviez-vous qu'un Geek ne crie pas, mais qu'il URL ? ;-)). En théorie, une adresse internet n'est pas limitée en taille (voir la section 3.2.1 de la RFC 2616). En réalité pourtant, les logiciels clients (Firefox, Google Chrome,…) et serveurs (Apache et autres) imposent des limitations. Si vous souhaitez juste récupérer la séquence d'un gène en soumettant son identifiant Genbank, ce problème ne vous concernera pas et les adresses internet seront le moyen le plus facile et rapide pour construire votre requête. Si par contre vous souhaitez soumettre l'ensemble des gènes d'un organisme pour caractériser ceux présentant un motif de régulation particulier, ça va coincer.
Utilisons donc les formulaires… Et là c'est le drame ! ;-). Même avec une documentation minimaliste, voire inexistante, l'envoi d'informations via une adresse internet peut se décrypter facilement en regardant tout simplement la structure de cette adresse dans la barre de votre navigateur (par exemple cette requête au NCBI est facilement compréhensible). Il n'y a plus qu'à bidouiller cette adresse et à la donner à une commande comme wget ou à l'inclure dans un script Python. Malheureusement, et en général, les formulaires sont très mal documentés quant à la manière de les soumettre de manière automatique via une commande ou un script. Une fois soumis, rien d'explicite n'apparaît dans la barre d'adresse du navigateur. Comment alors identifier le nom des paramètres à envoyer pour exprimer notre requête ? C'est ce que je vais vous détailler maintenant.
Un exemple concret : le service BLASTN de la Saccharomyces Genome Database
Voici mon projet. J'ai une liste de séquences de gènes et je voudrais caractériser de manière automatique les orthologues chez certaines espèces de champignons en utilisant l'outil en ligne BLASTN de la Saccharomyces Genome Database (ou SGD). Afin d'illustrer la démarche, nous prendrons comme exemple le gène ARP2. En cliquant sur le lien "BLASTN vs Fungi" dans la section "Analyze Sequence" de la fiche SGD de ce gène, on atterrit sur ce formulaire. Le seul paramètre que je souhaite modifier est la liste des espèces. Pour cela, je clique sur "—–Candida——-" :
Si je clique maintenant sur le bouton "Run WU-BLAST", je vais être mis en attente jusqu'au moment de récupérer le résultat de mon BLAST dans un nouvel onglet de mon navigateur. En regardant l'adresse internet dans cette nouvelle fenêtre, je suis très déçu de trouver uniquement "http://sgd-beta.stanford.edu/blast-fungal?program=blastn". Excepté le nom du programme blastn, aucun autre paramétrage n'est accessible. Comment alors préciser ma séquence et mes espèces ?
Une première manière de faire est de chercher le nom de ces paramètres dans le code source de la page du formulaire. Disons le tout de suite, la complexité des sites internet moderne rend cette tâche assez laborieuse et souvent infructueuse. L'autre option consiste à intercepter et visualiser les données envoyées. Dit comme cela, cela semble très technique. En fait pas du tout, grâce aux outils de développement fournis de base par chaque navigateur internet (Firefox, Safari, Chrome,…). A noter qu'il existe également des alternatives plus ambitieuses qui s'installent sous forme d'extensions dans votre navigateur. Par exemple l'excellent Firebug pour Firefox. Je prendrai ici l'exemple du navigateur Google Chrome.
Ô grand Navigateur, montre moi ce que tu envoies dans mon dos!!
Depuis Google Chrome, ouvrons à nouveau ce formulaire. Je sélectionne mes espèces Candida et je clique une première fois sur le bouton "Run WU-BLAST". Un nouvel onglet s'ouvre avec la page qui affiche mon résultat de BLASTN. En étant dans cet onglet, j'affiche les outils de développement (Afficher -> Options pour les développeurs -> Outils de Développement). Et je sélectionne l'onglet "Network" qui est bien vide pour l'instant.
Je retourne dans l'onglet du formulaire et je soumets à nouveau ma requête. Dans l'onglet avec le résultat du BLASTN, je constate maintenant que mon navigateur a gardé la trace de plusieurs d'échanges avec le serveur de la SGD. En particulier, je trouve un fichier portant le nom de run_blast (et qui semble avoir le temps d'échange le plus important) :
En cliquant sur ce fichier, je trouve dans la section "Form Data" le détail des paramètres envoyés par ma requête (ô joie!) :
J'ai donc tout ce qu'il me faut pour soumettre maintenant ma requête via un script en Python, et je peux le faire pour autant de séquences qu'il me plaît (na!).
Automatisation du processus au moyen du langage Python
Voici donc un petit bout de code qui me permet d'automatiser le processus. La seule subtilité est d'utiliser les librairies urllib et urllib2 fournies avec une distribution Python de base :
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 |
import urllib, urllib2 my_favorites_sequences = ["ATTGGACGAGGATAC",...] url = "http://sgd-beta.stanford.edu/run_blast" values = { 'seq' : sequence, 'program': 'blastn', 'database' : 'candida_albicans candida_dubliniensis candida_glabrata \ candida_maltosa candida_orthopsilosis candida_parapsilosis \ candida_tenuis candida_tropicalis', 'outFormat': 'gapped alignments', 'matrix': 'BLOSUM62', 'threshold': 'default', 'cutoffScore': 'default', 'alignToShow': '500', 'wordLength': 'default', 'filter': 'on', 'blastType': 'fungal' } for my_favorite_seq in my_favorites_sequences : values[ 'seq'] = my_favorite_seq data = urllib.urlencode(values) req = urllib2.Request(url, data) response = urllib2.urlopen(req).read() |
Et voilà ! La page internet contenant le résultat du BLASTN pour chaque séquence est contenue dans la variable nommée "response". Il ne reste plus qu'à "fouiller" dans cette page avec, par exemple, la librairie Beautiful soup pour extraire ce qui m'intéresse. Bon appétit !
Un grand pouvoir implique de grandes responsabilités.
Soumettre votre requête de cette manière est totalement identique à la soumettre via le formulaire en ligne. La différence est que vous pouvez maintenant envoyer un grand nombre de requêtes très rapidement. Soyez donc prudent, car vous pouvez ainsi monopoliser le serveur au détriment des autres utilisateurs. Vos requêtes pourraient ainsi être assimilées à une forme d'attaque de déni de service. Certaines personnes n'apprécient pas et sont alors tentées de vous bannir de quelques heures à plusieurs jours pour l'accès à leur site internet.
Pour finir, je tiens à remercier mes relecteurs : Akira, Zazo0o et williamW.
Laisser un commentaire