Web scraping avec Python : introduction et tutoriel
Le World Wide Web est composé de milliards de documents reliés entre eux et appelés communément « sites Internet ». Le code source de ces sites Internet est écrit en langage Hypertext Markup Language (HTML). Ce code source HTML est un mélange d’informations lisibles par l’homme et de codes lisibles par les machines, que l’on appelle balises. Le navigateur web – par ex. Chrome, Firefox, Safari ou Edge – traite le code source, interprète les balises et met les informations qu’elles contiennent à disposition de l’utilisateur.
Des logiciels spécifiques sont utilisés afin d’extraire uniquement du code source les informations intéressantes pour l’être humain. Ces programmes – connus sous le nom de « web scrapers », « robots d’indexation », « spiders » ou simplement « bots » – parcourent le code source des sites Internet à la recherche de schémas et extraient les informations contenues à ces endroits. Les informations obtenues lors du web scraping sont rassemblées, combinées, analysées ou enregistrées pour une utilisation ultérieure.
Dans la suite de cet article, nous vous expliquerons pourquoi le langage Python convient particulièrement à la création de web scrapers et nous vous guiderons dans vos premiers pas à l’aide d’un tutoriel.
- Templates professionnels
- Modification du design en un clic
- Domaine, SSL et email
Pourquoi utiliser Python pour le web scraping ?
Le langage de programmation Python est idéal pour créer des logiciels de web scraping. Les sites Internet sont modifiés en permanence et les contenus du web changent donc au fil du temps. Le design d’un site Internet peut par exemple être mis au goût du jour ou de nouveaux éléments de pages peuvent être ajoutés. Un web scraper est écrit pour la structure spécifique d’une page. Si la structure de la page vient à changer, le scraper doit alors être modifié. Une tâche facilement réalisable avec Python.
Par ailleurs, Python est particulièrement efficace lorsqu’il s’agit de traiter du texte et de consulter des ressources web ; deux bases techniques du web scraping. D’autre part, Python est un standard établi pour l’analyse et le traitement des données. Outre son adéquation générale, Python séduit également par un écosystème de programmation très riche, incluant notamment des bibliothèques, des projets open source, de la documentation et des références linguistiques ainsi que des contributions sur les forums, des rapports de bugs et des articles de blog.
Plusieurs outils de web scraping dédiés très sophistiqués sont disponibles avec Python. Nous vous présentons ici trois des outils les plus connus : Scrapy, Selenium et BeautifulSoup. Basé sur BeautifulSoup, notre tutoriel de web scraping avec Python vous servira ensuite d’exercice pratique. Vous pourrez ainsi comprendre directement le processus de scraping.
Aperçu du web scraping
Le schéma de fonctionnement du processus de scraping est très simple. Dans un premier temps, le développeur du scraper analyse le code source HTML de la page à laquelle il s’intéresse. Habituellement, le code contient des schémas clairs permettant d’extraire les informations désirées. Le scraper est programmé pour ces schémas. Le reste du travail est effectué par le scraper de façon automatisée et consiste à :
- consulter un site Internet à une adresse URL,
- extraire automatiquement les données structurées selon les schémas,
- rassembler, enregistrer, analyser, combiner les informations extraites, etc.
Domaines d’application du web scraping
Le web scraping peut être utilisé à des fins diverses. En dehors de l’indexation par les moteurs de recherche, il est notamment utilisé pour :
- créer des bases de données de contact,
- surveiller et comparer les prix des offres en ligne,
- rassembler des données de différentes sources en ligne,
- assurer un suivi de la présence et de la réputation en ligne,
- collecter des données financières, météorologiques et autres,
- surveiller les modifications apportées aux contenus web,
- collecter des données pour la recherche,
- miner des données.
Un exemple parlant de web scraping
Imaginez un site Internet de vente de voitures d’occasion. Lorsque vous accédez à la page dans votre navigateur, une liste de voitures vous est affichée. Regardons par exemple le code source correspondant à une voiture :
raw_html = """
<h1>Vente de véhicule d’occasion</h1>
<ul class="cars-listing">
<li class="car-listing">
<div class="car-title">
Coccinelle Volkswagen
</div>
<div class="car-description">
<span class="car-make">Volkswagen</span>
<span class="car-model">Coccinelle</span>
<span class="car-build">1973</span>
</div>
<div class="sales-price">
€ <span class="car-price">14 998 €</span>
</div>
</li>
</ul>
"""
Un web scraper peut parcourir la liste de véhicules d’occasion disponible en ligne. Conformément à l’intention de son créateur, le scraper recherche un modèle en particulier : dans notre exemple, il s’agit d’une coccinelle Volkswagen. Dans le code source, la marque et le modèle de la voiture sont précisés dans les classes CSS « car-make » et « car-model ». Ces intitulés de classes permettent de rechercher facilement les informations souhaitées. Voici un exemple avec BeautifulSoup :
# parser le code source HTML enregistré dans raw_html
html = BeautifulSoup(raw_html, 'html.parser')
# extraire le contenu de la balise avec la classe « car-title »
car_title = html.find(class_ = 'car-title').text.strip()
# si cette voiture est une coccinelle Volkswagen
if (car_title == ‘Coccinelle Volkswagen'):
# passer du titre de la voiture à la balise <li></li>
html.find_parent('li')
# déterminer le prix de la voiture
car_price = html.find(class_ = 'sales-price').text.strip()
# indiquer le prix de la voiture
print(car_price)
Risques juridiques du web scraping
Malgré son aspect pratique, le web scraping s’accompagne de risques juridiques. En principe, l’exploitant d’un site Internet met sa page à disposition pour une utilisation par des êtres humains. Une consultation automatisée à l’aide d’un web scraper peut donc constituer une violation des conditions d’utilisation. C’est notamment le cas lorsque la consultation est effectuée massivement sur plusieurs pages, que ce soit simultanément ou fréquemment. Aucun être humain ne pourrait interagir avec le site de cette façon.
Par ailleurs, la consultation, l’enregistrement et l’analyse automatisés des données publiées sur un site Internet peuvent, le cas échéant, représenter une violation des droits d’auteur. Si les informations scrapées sont des données permettant une identification personnelle, l’enregistrement et l’analyse sans autorisation de la personne concernée représentent une violation des dispositions applicables en matière de protection des données. Le fait de scraper des profils Facebook pour collecter des données à caractère personnel est par exemple interdit.
Des amendes conséquentes sont encourues en cas de violation de la protection des données et des droits d’auteur. Par conséquent, si vous souhaitez réaliser un web scraping, assurez-vous de ne contrevenir à aucune loi. Si vous rencontrez des obstacles techniques, vous ne devez en aucun cas les contourner.
Limites techniques du web scraping
Les exploitants de sites Internet ont souvent intérêt à limiter le scraping automatisé de leur offre en ligne. Cet accès massif au site Internet par les scrapers peut d’une part impacter la performance du site négativement. D’autre part, les sites Internet comportent souvent des espaces internes qui ne doivent pas apparaître dans les résultats de recherche.
Le standard robots.txt s’est établi afin de limiter les accès des scrapers : dans ce cadre, l’exploitant du site Internet place un fichier texte intitulé robots.txt dans le répertoire principal du site Internet. Ce fichier définit à l’aide d’entrées spécifiques quels scrapers ou bots peuvent accéder à quels domaines du site Internet. Les entrées du fichier robots.txt s’appliquent toujours à un domaine entier.
Voici un exemple de fichier robots.txt interdisant le scraping à tous les bots sur l’intégralité du site internet :
# Tous les bots
User-agent: *
# Exclure tout le répertoire principal
Disallow: /
La limitation à l’aide d’un fichier robots.txt est facultative. Les bots doivent observer ces spécifications, mais il est impossible de les y obliger. C’est pourquoi les exploitants des sites Internet utilisent également des techniques agressives afin de réglementer efficacement l’accès par les web scrapers : l’accès par les web scrapers peut d’une part être restreint en limitant le débit ; d’autre part, l’adresse IP du scraper peut être bloquée en cas d’accès répété contrevenant aux spécifications.
Les API : une alternative au web scraping
Même si le web scraping a son utilité, ce n’est pas la méthode à privilégier pour obtenir des données des sites Internet. En effet, il existe souvent une meilleure méthode : de nombreux exploitants de sites Internet mettent à disposition les données dans un format structuré, lisible par machine. Pour accéder aux données, on utilise alors des interfaces de programmation spéciales, appelées Application Programming Interfaces (API).
Les avantages de l’utilisation d’une API sont significatifs :
- L’API est explicitement mise à disposition par le fournisseur pour accéder aux données : les risques juridiques sont donc plus faibles et le fournisseur est mieux à même de réglementer l’accès aux données. Une clé API peut par exemple être exigée pour accéder aux données. Par ailleurs, le fournisseur peut mettre en place une limitation plus précise du débit.
- L’API fournit directement les données dans un format lisible par machine : par conséquent, il n’est pas nécessaire d’extraire les données du code source, une étape fastidieuse dans le web scraping. D’autre part, la structure des données est séparée de la représentation visuelle. La structure est ainsi conservée même si le design du site Internet est modifié.
Si une API est disponible et fournit des données complètes, elle doit être privilégiée pour accéder aux données. Néanmoins, le web scraping permet en principe d’accéder à tous les textes lisibles par l’être humain sur les sites Internet.
Outils de web scraping Python
Dans l’écosystème Python, il existe plusieurs outils établis permettant de réaliser un projet de web scraping :
- Scrapy
- Selenium
- BeautifulSoup
Nous vous présentons maintenant les avantages et les inconvénients de ces trois technologies.
Web scraping avec Scrapy
L’outil de web scraping Python Scrapy utilise un analyseur syntaxique HTML pour extraire les informations du code source HTML de la page. Par conséquent, un web scraping avec Scrapy suit le schéma suivant :
URL → requête HTTP → HTML → Scrapy
Le développement d’un scraper avec Scrapy repose sur un concept clé : les « web spiders », de petits programmes basés sur Scrapy. Chaque spider est programmé pour le scraping d’un site Internet précis et se balance d’une page à l’autre, d’où son nom de « spider » (fr. « araignée »). La programmation orientée objet est utilisée dans ce cadre : chaque spider est une classe Python propre.
En dehors du paquet Python à proprement parler, l’installation de Scrapy s’accompagne d’un outil de ligne de commande. Cette « scrapy shell » permet de commander les spiders. D’autre part, les spiders existants peuvent être chargés sur le cloud Scrapy où les spiders seront exécutés selon un programme. De cette façon, vous pouvez scraper les sites les plus volumineux sans que votre ordinateur ou votre connexion Internet personnels aient à en faire les frais. Il est également possible de mettre en place votre propre serveur de web scraping avec le logiciel open source Scrapyd.
Scrapy est une plate-forme sophistiquée pour le web scraping avec Python. L’architecture de cet outil est axée sur les besoins des projets professionnels. Scrapy contient ainsi un canal intégré pour traiter les données scrapées. Dans Scrapy, la consultation de la page est effectuée de manière asynchrone, ce qui signifie que plusieurs pages peuvent être téléchargées en parallèle. Scrapy convient ainsi parfaitement aux projets de scraping avec un grand volume de pages à traiter.
Web scraping avec Selenium
Le logiciel libre Selenium est un framework pour réaliser des tests automatisés d’applications web. Développé à l’origine pour tester les sites Internet et les applications web, le pilote web Selenium peut également être utilisé pour scraper des sites Internet avec Python. Bien que Selenium ne soit pas codé en Python, les fonctionnalités de ce logiciel sont accessibles depuis Python.
Contrairement à Scrapy ou BeautifulSoup, Selenium n’agit pas au niveau du code source HTML. À la place, la page est chargée dans un navigateur sans interface utilisateur. Le navigateur interprète le code source de la page et génère un Document Object Model (DOM). Cette interface standardisée permet de tester les interactions des utilisateurs : de cette façon, il est par exemple possible de simuler des clics et de remplir automatiquement des formulaires. Les modifications de la page qui en résultent peuvent être retrouvées dans le DOM. Par conséquent, un web scraping avec Selenium suit le schéma suivant :
URL → requête HTTP → HTML → Selenium → DOM
Le DOM étant généré de façon dynamique, Selenium permet également de scraper des pages dont les contenus ont été générés avec JavaScript. L’accès aux contenus dynamiques constitue un avantage significatif de Selenium. Pour encore plus de praticité, Selenium peut également être utilisé en association avec Scrapy ou BeautifulSoup. Selenium fournira alors le code source tandis que l’autre outil se chargera du parsing et de l’analyse. Dans ce cas, on aura le schéma suivant :
URL → requête HTTP → HTML → Selenium → DOM → HTML → Scrapy / BeautifulSoup
Web scraping avec BeautifulSoup
BeautifulSoup est le plus ancien des outils de web scraping Python présentés ici. À l’instar de Scrapy, il s’agit d’un analyseur syntaxique HTML. Par conséquent, un web scraping avec BeautifulSoup suit le schéma suivant :
URL → requête HTTP → HTML → BeautifulSoup
Contrairement à Scrapy, le développement d’un scraper avec BeautifulSoup ne requiert pas de programmation orientée objet. À la place, le scraper y est écrit comme un script simple. BeautifulSoup est ainsi le moyen le plus simple d’obtenir des informations ciblées dans cette « soupe de balises ».
Comparatif des outils de web scraping Python
Chacun des trois outils présentés comporte des avantages et des inconvénients. Nous les avons regroupés pour vous dans un comparatif clair :
Scrapy | Selenium | BeautifulSoup | |
---|---|---|---|
Facile à apprendre | ++ | + | +++ |
Lecture des contenus dynamiques | ++ | +++ | + |
Réaliser des applications complexes | +++ | + | ++ |
Robustesse face aux erreurs HTML | ++ | + | +++ |
Optimisé pour la performance du scraping | +++ | + | + |
Écosystème riche | +++ | + | ++ |
Quel outil devez-vous finalement utiliser pour votre projet ? Pour faire simple, prenez BeautifulSoup si vous souhaitez un développement rapide ou si vous souhaitez vous familiariser avec Python et le web scraping dans un premier temps. Scrapy permet de réaliser des applications de web scraping sophistiquées en Python, pour lesquelles vous devrez disposer du savoir-faire correspondant. Optez pour Selenium si vous devez scraper des contenus dynamiques avec Python.
Tutoriel web scraping avec Python et BeautifulSoup
Nous vous montrons à présent comment extraire des données d’un site Internet avec BeautifulSoup. Vous devez tout d’abord installer Python et plusieurs outils. Vous aurez besoin :
- de Python à partir de la version 3.4,
- du gestionnaire de paquets Python pip,
- du module venv.
Pour procéder à l’installation, veuillez suivre les instructions présentées sur la page d’installation de Python.
Dès que vous aurez installé le gestionnaire de paquet libre Homebrew sur votre système, vous pourrez également installer Python avec la commande suivante :
brew install python
Les explications suivantes et le code présenté concernent Python 3 sous macOS. En principe, le code devrait également fonctionner sur les autres systèmes d’exploitation. Des modifications pourront toutefois être nécessaires, en particulier si vous utilisez Windows.
Mettre en place un projet de web scraping Python sur votre appareil
Pour notre tutoriel Python, nous allons créer le dossier de projet web scraper sur le bureau. Ouvrez une invite de commande (Terminal.App sur Mac), copiez les lignes de code suivantes dans le terminal et exécutez-les :
# Passer dans le dossier Bureau
cd ~/Desktop/
# Créer le répertoire du projet
mkdir ./web Scraper/ && cd ./web scraper/
# Créer l’environnement virtuel
# fait notamment en sorte que pip3 sera utilisé ultérieurement
python3 -m venv ./env
# Activer l’environnement virtuel
source ./env/bin/activate
# Installer les paquets
pip install requests
pip install beautifulsoup4
Scraper des citations et des auteurs avec Python et BeautifulSoup
Le site internet Quotes to Scrape met à disposition une sélection de citations. Il s’agit d’une offre dédiée aux tests de scraping. Par conséquent, nul besoin de se soucier des conditions d’utilisation.
Commençons. Ouvrez une invite de commande (Terminal.App sur Mac) et démarrez l’interpréteur Python de votre dossier de projet Python web scraper. Pour ce faire, copiez les lignes de code suivantes dans le terminal et exécutez-les :
# Passer au répertoire de projet
cd ~/Desktop/web scraper/
# Activer l’environnement virtuel
source ./env/bin/activate
# Démarrer l’interpréteur Python
# comme nous nous trouvons dans l’environnement virtuel, python3 est utilisé
python
À présent, copiez le code suivant et insérez-le dans l’interpréteur Python dans l’invite de commande. Appuyez ensuite sur Entrée – le cas échéant à plusieurs reprises – pour exécuter le code. Vous pouvez également enregistrer le code sous forme de fichier scrape_quotes.py dans votre dossier de projet web scraper. Dans ce cas, vous pouvez exécuter le script Python avec la commande python scrape_quotes.py.
Comme résultat final de l’exécution du code, un fichier citation.csv devrait avoir été créé dans votre dossier de projet Python web scraper. Il s’agit d’un tableau avec les citations et les auteurs. Ouvrez le fichier avec le tableur de votre choix.
# Importer les modules
import requests
import csv
from bs4 import BeautifulSoup
# Adresse du site Internet
url = "http://quotes.toscrape.com/"
# Exécuter la requête GET
response = requests.get(url)
# Parser le document HTML BeautifulSoup obtenu à partir du code source
html = BeautifulSoup(response.text, 'html.parser')
# Extraire toutes les citations et tous les auteurs du document HTML
quotes_html = html.find_all('span', class_="text")
authors_html = html.find_all('small', class_="author")
# Rassembler les citations dans une liste
quotes = list()
for quote in quotes_html:
quotes.append(quote.text)
# Rassembler les auteurs dans une liste
authors = list()
for author in authors_html:
authors.append(author.text)
# Pour tester : combiner et afficher les entrées des deux listes
for t in zip(quotes, authors):
print(t)
# Enregistrer les citations et les auteurs dans un fichier CSV dans le répertoire actuel
# Ouvrez le fichier avec Excel / LibreOffice, etc.
with open('./zitate.csv', 'w') as csv_file:
csv_writer = csv.writer(csv_file, dialect='excel')
csv_writer.writerows(zip(quotes, authors))
Utiliser des paquets Python pour le web scraping
Chaque projet de web scraping est différent : parfois, ils consisteront simplement à vérifier les modifications, à d’autres moments, ils impliqueront des analyses complexes. Sous Python, vous disposez d’une vaste palette de paquets.
- Installer les paquets sur l’invite de commande avec pip3.
pip3 install <package></package>
- Intégrer les modules dans le script Python avec import.
from <package> import <module></module></package>
Les paquets suivants sont souvent utilisés dans les projets de web scraping :
Paquet | Utilisation |
---|---|
venv | Gérer l’environnement virtuel du projet |
request | Interroger les sites Internet |
lxml | Utiliser un analyseur syntaxique alternatif pour HTML et XML |
csv | Lire et écrire les données de tableaux au format CSV |
pandas | Traiter et analyser des données |
scrapy | Utiliser Scrapy |
selenium | Utiliser le pilote web Selenium |
Utilisez le Python Package Index (PyPI) pour avoir une vue d’ensemble des paquets Python disponibles.
Veuillez prendre connaissance des mentions légales en vigueur sur cet article.