Accueil > Enseignement > Récupérer les données d’une page internet avec Python
Récupérer les données d’une page internet avec Python
mercredi 22 avril 2026, par
En bioinformatique, il est courant de devoir récupérer les informations de différents endroits pour les recouper et les organiser différemment. Par exemple, une liste de gènes d’intérêt peut être identifiée sur le site du National Center for Biotechnology Information (NCBI). Les maladies associées à ces gènes vont être disponibles sur le site Online Mendellian Inheritance In Men (OMIM). Grâce aux projets de séquençage à haut débit, les changements nucléotidiques simples (Single Nucleotide Polymorphism) sont disponibles sur le site du Broad Institute : Genome Aggregration Database (gnomAD). Dans cette dernière base de données, la diversité des séquences de chacun de nos gènes est décrite, mais la conséquence de ces changements nucléotidiques est souvent inconnue. Pour terminer cette introduction rapide sur les sources de données, il faut noter que les données sur les protéines vont être accessibles sur le site UniProt et que les structures des protéines vont être disponibles sur la Protein Data Bank.
En pratique, cela veut dire que l’on peut récupérer beaucoup d’informations de manière assez rapide, en se rendant sur chacun des sites un par un, puis en recoupant celles-ci dans un fichier texte ou dans un tableur. Ce travail est essentiel en biologie, mais très vite fastidieux, car il existe plusieurs allèles d’un gène, au moins une dizaine de SNP par allèle, au moins une protéine par allèle, et très fréquemment plusieurs structures du même gène, par exemple de la protéine libre et de la protéine liée à une petite molécule ou à un autre partenaire protéique. Dans ce cas, cela devient très vite compliqué d’assembler de manière claire ces informations. C’est là que python intervient.
Python, requests et BeautifulSoup
Le langage python a été inventé par Guido van Rossum pour enseigner l’informatique. La courbe d’apprentissage du langage est rapide, car sa syntaxe est claire et concise. Il est possible d’écrire un programme sous forme de suite d’instructions à réaliser, mais très vite, il est plus clair d’organiser chaque élément en fonction, ce qui va permettre de réutiliser des éléments du code.
Quand certaines fonctions couvrent des besoins qui vont être transversaux, que chaque développeuse ou développeur va utiliser, les auteurs de ces fonctions les regroupent dans des paquets python que l’on va pouvoir appeler en début de notre programme pour les utiliser.
La librairie requests permet de récupérer le contenu d’une page internet, mais aussi d’interagir avec, par exemple pour remplir et envoyer un formulaire automatiquement.
La librairie beautifulsoup permet de parcourir le contenu d’une page internet qui a été téléchargée, d’analyser sa structure, et de récupérer des éléments selon un mot-clé, une balise (tag) ou tout autre élément remarquable.
Accéder aux informations biologiques
La plupart du temps, les sites indiqués ci-dessus vont fournir une interface d’interrogation programmatique, ou Application Programming Interface : API, qui permet de communiquer directement avec le site d’intérêt. Pour UniProt il est ainsi possible de récupérer la séquence d’une protéine directement via un lien, comme cela est indiqué dans la documentation officielle ici : https://www.uniprot.org/help/api. Pour chacun des autres sites mentionnés, il faudra utiliser une syntaxe spécifique, mais le principe est le même, une manière d’accéder à une information précise est prévue.
Dans la suite de l’article, nous allons traiter un cas générique pour illustrer comment python peut nous aider dans l’extraction de données sur des pages génériques.
Organisation d’une page internet (web)
Une page internet est un document texte organisée avec des éléments ouvrants et fermants pour définir du contenu à interpréter par le navigateur web ou à afficher pour l’utilisateur. Chaque balise, que l’on traduit donc par markup en Anglais, va avoir un rôle unique, indiqué rapidement ci-dessous :
- balise p : sert à délimiter un élément de paragraphe. Un paragraphe va correponsdre à un bloc de texte qui se termine par un retour à la ligne forcé. Utilisation :
<p>le texte</p> - balise b : sert à indiquer un élément en gras (bold en Anglais). Utilisation :
<b>le texte</b> - balise i : sert à mettre un élément en italique. Utilisation :
<i>le texte</i>
Il existe d’autres balises (head, body, h1, h2, ...) qui servent à délimiter d’autres éléments de la page, qui ne sont pas détaillées ici. Pour une liste plus complète, il vaut mieux se référer aux sites établis (https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements).
Il est possible de retenir que l’ensemble d’une page internet est consituée d’un bloc principal défini par la balise <html> ... contenu ... </html>, qu’à l’intérieur de ce bloc se situent deux autres blocs, <head> ... diverses commandes ... </head> qui contient les instructions pour le navigateur, les élements de style et l’appel aux bibliothèques javascript, et enfin la partie du corps de la page celle qui est visible pour l’utilisateur, définie par la balise <body> ... contenu visibile pour l'utilisateur ... </body>.
La complexité de lecture d’une page web par un humain vient du fait que ces balises sont imbriquées les unes dans les autres, et que souvent les espaces sont enlevés pour optimiser le chargement et l’interprétation des pages.
Cas pratique : lister toutes les maladies génétiques à gène identifié
Une page wikipédia recense des maladies où un gène unique est lié à une maladie : https://fr.wikipedia.org/wiki/Liste_des_maladies_g%C3%A9n%C3%A9tiques_%C3%A0_g%C3%A8ne_identifi%C3%A9.
Cette liste est affichée sous forme d’un tableau qui a comme titres de colonnes :
- Nom
- OMIM
- Transmission
- Chromosome
- Type de mutation
- Gène en cause
Ce tableau est défini en HTML par la balise <table> contenu du tableau </table>, chaque ligne du tableau est définie avec la balise <tr> ... contenu de la ligne ... </tr> puis chaque cellule est délimitée par la balise <td> contenu de la cellule ... </td>.
Il est possible de voir l’organisation du tableau en faisant un clic droit sur la page et en choisissant l’entrée de menu "Afficher le code source de la page".
Nous allons maintenant utiliser python pour récupérer le contenu de la page et transformer le tableau en données exploitables. A ce stade, il faut noter qu’il est aussi possible de ne sélectionner à la souris que le tableau et de le copier dans un tableur (Microsoft Excel, LibreOffice Calc, etc) qui devrait reconnaître le format et récupérer les éléments (le temps de traitement peut être un peu long).
Version 1 : téléchargement de la page avec requests
Nous allons utiliser la librairie requests pour télécharger en local le texte de la page.
#!/usr/bin/env python3
from bs4 import BeautifulSoup
import requests
import sys
def telecharge_url(url):
"""
Télécharge une page distante avec la bibliothèque requests
et renvoie le contenu au format texte
https://www.w3schools.com/python/module_requests.asp
"""
# Wikipedia demande un User Agent
headers = {"User-Agent": "Mozilla/5.0"}
html = requests.get(url,headers=headers)
# print(f"Contenu de la page \n:{html}")
return html
def main():
# Récupération des données
# Liste des maladies génétiques avec un gène identifié
lien = "https://fr.wikipedia.org/wiki/Liste_des_maladies_g%C3%A9n%C3%A9tiques_%C3%A0_g%C3%A8ne_identifi%C3%A9"
page = telecharge_url(lien)
if __name__ == "__main__":
main()
Version 2 : analyser le code HTML avec BeautifulSoup
#!/usr/bin/env python3
from bs4 import BeautifulSoup
import requests
import sys
def telecharge_url(url):
"""
Télécharge une page distante avec la bibliothèque requests
et renvoie le contenu au format texte
https://www.w3schools.com/python/module_requests.asp
"""
# Wikipedia demande un User Agent
headers = {"User-Agent": "Mozilla/5.0"}
html = requests.get(url,headers=headers).text
# print(f"Contenu de la page \n:{html}")
return html
def analyse_page(page):
"""
Analyse le contenu d'une page web pour récupérer
ce qui correspond à une balise spécifique
Renvoie une liste à partir du tableau de données
Documentation : thunderbit.com/fr/blog/beautifulsoup-in-python
"""
data=[]
# Analyser la page avec beautifulsoup
soup = BeautifulSoup(page, 'html.parser')
# Récupérer tous les tableaux
tables = soup.find_all('table')
# Extraire les données de chaque tableau
for t in tables:
# Lire chaque ligne trouvée
for ligne in t.find_all('tr'):
# Lire chaque cellule de la ligne
cellules = ligne.find_all('td')
# Transformer la ligne de cellules en liste
l = [c.text.strip() for c in cellules]
try:
if l[5] != '' and l[0] != 'Nom':
data.append(l)
except:
# The table has no disease data
pass
return data
def main():
# Récupération des données
# Liste des maladies génétiques avec un gène identifié
lien = "https://fr.wikipedia.org/wiki/Liste_des_maladies_g%C3%A9n%C3%A9tiques_%C3%A0_g%C3%A8ne_identifi%C3%A9"
page = telecharge_url(lien)
liste = analyse_page(page)
print(liste)
if __name__ == "__main__":
main()
Version 3 : exporter le résultat dans un fichier Microsoft Excel
La libraire PANDAS permet d’exporter des données dans un fichier excel. Pour manipuler les données, elle représente celles-ci sous une forme de feuille de calcul (DataFrame), ce qui permet d’accéder rapidement à de nombreuses fonctions, comme l’export de fichier au format excel.
#!/usr/bin/env python3
from bs4 import BeautifulSoup
import pandas as pd
import requests
import sys
def telecharge_url(url):
"""
Télécharge une page distante avec la bibliothèque requests
et renvoie le contenu au format texte
https://www.w3schools.com/python/module_requests.asp
"""
# Wikipedia demande un User Agent
headers = {"User-Agent": "Mozilla/5.0"}
html = requests.get(url,headers=headers).text
# print(f"Contenu de la page \n:{html}")
return html
def analyse_page(page):
"""
Analyse le contenu d'une page web pour récupérer
ce qui correspond à une balise spécifique
Renvoie une liste à partir du tableau de données
Documentation : thunderbit.com/fr/blog/beautifulsoup-in-python
"""
data=[]
# Analyser la page avec beautifulsoup
soup = BeautifulSoup(page, 'html.parser')
# Récupérer tous les tableaux
tables = soup.find_all('table')
# Extraire les données de chaque tableau
for t in tables:
# Lire chaque ligne trouvée
for ligne in t.find_all('tr'):
# Lire chaque cellule de la ligne
cellules = ligne.find_all('td')
# Transformer la ligne de cellules en liste
l = [c.text.strip() for c in cellules]
try:
if l[5] != '' and l[0] != 'Nom':
data.append(l)
except:
# The table has no disease data
pass
return data
def main():
# Récupération des données
# Liste des maladies génétiques avec un gène identifié
lien = "https://fr.wikipedia.org/wiki/Liste_des_maladies_g%C3%A9n%C3%A9tiques_%C3%A0_g%C3%A8ne_identifi%C3%A9"
page = telecharge_url(lien)
liste = analyse_page(page)
# Export en fichier formaté
df = pd.DataFrame(liste, columns=['Nom', 'OMIM',
'Transmission', 'Chromosome', 'Type de mutation',
'Gène en cause'])
# Enregistrement au format Microsoft Excel
df.to_excel("liste_maladies_genes_identifies.xlsx", index=False)
if __name__ == "__main__":
main()
Dépendances et utilisation du programme V3
Le programme (v3) ci-dessous fait appel à requests, beautifulsoup, pandas, openpyxl (pour l’export python). Si vous utiliser un IDE comme PyCharm vous pouvez les installer via celui-ci, sinon vous pouvez créer un environnement virtuel léger python comme suit :
sudo apt install python3-virtualenv
ou sous Mac OS : brew install virtualenv
virtualenv -p python3 venv
source venv/bin/activate
pip install beautifulsoup4 pandas openpyxl requests
Pour utiliser le programme ci-dessus, vous pouvez l’exécuter via PyCharm ou via le terminal :
source venv/bin/activate
chmod +x programme_v3.py
./programme_v3.py
Le fichier excel "liste_maladies_genes_identifies.xlsx" sera créé au même endroit que le programme, et vous pouvez ouvrir ce fichier pour étudier son contenu, effectuer des tris, etc.
Pour aller plus loin
- https://docs.python-requests.org
- https://beautiful-soup-4.readthedocs.io
- https://www.genome.gov/genetics-glossary/Single-Nucleotide-Polymorphisms-SNPs
- https://omim.org/help/api
- https://gnomad.broadinstitute.org/data
- https://www.ncbi.nlm.nih.gov/home/develop/api/
- https://www.uniprot.org/help/api
- https://thecodingbiologist.com/posts/Accessing-UniProt-via-its-REST-API
- https://woteq.com/how-to-retrieve-protein-sequences-from-uniprot-using-biopython
Un message, un commentaire ?
Pour participer à ce forum, vous devez vous enregistrer au préalable. Merci d’indiquer ci-dessous l’identifiant personnel qui vous a été fourni. Si vous n’êtes pas enregistré, vous devez vous inscrire.
Molecular Modelling and GNU/Linux