Web Scraping à l'aide de Python : guide étape par étape
Publié: 2022-11-28Le scraping Web consiste à extraire des informations d'un site Web et à les utiliser pour un cas d'utilisation particulier.
Supposons que vous essayez d'extraire un tableau d'une page Web, de le convertir en fichier JSON et d'utiliser le fichier JSON pour créer des outils internes. À l'aide du web scraping, vous pouvez extraire les données souhaitées en ciblant les éléments spécifiques d'une page Web. Le scraping Web à l'aide de Python est un choix très populaire car Python fournit plusieurs bibliothèques comme BeautifulSoup ou Scrapy pour extraire efficacement les données.

Avoir la compétence d'extraire efficacement des données est également très important en tant que développeur ou data scientist. Cet article vous aidera à comprendre comment scraper efficacement un site Web et à obtenir le contenu nécessaire pour le manipuler en fonction de vos besoins. Pour ce tutoriel, nous utiliserons le package BeautifulSoup. C'est un package à la mode pour récupérer des données en Python.
Pourquoi utiliser Python pour le Web Scraping ?
Python est le premier choix de nombreux développeurs lors de la création de scrapers Web. Il existe de nombreuses raisons pour lesquelles Python est le premier choix, mais pour cet article, discutons des trois principales raisons pour lesquelles Python est utilisé pour le scraping de données.
Support de la bibliothèque et de la communauté : Il existe plusieurs grandes bibliothèques, comme BeautifulSoup, Scrapy, Selenium, etc., qui offrent d'excellentes fonctions pour gratter efficacement les pages Web. Il a construit un excellent écosystème pour le scraping Web, et aussi parce que de nombreux développeurs dans le monde utilisent déjà Python, vous pouvez rapidement obtenir de l'aide lorsque vous êtes bloqué.
Automatisation : Python est célèbre pour ses capacités d'automatisation. Plus que le grattage Web est nécessaire si vous essayez de créer un outil complexe qui repose sur le grattage. Par exemple, si vous souhaitez créer un outil qui suit le prix des articles dans une boutique en ligne, vous devrez ajouter une capacité d'automatisation afin qu'il puisse suivre les tarifs quotidiennement et les ajouter à votre base de données. Python vous permet d'automatiser facilement ces processus.
Visualisation des données : le scraping Web est largement utilisé par les data scientists. Les scientifiques des données ont souvent besoin d'extraire des données de pages Web. Avec des bibliothèques comme Pandas, Python simplifie la visualisation des données à partir des données brutes.
Bibliothèques pour le Web Scraping en Python
Il existe plusieurs bibliothèques disponibles en Python pour simplifier le scraping Web. Discutons ici des trois bibliothèques les plus populaires.
#1. BelleSoupe
L'une des bibliothèques les plus populaires pour le grattage Web. BeautifulSoup aide les développeurs à gratter des pages Web depuis 2004. Il fournit des méthodes simples pour naviguer, rechercher et modifier l'arborescence d'analyse. Beautifulsoup s'occupe également de l'encodage des données entrantes et sortantes. Il est bien entretenu et a une grande communauté.
#2. Scrapy
Un autre cadre populaire pour l'extraction de données. Scrapy compte plus de 43 000 étoiles sur GitHub. Il peut également être utilisé pour extraire des données des API. Il a également quelques supports intégrés intéressants, comme l'envoi d'e-mails.
#3. Sélénium
Selenium n'est pas principalement une bibliothèque de grattage Web. Au lieu de cela, il s'agit d'un package d'automatisation du navigateur. Mais nous pouvons facilement étendre ses fonctionnalités pour gratter des pages Web. Il utilise le protocole WebDriver pour contrôler différents navigateurs. Le sélénium est sur le marché depuis près de 20 ans maintenant. Mais en utilisant Selenium, vous pouvez facilement automatiser et récupérer les données des pages Web.
Défis avec Python Web Scraping
On peut faire face à de nombreux défis lorsqu'on essaie d'extraire des données de sites Web. Il existe des problèmes tels que les réseaux lents, les outils anti-grattage, le blocage basé sur IP, le blocage captcha, etc. Ces problèmes peuvent causer d'énormes problèmes lorsque vous essayez de gratter un site Web.
Mais vous pouvez efficacement contourner les défis en suivant certaines méthodes. Par exemple, dans la plupart des cas, une adresse IP est bloquée par un site Web lorsqu'il y a plus qu'un certain nombre de demandes envoyées dans un intervalle de temps spécifique. Pour éviter le blocage IP, vous devrez coder votre scraper afin qu'il refroidisse après l'envoi de requêtes.

Les développeurs ont également tendance à mettre des pièges à pots de miel pour les grattoirs. Ces pièges sont généralement invisibles à l'œil nu mais peuvent être rampés par un grattoir. Si vous grattez un site Web qui met un tel piège à pot de miel, vous devrez coder votre grattoir en conséquence.
Captcha est un autre problème grave avec les grattoirs. De nos jours, la plupart des sites Web utilisent un captcha pour protéger l'accès des bots à leurs pages. Dans ce cas, vous devrez peut-être utiliser un solveur de captcha.
Gratter un site Web avec Python
Comme nous en avons discuté, nous utiliserons BeautifulSoup pour supprimer un site Web. Dans ce didacticiel, nous allons récupérer les données historiques d'Ethereum de Coingecko et enregistrer les données de la table sous forme de fichier JSON. Passons à la construction du grattoir.
La première étape consiste à installer BeautifulSoup et Requests. Pour ce tutoriel, j'utiliserai Pipenv. Pipenv est un gestionnaire d'environnement virtuel pour Python. Vous pouvez également utiliser Venv si vous le souhaitez, mais je préfère Pipenv. Discuter de Pipenv dépasse le cadre de ce didacticiel. Mais si vous voulez savoir comment Pipenv peut être utilisé, suivez ce guide. Ou, si vous voulez comprendre les environnements virtuels Python, suivez ce guide.
Lancez le shell Pipenv dans votre répertoire de projet en exécutant la commande pipenv shell
. Il lancera un sous-shell dans votre environnement virtuel. Maintenant, pour installer BeautifulSoup, exécutez la commande suivante :
pipenv install beautifulsoup4
Et, pour installer des requêtes, exécutez la commande similaire à celle ci-dessus :
pipenv install requests
Une fois l'installation terminée, importez les packages nécessaires dans le fichier principal. Créez un fichier appelé main.py
et importez les packages comme ci-dessous :

from bs4 import BeautifulSoup import requests import json
L'étape suivante consiste à obtenir le contenu de la page de données historiques et à les analyser à l'aide de l'analyseur HTML disponible dans BeautifulSoup.
r = requests.get('https://www.coingecko.com/en/coins/ethereum/historical_data#panel') soup = BeautifulSoup(r.content, 'html.parser')
Dans le code ci-dessus, la page est accessible à l'aide de la méthode get
disponible dans la bibliothèque des requêtes. Le contenu analysé est ensuite stocké dans une variable appelée soup
.
La partie de grattage d'origine commence maintenant. Tout d'abord, vous devrez identifier correctement la table dans le DOM. Si vous ouvrez cette page et que vous l'inspectez à l'aide des outils de développement disponibles dans le navigateur, vous verrez que la table contient ces classes table table-striped text-sm text-lg-normal
.

Pour cibler correctement cette table, vous pouvez utiliser la méthode find
.
table = soup.find('table', attrs={'class': 'table table-striped text-sm text-lg-normal'}) table_data = table.find_all('tr') table_headings = [] for th in table_data[0].find_all('th'): table_headings.append(th.text)
Dans le code ci-dessus, la table est d'abord trouvée à l'aide de la méthode soup.find
, puis à l'aide de la méthode find_all
, tous les éléments tr
à l'intérieur de la table sont recherchés. Ces éléments tr
sont stockés dans une variable appelée table_data
. Le tableau comporte quelques th
éléments pour le titre. Une nouvelle variable appelée table_headings
est initialisée pour conserver les titres dans une liste.
Une boucle for est ensuite exécutée pour la première ligne du tableau. Dans cette ligne, tous les éléments avec th
sont recherchés et leur valeur textuelle est ajoutée à la liste table_headings
. Le texte est extrait à l'aide de la méthode du text
. Si vous imprimez la variable table_headings
maintenant, vous pourrez voir la sortie suivante :
['Date', 'Market Cap', 'Volume', 'Open', 'Close']
L'étape suivante consiste à gratter le reste des éléments, à générer un dictionnaire pour chaque ligne, puis à ajouter les lignes dans une liste.
for tr in table_data: th = tr.find_all('th') td = tr.find_all('td') data = {} for i in range(len(td)): data.update({table_headings[0]: th[0].text}) data.update({table_headings[i+1]: td[i].text.replace('\n', '')}) if data.__len__() > 0: table_details.append(data)
C'est la partie essentielle du code. Pour chaque tr
dans la variable table_data
, les th
éléments sont d'abord recherchés. Les th
éléments sont la date indiquée dans le tableau. Ces éléments th
sont stockés dans une variable th
. De même, tous les éléments td
sont stockés dans la variable td
.
Une data
dictionnaire vide est initialisée. Après l'initialisation, nous parcourons la plage d'éléments td
. Pour chaque ligne, d'abord, nous mettons à jour le premier champ du dictionnaire avec le premier élément de th
. Le code table_headings[0]: th[0].text
attribue une paire clé-valeur de date et le premier th
élément.
Après avoir initialisé le premier élément, les autres éléments sont affectés à l'aide data.update({table_headings[i+1]: td[i].text.replace('\\n', '')})
. Ici, le texte des éléments td
est d'abord extrait à l'aide de la méthode text
, puis tous les \\n
sont remplacés à l'aide de la méthode replace
. La valeur est alors affectée au i+1
ème élément de la liste table_headings
car le i
ème élément est déjà affecté.
Ensuite, si la longueur du dictionnaire data
dépasse zéro, nous ajoutons le dictionnaire à la liste table_details
. Vous pouvez imprimer la liste table_details
pour vérifier. Mais nous allons écrire les valeurs dans un fichier JSON. Jetons un coup d'œil au code pour cela,
with open('table.json', 'w') as f: json.dump(table_details, f, indent=2) print('Data saved to json file...')
Nous utilisons ici la méthode json.dump
pour écrire les valeurs dans un fichier JSON appelé table.json
. Une fois l'écriture terminée, nous imprimons les Data saved to json file...
dans la console.
Maintenant, exécutez le fichier en utilisant la commande suivante,
python run main.py
Après un certain temps, vous pourrez voir le texte Données enregistrées dans le fichier JSON… dans la console. Vous verrez également un nouveau fichier appelé table.json dans le répertoire des fichiers de travail. Le fichier ressemblera au fichier JSON suivant :
[ { "Date": "2022-11-27", "Market Cap": "$145,222,050,633", "Volume": "$5,271,100,860", "Open": "$1,205.66", "Close": "N/A" }, { "Date": "2022-11-26", "Market Cap": "$144,810,246,845", "Volume": "$5,823,202,533", "Open": "$1,198.98", "Close": "$1,205.66" }, { "Date": "2022-11-25", "Market Cap": "$145,091,739,838", "Volume": "$6,955,523,718", "Open": "$1,204.21", "Close": "$1,198.98" }, // ... // ... ]
Vous avez implémenté avec succès un grattoir Web à l'aide de Python. Pour voir le code complet, vous pouvez visiter ce dépôt GitHub.
Conclusion
Cet article a expliqué comment vous pouvez implémenter un simple scrape Python. Nous avons discuté de la manière dont BeautifulSoup pourrait être utilisé pour extraire rapidement des données du site Web. Nous avons également discuté d'autres bibliothèques disponibles et des raisons pour lesquelles Python est le premier choix de nombreux développeurs pour le scraping de sites Web.
Vous pouvez également consulter ces cadres de grattage Web.