Introduction
Extraire des hyperliens depuis une page web est une tâche courante en scraping web, exploration de données et automatisation. Dans cet article, vous allez apprendre à utiliser Python pour extraire tous les hyperliens d'une page HTML — et même télécharger des fichiers (comme les .hdf) depuis la NASA en utilisant un jeton d'accès.
Qu’est-ce qu’un Hyperlien en HTML ?
Voici un exemple simple :
1 | <a href="https://en.moonbooks.org">Visitez moonbooks</a> |
Explication :
1 2 3 | * `<a>` est la balise d’ancrage utilisée pour définir un lien hypertexte. * `href` est l’attribut qui contient l’URL. * Le texte à l’intérieur des balises est ce sur quoi l’utilisateur clique — ici : **Visitez moonbooks**. |
Prérequis
Vous aurez besoin de :
- Python 3.x
- Des bibliothèques
beautifulsoup4etrequests
Installez-les avec :
1 | pip install beautifulsoup4 requests |
Guide Étape par Étape
Étape 1 : Importer les bibliothèques nécessaires
1 2 | import requests from bs4 import BeautifulSoup |
Étape 2 : Récupérer le contenu de la page web
1 2 3 | url = 'https://example.com' response = requests.get(url) html_content = response.text |
Utilisez response.content au lieu de response.text si vous traitez des données binaires ou non UTF-8.
Étape 3 : Analyser le HTML avec BeautifulSoup
1 | soup = BeautifulSoup(html_content, 'html.parser') |
Étape 4 : Extraire toutes les balises de type lien
1 2 3 4 5 6 | anchor_tags = soup.find_all('a') for tag in anchor_tags: href = tag.get('href') if href: print(href) |
Cela affichera tous les hyperliens trouvés sur la page.
Exemple : Résoudre les URL relatives avec urljoin
Beaucoup de liens sur les sites web sont relatifs (par exemple "/page.html"). Utilisez urljoin pour les convertir en URL absolues :
1 2 3 4 5 6 7 | from urllib.parse import urljoin for tag in anchor_tags: href = tag.get('href') if href: full_url = urljoin(url, href) print(full_url) |
Filtrer et Télécharger des Fichiers Spécifiques
Si vous ne souhaitez que les fichiers .pdf, .hdf, etc. :
1 2 | if href.endswith('.hdf'): print(href) |
Exemple : Accéder aux URL protégées de la NASA avec un "Token"
Pour télécharger des fichiers .hdf depuis le site ASDC (CALIPSO) de la NASA, vous devez d'abord obtenir un jeton Earthdata Login.
- Rendez-vous sur https://urs.earthdata.nasa.gov/ et créez un compte.
- Générez un Token via Applications > Generate Token.
Exemple de Code pour Lister les Fichiers .hdf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import urllib.request from bs4 import BeautifulSoup token = 'VOTRE_JETON_ICI' opener = urllib.request.build_opener() opener.addheaders = [('Authorization', f'Bearer {token}')] urllib.request.install_opener(opener) url = 'https://asdc.larc.nasa.gov/data/CALIPSO/LID_L2_05kmALay-Standard-V4-51/2011/01/' html_page = urllib.request.urlopen(url).read() soup = BeautifulSoup(html_page, 'html.parser') # Extraire tous les liens vers les fichiers .hdf links = [a['href'] for a in soup.find_all('a', href=True) if a['href'].endswith('.hdf')] for link in links: print(link) |
Remarques :
build_opener(): crée un gestionnaire personnalisé d’URL.addheaders: ajoute l’en-tête d’authentification à chaque requête HTTP.install_opener(): définit ce gestionnaire comme valeur par défaut globale.
Sans cette configuration, vous obtiendrez une erreur 403 Forbidden.
Télécharger les fichiers
Pour ne télécharger que les fichiers .hdf, ajoutez une condition if dans la boucle :
1 2 3 4 5 6 7 8 | from urllib.parse import urljoin import urllib.request for file_name in links: if file_name.endswith('.hdf'): full_url = urljoin(url, file_name) print(f"Téléchargement de {file_name}...") urllib.request.urlretrieve(full_url, file_name) |
Explication :
file_name.endswith('.hdf')garantit qu'on télécharge uniquement les fichiers .hdf.urljoin(url, file_name)génère l'URL complète.urllib.request.urlretrieve()télécharge le fichier dans le dossier de travail actuel.
Corriger l’erreur de certificat SSL
Si vous obtenez cette erreur :
1 | SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed |
Cela signifie que votre environnement Python ne peut pas vérifier le certificat SSL du site. Voici comment corriger cela :
Option 1 : Utilitaire d'installation de certificats sur macOS
Si vous êtes sur macOS et avez installé Python depuis python.org :
1 | /Applications/Python\ 3.x/Install\ Certificates.command |
Option 2 : Désactiver temporairement la vérification (⚠️ Non recommandé)
1 2 3 4 5 6 7 8 9 10 11 12 13 | import requests from bs4 import BeautifulSoup import urllib3 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) url = 'https://en.moonbooks.org' response = requests.get(url, verify=False) soup = BeautifulSoup(response.text, 'html.parser') links = [a['href'] for a in soup.find_all('a', href=True)] for link in links: print(link) |
Option 3 : Utiliser certifi pour fournir des CAs de confiance
Installation :
1 | pip install certifi |
Code :
1 2 3 4 5 6 7 8 9 10 11 | import requests import certifi from bs4 import BeautifulSoup url = 'https://en.moonbooks.org' response = requests.get(url, verify=certifi.where()) soup = BeautifulSoup(response.text, 'html.parser') links = [a['href'] for a in soup.find_all('a', href=True)] for link in links: print(link) |
Conclusion
Avec quelques lignes de Python et les bibliothèques BeautifulSoup et requests, vous pouvez :
- Extraire des hyperliens à partir de pages HTML
- Filtrer et télécharger certains types de fichiers
- Gérer l’authentification via des jetons Bearer
- Corriger les erreurs SSL si nécessaire
