```html
Beautiful Soup est une bibliothèque essentielle dans l'écosystème Python pour le web scraping et les tâches d'extraction de données. Sa capacité à analyser les documents HTML et XML, même ceux avec un balisage mal formé, en fait un outil inestimable pour les développeurs et les scientifiques des données. Ce guide fournit un aperçu complet de la façon d'installer BeautifulSoup rapidement et efficacement, couvrant les prérequis, les différentes méthodes d'installation, la sélection du parseur, la vérification, l'utilisation de base et le dépannage des problèmes courants.
Vous voulez une plateforme intégrée, tout-en-un, pour que votre équipe de développeurs travaille ensemble avec une productivité maximale ?
Apidog répond à toutes vos demandes et remplace Postman à un prix beaucoup plus abordable !
Introduction à BeautifulSoup
Beautiful Soup est un package Python conçu pour analyser les documents HTML et XML. Il crée un arbre d'analyse à partir du code source de la page qui peut être utilisé pour naviguer, rechercher et modifier le document, ce qui est particulièrement utile pour le web scraping. Initialement créé par Leonard Richardson et publié pour la première fois en 2004, Beautiful Soup tire son nom d'un poème de "Alice's Adventures in Wonderland" de Lewis Carroll, un clin d'œil fantaisiste au terme "tag soup", qui décrit le code HTML mal structuré que la bibliothèque gère avec brio. La version majeure actuelle est Beautiful Soup 4 (BS4), qui continue d'être activement maintenue.
La popularité durable de la bibliothèque découle de plusieurs attributs clés. Elle est largement considérée comme conviviale pour les débutants en raison de sa simple API, mais suffisamment puissante pour les tâches d'analyse complexes. Elle offre des options d'analyse flexibles en s'intégrant à divers analyseurs sous-jacents et présente d'excellentes capacités de gestion des erreurs, gérant avec élégance le balisage imparfait. Le fait d'être open-source et soutenu par une communauté large et active signifie qu'une documentation, des tutoriels et une assistance abondants sont facilement disponibles, ce qui facilite considérablement la résolution efficace des problèmes.
La longévité de Beautiful Soup, avec la version 4 étant la norme actuelle, signale sa fiabilité et la confiance que la communauté de développement lui accorde. Cette stabilité signifie que les développeurs peuvent investir du temps dans l'apprentissage et l'utilisation de la bibliothèque avec la certitude qu'elle restera un outil viable et pris en charge. Une telle fiabilité contribue directement à l'efficacité, car elle minimise le temps passé à traiter des fonctionnalités obsolètes ou à rechercher des alternatives. De plus, le nom même "Beautiful Soup" et son association avec "tag soup" mettent en évidence sa force fondamentale : le traitement du HTML désordonné et réel. De nombreux sites Web ne respectent pas strictement les normes HTML, et un analyseur capable de gérer avec élégance de telles imperfections, comme le fait Beautiful Soup, fait gagner aux développeurs un temps et des efforts considérables par rapport aux analyseurs plus stricts qui pourraient échouer ou nécessiter un prétraitement important du balisage. Cette robustesse inhérente est un facteur clé de son efficacité pour le web scraping pratique.
Conditions préalables à l'installation
Avant de procéder à l'installation de Beautiful Soup, plusieurs conditions préalables doivent être remplies pour garantir un processus d'installation fluide et efficace.
Installation de Python
Une installation Python fonctionnelle est la principale exigence. Beautiful Soup 4 est compatible avec Python 3, avec Python 3.6 ou supérieur généralement recommandé pour les dernières fonctionnalités de BS4. Certaines sources indiquent que les versions les plus récentes de Beautiful Soup 4, telles que 4.12.2, nécessitent spécifiquement Python 3.8 ou une version ultérieure. Il est toujours conseillé d'utiliser une version récente de Python. Pour vérifier la version de Python installée, ouvrez un terminal ou une invite de commande et exécutez :
python --version
Ou, si plusieurs versions de Python sont présentes, spécifiquement pour Python 3 :
python3 --version
Cette commande affichera la version de Python installée (par exemple, Python 3.11.0).
pip (programme d'installation de packages Python)
pip est le programme d'installation de packages standard pour Python et est utilisé pour installer Beautiful Soup à partir de l'index des packages Python (PyPI). pip est généralement inclus avec les installations Python version 3.4 et ultérieures. Pour vérifier si pip est installé et sa version, utilisez :
pip --version
Ou pour pip associé à Python 3 :
pip3 --version
Il est crucial d'avoir une version à jour de pip pour éviter d'éventuels problèmes d'installation avec les packages. Pour mettre à niveau pip, exécutez :
python -m pip install --upgrade pip
Ou, selon la configuration du système :
pip3 install --upgrade pip
S'assurer que Python et pip sont correctement installés et mis à jour est une mesure proactive. Quelques instants consacrés à ces vérifications peuvent éviter un temps de dépannage important plus tard, contribuant directement à une installation plus rapide et plus efficace de Beautiful Soup.
Environnements virtuels
L'utilisation d'environnements virtuels est une pratique recommandée dans le développement Python et est cruciale pour gérer efficacement les dépendances du projet. Un environnement virtuel crée un espace isolé pour chaque projet, permettant aux packages d'être installés et gérés indépendamment sans interférer avec d'autres projets ou l'installation Python à l'échelle du système. Cette isolation empêche le "dependency hell", une situation où différents projets nécessitent des versions conflictuelles du même package. En utilisant des environnements virtuels, les développeurs s'assurent que chaque projet dispose exactement des dépendances dont il a besoin, ce qui rend les projets plus reproductibles et plus faciles à partager. Cette pratique contribue de manière significative à l'efficacité du développement à long terme. Pour créer un environnement virtuel (par exemple, nommé myenv) :
python -m venv myenv
Ou, spécifiquement pour Python 3 :
python3 -m venv myenv
Une fois créé, l'environnement virtuel doit être activé.
Sur Windows :
myenv\\\\Scripts\\\\activate
Sur macOS et Linux :
source myenv/bin/activate
Après l'activation, l'invite du terminal sera généralement précédée du nom de l'environnement (par exemple, (myenv)). Toutes les commandes d'installation pip ultérieures installeront ensuite les packages dans cet environnement isolé.
4 méthodes pour installer Beautifulsoup
Beautiful Soup 4 peut être installé à l'aide de plusieurs méthodes, pip étant la plus courante et la plus recommandée. Le choix de la méthode dépend souvent de la distribution Python de l'utilisateur et de ses besoins spécifiques. Quelle que soit la méthode, il est fortement conseillé d'effectuer l'installation dans un environnement virtuel activé.
A. Utilisation de pip (recommandé et le plus courant)
Le moyen standard et le plus simple d'installer Beautiful Soup est d'utiliser pip, le programme d'installation de packages Python. Cette méthode récupère la dernière version stable de l'index des packages Python (PyPI). La commande pour installer Beautiful Soup 4 est :
pip install beautifulsoup4
Alternativement, pour s'assurer que pip correspond à l'interpréteur Python prévu, en particulier si plusieurs versions de Python sont installées, utilisez :
python -m pip install beautifulsoup4
Il est important d'utiliser beautifulsoup4
comme nom de package pour installer Beautiful Soup version 4.x. L'ancien nom de package BeautifulSoup
fait référence à Beautiful Soup 3, ce qui n'est généralement pas recommandé pour les nouveaux projets. Si la commande pip
par défaut du système pointe vers une installation Python 2, pip3
doit être utilisé pour Python 3. La préférence écrasante pour pip dans un environnement virtuel à travers diverses sources de documentation souligne son statut de norme de facto pour la gestion des packages Python. Cette approche assure l'efficacité en simplifiant la gestion des dépendances, en évitant les conflits avec les packages à l'échelle du système et en promouvant des environnements de projet reproductibles, qui sont tous des caractéristiques des flux de travail de développement Python modernes.
B. Utilisation de Conda (pour les utilisateurs d'Anaconda/Miniconda)
Pour les utilisateurs des distributions Python Anaconda ou Miniconda, Beautiful Soup peut être installé à l'aide du gestionnaire de packages conda. Il est souvent recommandé d'installer les packages à partir du canal conda-forge, qui est une collection de recettes, de builds et de packages gérés par la communauté. Tout d'abord, ajoutez le canal conda-forge et définissez la priorité du canal :
conda config --add channels conda-forge
conda config --set channel_priority strict
Ensuite, installez Beautiful Soup en utilisant :
conda install beautifulsoup4
Certaines sources mentionnent également l'installation de bs4
comme alias ou package associé :
conda install beautifulsoup4 bs4
Cette méthode est particulièrement pratique pour ceux qui gèrent déjà leurs environnements et leurs packages avec Anaconda.
C. Installation à partir de la source (moins courant)
L'installation de Beautiful Soup à partir de son code source est une option généralement réservée aux situations où pip ou conda ne sont pas disponibles, ou lorsqu'une version de développement spécifique est requise. Les étapes générales sont les suivantes :
Téléchargez l'archive source (par exemple, beautifulsoup4-x.y.z.tar.gz
) à partir du site Web officiel de Beautiful Soup ou de sa page de projet PyPI.
Extrayez l'archive téléchargée. Pour un fichier .tar.gz
sur Linux ou macOS : les utilisateurs de Windows peuvent avoir besoin d'un outil comme 7-Zip ou WinRAR.
tar -xzvf beautifulsoup4-x.y.z.tar.gz
Naviguez dans le répertoire extrait à l'aide de la ligne de commande :
cd beautifulsoup4-x.y.z
Exécutez le script d'installation : ou python3 setup.py install
si vous ciblez spécifiquement Python 3.
python setup.py install
D. Utilisation des gestionnaires de packages système (Linux)
Sur certaines distributions Linux, Beautiful Soup peut être disponible via le gestionnaire de packages du système. Par exemple, sur Debian ou Ubuntu, il peut être installé à l'aide de apt-get
: Pour Python 3 :
sudo apt-get install python3-bs4
Bien que cette méthode intègre le package au système, elle peut ne pas toujours fournir la dernière version de Beautiful Soup. Pour les packages à jour et une meilleure isolation du projet, l'installation avec pip dans un environnement virtuel est généralement préférable. L'existence de plusieurs méthodes d'installation reflète les diverses façons dont les environnements Python sont gérés. La méthode la plus efficace pour un utilisateur est généralement celle qui correspond le mieux à sa configuration et à son flux de travail existants (par exemple, les utilisateurs d'Anaconda trouveront conda install
le plus naturel). Cependant, pour le développement Python général, pip dans un environnement virtuel offre le plus de flexibilité et de contrôle.
Installation des analyseurs
Beautiful Soup lui-même n'est pas un analyseur ; il fournit plutôt une API pratique qui se trouve au-dessus d'un analyseur HTML ou XML sous-jacent. Ce choix architectural signifie que le travail réel d'interprétation du balisage est délégué à une bibliothèque distincte. Le choix de l'analyseur peut avoir un impact significatif sur la vitesse d'analyse, la manière dont le balisage mal formé est géré et si les fonctionnalités spécifiques à XML sont disponibles. Comprendre cette délégation est crucial, car la sélection de l'analyseur influence directement l'efficacité et la fiabilité des tâches de web scraping. Beautiful Soup prend en charge plusieurs analyseurs :
A. html.parser (intégré)
Installation : Cet analyseur fait partie de la bibliothèque standard Python, aucune installation séparée n'est donc nécessaire.
Utilisation : Lors de la création d'un objet BeautifulSoup, spécifiez-le comme suit :
soup = BeautifulSoup(markup, "html.parser")
Avantages : Aucune dépendance externe, ce qui simplifie la configuration ; offre une vitesse décente pour de nombreuses tâches.
Inconvénients : Généralement moins indulgent avec le HTML gravement mal formé que html5lib
, et pas aussi rapide que lxml
. Les versions de html.parser
dans les anciennes versions de Python (avant Python 2.7.3 ou Python 3.2.2) étaient notamment moins robustes, ce qui rendait les analyseurs externes essentiels dans ces cas.
B. lxml (recommandé pour la vitesse et la flexibilité)
L'analyseur lxml
est un choix populaire en raison de sa vitesse et de sa capacité à analyser à la fois HTML et XML.
Installation :
pip install lxml
Utilisation : Pour HTML : Pour XML : ou
soup = BeautifulSoup(markup, "lxml")
soup = BeautifulSoup(markup, "xml")
soup = BeautifulSoup(markup, "lxml-xml")
Avantages : Très rapide, ce qui est un avantage significatif pour les documents volumineux ou de nombreuses tâches de scraping. Il est également assez indulgent avec le HTML et est le seul analyseur XML actuellement pris en charge par Beautiful Soup 4. Le gain de performances de lxml
est souvent suffisant pour justifier son installation, même avec sa dépendance C, en particulier pour les applications critiques en termes d'efficacité.
Inconvénients : Il a une dépendance C externe (libxml2
et libxslt
). Bien que les roues binaires précompilées soient couramment disponibles sur PyPI pour la plupart des plateformes (ce qui rend l'installation via pip transparente), sur certains systèmes sans les outils de construction nécessaires, l'installation à partir de la source peut être requise, ce qui peut être plus complexe.
C. html5lib (le plus indulgent, analyse de type navigateur)
L'analyseur html5lib
vise à analyser les documents HTML de la même manière que les navigateurs Web modernes, ce qui le rend extrêmement tolérant aux erreurs.
Installation :
pip install html5lib
Utilisation :
soup = BeautifulSoup(markup, "html5lib")
Avantages : Extrêmement indulgent avec le HTML mal formé, analysant souvent avec succès les documents avec lesquels d'autres analyseurs pourraient avoir du mal. Il tente de créer une structure HTML5 valide.
Inconvénients : Beaucoup plus lent que lxml
et html.parser
. Il a également une dépendance Python externe.
Résumé de la comparaison des analyseurs :
Fonctionnalité | html.parser | lxml | html5lib |
---|---|---|---|
Vitesse | Décent | Très rapide | Très lent |
Indulgence | Modérément indulgent | Indulgent (HTML) | Extrêmement indulgent (de type navigateur) |
Dépendances | Aucune (intégrée) | Bibliothèques C externes (libxml2, libxslt) | Bibliothèque Python externe |
Prise en charge XML | Non | Oui (analyseur XML principal pour BS4) | Non |
Facilité d'installation | N/A (Inclus) | Généralement facile via pip ; peut être complexe lors de la construction | Facile via pip |
Le meilleur pour | Tâches rapides, pas de dépendances externes, HTML standard | Tâches critiques en termes de vitesse, analyse XML, analyse HTML robuste | HTML extrêmement cassé, compatibilité avec les navigateurs |
Si aucun analyseur n'est explicitement spécifié lors de la création d'un objet BeautifulSoup, Beautiful Soup tentera de choisir le "meilleur" disponible, en donnant généralement la priorité à lxml
, puis à html5lib
, et enfin à html.parser
. Cependant, pour garantir un comportement cohérent dans différents environnements et pour rendre le code plus explicite, il est de bonne pratique de spécifier l'analyseur souhaité dans le constructeur BeautifulSoup.
Vérification de l'installation
Après avoir installé Beautiful Soup et tous les analyseurs souhaités, il est essentiel de vérifier que l'installation a réussi et que la bibliothèque est opérationnelle. Un processus de vérification simple en deux étapes est recommandé : une vérification d'importation suivie d'un exemple d'analyse minimal. Cette approche est plus robuste car une importation réussie confirme uniquement que Python peut localiser le package, tandis qu'un test d'analyse garantit qu'il peut fonctionner correctement avec un analyseur.
Étape 1 : Importer BeautifulSoup
Ouvrez un interpréteur Python ou créez un nouveau script Python (fichier .py
) et tentez d'importer la bibliothèque :
from bs4 import BeautifulSoup
import bs4 # Importation alternative
print("Beautiful Soup importé avec succès !")
Si ce code s'exécute sans ImportError
ou ModuleNotFoundError
, cela signifie que Python peut trouver le package Beautiful Soup 4 (bs4
).
Étape 2 : Vérifier la version (facultatif mais recommandé)
Pour confirmer la version installée, en particulier si une version spécifique était prévue :
print(f"Version de Beautiful Soup : {bs4.__version__}")
Cela affichera la chaîne de version installée (par exemple, 4.12.2).
Étape 3 : Test d'analyse de base
Effectuez une simple opération d'analyse pour vous assurer que la bibliothèque et un analyseur fonctionnent ensemble.
from bs4 import BeautifulSoup
# Chaîne HTML simple pour les tests
html_doc_string = "<html><head><title>My Test Page</title></head><body><h1>Hello, BeautifulSoup!</h1><p>This is a test.</p></body></html>"
# Créez un objet BeautifulSoup, en choisissant explicitement un analyseur si vous le souhaitez
# Si lxml est installé et préféré : soup_string = BeautifulSoup(html_doc_string, 'lxml')
# Sinon, utilisez l'analyseur intégré :
soup_string = BeautifulSoup(html_doc_string, 'html.parser')
# Extrayez et imprimez le titre
page_title = soup_string.title.string
print(f"Titre de la chaîne : {page_title}")
# Extrayez et imprimez le texte de la balise H1
h1_text = soup_string.find('h1').get_text()
print(f"H1 de la chaîne : {h1_text}")
# Extrayez et imprimez le texte du paragraphe
p_text = soup_string.find('p').text
print(f"Texte du paragraphe : {p_text}")
Si ce script s'exécute et imprime "My Test Page", "Hello, BeautifulSoup !" et "This is a test.", l'installation est fonctionnelle. Pour une vérification plus pratique qui correspond aux cas d'utilisation courants du web scraping, on peut intégrer la bibliothèque requests
pour récupérer et analyser une page Web en direct. Beautiful Soup lui-même ne récupère pas le contenu Web ; il ne fait que l'analyser. La bibliothèque requests
est couramment utilisée pour effectuer des requêtes HTTP afin d'obtenir les données HTML. Tout d'abord, assurez-vous que requests
est installé :
pip install requests
Ensuite, le script suivant peut être utilisé :
from bs4 import BeautifulSoup
import requests # Pour effectuer des requêtes HTTP
print(f"Version de Beautiful Soup : {BeautifulSoup.__version__}") # Accéder à la version via la classe
# 1. Analyse simple de chaîne pour une vérification rapide
html_doc_string = "<html><head><title>My Test Page</title></head><body><h1>Hello, BeautifulSoup!</h1></body></html>"
soup_string = BeautifulSoup(html_doc_string, 'html.parser') # ou 'lxml' si installé
print("Titre de la chaîne :", soup_string.title.string)
print("H1 de la chaîne :", soup_string.find('h1').get_text())
# 2. Analyse de base d'une page Web (nécessite la bibliothèque requests)
try:
url = "<http://quotes.toscrape.com>" # Un site souvent utilisé pour des exemples de scraping
# C'est une bonne pratique de définir un en-tête User-Agent
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get(url, headers=headers, timeout=10) # Ajout d'en-têtes et de délai d'attente
response.raise_for_status() # Lève une exception en cas d'erreurs HTTP (4xx ou 5xx)
# Utilisez response.content pour une meilleure gestion de l'encodage avec BeautifulSoup
soup_web = BeautifulSoup(response.content, 'html.parser')
# Extrayez le titre de la page
page_title_web = soup_web.title.string if soup_web.title else "Aucun titre trouvé"
print(f"\\\\nTitre de la page Web ({url}) : {page_title_web}")
# Trouvez et imprimez le texte de la première citation
first_quote = soup_web.find('span', class_='text')
if first_quote:
print(f"Première citation : {first_quote.text.strip()}")
else:
print("Impossible de trouver la première citation sur la page.")
except requests.exceptions.Timeout:
print(f"Erreur : La requête vers {url} a expiré.")
except requests.exceptions.HTTPError as http_err:
print(f"Erreur : Une erreur HTTP s'est produite lors de la récupération de {url} : {http_err}")
except requests.exceptions.RequestException as e:
print(f"Erreur : Une erreur s'est produite lors de la récupération de l'URL {url} : {e}")
except Exception as e:
print(f"Une erreur inattendue s'est produite lors de l'analyse Web : {e}")
Cette vérification étendue, comprenant la récupération d'une page en direct et la gestion de base des erreurs pour la requête HTTP, fournit une image plus complète de "prise en main" et confirme que Beautiful Soup est prêt pour les tâches de web scraping réelles. L'utilisation de response.content
est particulièrement importante car elle fournit des octets bruts, permettant à l'analyseur choisi de Beautiful Soup de gérer l'encodage des caractères plus efficacement, évitant ainsi d'éventuels problèmes de texte brouillé.
Exemples d'utilisation de base
Une fois Beautiful Soup installé et vérifié, on peut commencer à l'utiliser pour analyser le HTML et extraire des données. Un flux de travail typique implique la récupération du contenu Web à l'aide d'une bibliothèque cliente HTTP comme requests
, puis l'analyse de ce contenu avec Beautiful Soup.
1. Récupération du contenu de la page Web :
La bibliothèque requests
est couramment utilisée pour récupérer le HTML à partir d'une URL. Si elle n'est pas déjà installée (par exemple, lors de la vérification), installez-la :
pip install requests
Ensuite, récupérez le contenu :
import requests
url = '<http://quotes.toscrape.com>' # Exemple de site Web
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
try:
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status() # Vérifie les erreurs HTTP
html_content = response.content # Utilisez .content pour les octets bruts
except requests.exceptions.RequestException as e:
print(f"Erreur lors de la récupération de {url} : {e}")
html_content = None
2. Création d'un objet BeautifulSoup :
Transmettez le contenu HTML récupéré (de préférence response.content
pour gérer les encodages de manière robuste) et le nom de l'analyseur souhaité au constructeur BeautifulSoup :
from bs4 import BeautifulSoup
if html_content:
soup = BeautifulSoup(html_content, 'lxml') # Utilisation de l'analyseur lxml
# Ou : soup = BeautifulSoup(html_content, 'html.parser')
else:
soup = None # Gérer le cas où la récupération du contenu a échoué
3. Navigation et recherche dans l'arborescence d'analyse :
Beautiful Soup fournit des méthodes intuitives pour naviguer et rechercher dans la structure HTML analysée.
Accéder directement aux balises :
if soup:
print(f"Titre de la page : {soup.title.string if soup.title else 'N/A'}")
first_h1 = soup.find('h1') # Plus robuste que soup.h1 si h1 pourrait ne pas exister
print(f"Premier H1 : {first_h1.string if first_h1 else 'N/A'}")
Obtenir le nom et le texte de la balise :
if soup and soup.title:
print(f"Nom de la balise de titre : {soup.title.name}") # Sortie : title
print(f"Texte de la balise de titre : {soup.title.string}") # Contenu textuel
# Pour les balises avec des structures imbriquées, .get_text() est souvent plus utile
first_p = soup.find('p')
if first_p:
print(f"Texte du premier paragraphe : {first_p.get_text(strip=True)}") # strip=True supprime les espaces supplémentaires
Utilisation de find()
et find_all()
:
Ce sont des méthodes puissantes pour localiser des éléments. find(name, attrs, string, **kwargs)
: Renvoie le premier élément correspondant.
if soup:
# Trouvez le premier div avec la classe 'quote'
quote_div = soup.find('div', class_='quote') # 'class_' car 'class' est un mot-clé Python
if quote_div:
quote_text_span = quote_div.find('span', class_='text')
if quote_text_span:
print(f"Texte de la première citation : {quote_text_span.string}")
find_all(name, attrs, recursive, string, limit, **kwargs)
: Renvoie une liste de tous les éléments correspondants.
if soup:
# Trouvez toutes les balises <a> (liens)
all_links = soup.find_all('a')
print(f"\\\\nTrouvé {len(all_links)} liens :")
for link in all_links[:5]: # Imprimez les 5 premiers liens
print(link.get('href')) # Extraction de l'attribut 'href'
Démontrer find()
et find_all()
avec des paramètres courants comme le nom de la balise et la classe CSS (en utilisant l'argument class_
) fournit une valeur pratique immédiate, car ce sont des éléments fondamentaux de la plupart des activités de web scraping.
Extraction d'attributs :
La méthode .get('attribute_name')
est utilisée pour récupérer la valeur d'un attribut à partir d'une balise.
if soup:
first_link = soup.find('a')
if first_link:
link_url = first_link.get('href')
print(f"\\\\nURL du premier lien : {link_url}")
Exemple de script d'utilisation de base complet :
import requests
from bs4 import BeautifulSoup
def scrape_quotes(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10