Le World Wide Web est composé de milliards de documents reliés entre eux et appelés com­mu­né­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’in­for­ma­tions lisibles par l’homme et de codes lisibles par les machines, que l’on appelle balises. Le na­vi­ga­teur web – par ex. Chrome, Firefox, Safari ou Edge – traite le code source, in­ter­prète les balises et met les in­for­ma­tions qu’elles con­tien­nent à dis­po­si­tion de l’uti­li­sa­teur.

Des logiciels spé­ci­fiques sont utilisés afin d’extraire uni­que­ment du code source les in­for­ma­tions in­té­res­santes pour l’être humain. Ces pro­grammes – connus sous le nom de « web scrapers », « robots d’in­dexa­tion », « spiders » ou sim­ple­ment « bots » – par­cou­rent le code source des sites Internet à la recherche de schémas et extraient les in­for­ma­tions contenues à ces endroits. Les in­for­ma­tions obtenues lors du web scraping sont ras­sem­blées, combinées, analysées ou en­re­gis­trées pour une uti­li­sa­tion ul­té­rieure.

Dans la suite de cet article, nous vous ex­pli­que­rons pourquoi le langage Python convient par­ti­cu­liè­re­ment à la création de web scrapers et nous vous guiderons dans vos premiers pas à l’aide d’un tutoriel.

Site Internet avec nom de domaine
Créez votre site Web en quelques minutes
  • Templates pro­fes­sion­nels
  • Mo­di­fi­ca­tion du design en un clic
  • Domaine, SSL et email

Pourquoi utiliser Python pour le web scraping ?

Le langage de pro­gram­ma­tion Python est idéal pour créer des logiciels de web scraping. Les sites Internet sont modifiés en per­ma­nence 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é­ci­fique d’une page. Si la structure de la page vient à changer, le scraper doit alors être modifié. Une tâche fa­ci­le­ment réa­li­sable avec Python.

Par ailleurs, Python est par­ti­cu­liè­re­ment efficace lorsqu’il s’agit de traiter du texte et de consulter des res­sources web ; deux bases tech­niques du web scraping. D’autre part, Python est un standard établi pour l’analyse et le trai­te­ment des données. Outre son adé­qua­tion générale, Python séduit également par un éco­sys­tème de pro­gram­ma­tion très riche, incluant notamment des bi­blio­thèques, des projets open source, de la do­cu­men­ta­tion et des ré­fé­rences lin­guis­tiques ainsi que des con­tri­bu­tions sur les forums, des rapports de bugs et des articles de blog.

Plusieurs outils de web scraping dédiés très so­phis­ti­qués sont dis­po­nibles avec Python. Nous vous pré­sen­tons ici trois des outils les plus connus : Scrapy, Selenium et Beau­ti­ful­Soup. Basé sur Beau­ti­ful­Soup, notre tutoriel de web scraping avec Python vous servira ensuite d’exercice pratique. Vous pourrez ainsi com­prendre di­rec­te­ment le processus de scraping.

Aperçu du web scraping

Le schéma de fonc­tion­ne­ment du processus de scraping est très simple. Dans un premier temps, le dé­ve­lop­peur du scraper analyse le code source HTML de la page à laquelle il s’intéresse. Ha­bi­tuel­le­ment, le code contient des schémas clairs per­met­tant d’extraire les in­for­ma­tions désirées. Le scraper est programmé pour ces schémas. Le reste du travail est effectué par le scraper de façon au­to­ma­ti­sée et consiste à :

  1. consulter un site Internet à une adresse URL,
  2. extraire au­to­ma­ti­que­ment les données struc­tu­rées selon les schémas,
  3. ras­sem­bler, en­re­gis­trer, analyser, combiner les in­for­ma­tions extraites, etc.

Domaines d’ap­pli­ca­tion du web scraping

Le web scraping peut être utilisé à des fins diverses. En dehors de l’in­dexa­tion par les moteurs de recherche, il est notamment utilisé pour :

  • créer des bases de données de contact,
  • sur­veil­ler et comparer les prix des offres en ligne,
  • ras­sem­bler des données de dif­fé­rentes sources en ligne,
  • assurer un suivi de la présence et de la ré­pu­ta­tion en ligne,
  • collecter des données fi­nan­cières, mé­téo­ro­lo­giques et autres,
  • sur­veil­ler les mo­di­fi­ca­tions 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 na­vi­ga­teur, une liste de voitures vous est affichée. Regardons par exemple le code source cor­res­pon­dant à 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 dis­po­nible en ligne. Con­for­mé­ment à l’intention de son créateur, le scraper recherche un modèle en par­ti­cu­lier : dans notre exemple, il s’agit d’une coc­ci­nelle Volks­wa­gen. 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 per­met­tent de re­cher­cher fa­ci­le­ment les in­for­ma­tions sou­hai­tées. Voici un exemple avec Beau­ti­ful­Soup :

# 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 ju­ri­diques du web scraping

Malgré son aspect pratique, le web scraping s’ac­com­pagne de risques ju­ri­diques. En principe, l’ex­ploi­tant d’un site Internet met sa page à dis­po­si­tion pour une uti­li­sa­tion par des êtres humains. Une con­sul­ta­tion au­to­ma­ti­sée à l’aide d’un web scraper peut donc cons­ti­tuer une violation des con­di­tions d’uti­li­sa­tion. C’est notamment le cas lorsque la con­sul­ta­tion est effectuée mas­si­ve­ment sur plusieurs pages, que ce soit si­mul­ta­né­ment ou fré­quem­ment. Aucun être humain ne pourrait interagir avec le site de cette façon.

Par ailleurs, la con­sul­ta­tion, l’en­re­gis­tre­ment et l’analyse au­to­ma­ti­sés des données publiées sur un site Internet peuvent, le cas échéant, re­pré­sen­ter une violation des droits d’auteur. Si les in­for­ma­tions scrapées sont des données per­met­tant une iden­ti­fi­ca­tion per­son­nelle, l’en­re­gis­tre­ment et l’analyse sans au­to­ri­sa­tion de la personne concernée re­pré­sen­tent une violation des dis­po­si­tions ap­pli­cables en matière de pro­tec­tion des données. Le fait de scraper des profils Facebook pour collecter des données à caractère personnel est par exemple interdit.

Note

Des amendes con­sé­quentes sont encourues en cas de violation de la pro­tec­tion des données et des droits d’auteur. Par con­sé­quent, si vous souhaitez réaliser un web scraping, assurez-vous de ne con­tre­ve­nir à aucune loi. Si vous ren­con­trez des obstacles tech­niques, vous ne devez en aucun cas les con­tour­ner.

Limites tech­niques du web scraping

Les ex­ploi­tants de sites Internet ont souvent intérêt à limiter le scraping au­to­ma­tisé de leur offre en ligne. Cet accès massif au site Internet par les scrapers peut d’une part impacter la per­for­mance du site né­ga­ti­ve­ment. D’autre part, les sites Internet com­por­tent souvent des espaces internes qui ne doivent pas ap­pa­raî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’ex­ploi­tant du site Internet place un fichier texte intitulé robots.txt dans le ré­per­toire principal du site Internet. Ce fichier définit à l’aide d’entrées spé­ci­fiques quels scrapers ou bots peuvent accéder à quels domaines du site Internet. Les entrées du fichier robots.txt s’ap­pli­quent toujours à un domaine entier.

Voici un exemple de fichier robots.txt in­ter­di­sant le scraping à tous les bots sur l’in­té­gra­lité du site internet :

# Tous les bots
User-agent: *
# Exclure tout le répertoire principal
Disallow: /

La li­mi­ta­tion à l’aide d’un fichier robots.txt est fa­cul­ta­tive. Les bots doivent observer ces spé­ci­fi­ca­tions, mais il est im­pos­sible de les y obliger. C’est pourquoi les ex­ploi­tants des sites Internet utilisent également des tech­niques agres­sives afin de ré­gle­men­ter ef­fi­ca­ce­ment 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é con­tre­ve­nant aux spé­ci­fi­ca­tions.

Les API : une al­ter­na­tive au web scraping

Même si le web scraping a son utilité, ce n’est pas la méthode à pri­vi­lé­gier pour obtenir des données des sites Internet. En effet, il existe souvent une meilleure méthode : de nombreux ex­ploi­tants de sites Internet mettent à dis­po­si­tion les données dans un format structuré, lisible par machine. Pour accéder aux données, on utilise alors des in­ter­faces de pro­gram­ma­tion spéciales, appelées Ap­pli­ca­tion Pro­gram­ming In­ter­faces (API).

Les avantages de l’uti­li­sa­tion d’une API sont sig­ni­fi­ca­tifs :

  • L’API est ex­pli­ci­te­ment mise à dis­po­si­tion par le four­nis­seur pour accéder aux données : les risques ju­ri­diques sont donc plus faibles et le four­nis­seur est mieux à même de ré­gle­men­ter l’accès aux données. Une clé API peut par exemple être exigée pour accéder aux données. Par ailleurs, le four­nis­seur peut mettre en place une li­mi­ta­tion plus précise du débit.
  • L’API fournit di­rec­te­ment les données dans un format lisible par machine : par con­sé­quent, il n’est pas né­ces­saire d’extraire les données du code source, une étape fas­ti­dieuse dans le web scraping. D’autre part, la structure des données est séparée de la re­pré­sen­ta­tion visuelle. La structure est ainsi conservée même si le design du site Internet est modifié.

Si une API est dis­po­nible et fournit des données complètes, elle doit être pri­vi­lé­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’éco­sys­tème Python, il existe plusieurs outils établis per­met­tant de réaliser un projet de web scraping :

  • Scrapy
  • Selenium
  • Beau­ti­ful­Soup

Nous vous pré­sen­tons main­te­nant les avantages et les in­con­vé­nients de ces trois tech­no­lo­gies.

Web scraping avec Scrapy

L’outil de web scraping Python Scrapy utilise un analyseur syn­taxique HTML pour extraire les in­for­ma­tions du code source HTML de la page. Par con­sé­quent, un web scraping avec Scrapy suit le schéma suivant :

URL → requête HTTP → HTML → Scrapy

Le dé­ve­lop­pe­ment d’un scraper avec Scrapy repose sur un concept clé : les « web spiders », de petits pro­grammes 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 pro­gram­ma­tion orientée objet est utilisée dans ce cadre : chaque spider est une classe Python propre.

En dehors du paquet Python à pro­pre­ment parler, l’ins­tal­la­tion de Scrapy s’ac­com­pagne 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 vo­lu­mi­neux sans que votre or­di­na­teur ou votre connexion Internet per­son­nels 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 so­phis­ti­quée pour le web scraping avec Python. L’ar­chi­tec­ture de cet outil est axée sur les besoins des projets pro­fes­sion­nels. Scrapy contient ainsi un canal intégré pour traiter les données scrapées. Dans Scrapy, la con­sul­ta­tion de la page est effectuée de manière asyn­chrone, ce qui signifie que plusieurs pages peuvent être té­lé­char­gées en parallèle. Scrapy convient ainsi par­fai­te­ment 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 au­to­ma­ti­sés d’ap­pli­ca­tions web. Développé à l’origine pour tester les sites Internet et les ap­pli­ca­tions 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 fonc­tion­na­li­tés de ce logiciel sont ac­ces­sibles depuis Python.

Con­trai­re­ment à Scrapy ou Beau­ti­ful­Soup, Selenium n’agit pas au niveau du code source HTML. À la place, la page est chargée dans un na­vi­ga­teur sans interface uti­li­sa­teur. Le na­vi­ga­teur in­ter­prète le code source de la page et génère un Document Object Model (DOM). Cette interface stan­dar­di­sée permet de tester les in­te­rac­tions des uti­li­sa­teurs : de cette façon, il est par exemple possible de simuler des clics et de remplir au­to­ma­ti­que­ment des for­mu­laires. Les mo­di­fi­ca­tions de la page qui en résultent peuvent être re­trou­vées dans le DOM. Par con­sé­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 Ja­vaS­cript. L’accès aux contenus dy­na­miques constitue un avantage sig­ni­fi­ca­tif de Selenium. Pour encore plus de praticité, Selenium peut également être utilisé en as­so­cia­tion avec Scrapy ou Beau­ti­ful­Soup. 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 / Beau­ti­ful­Soup

Web scraping avec Beau­ti­ful­Soup

Beau­ti­ful­Soup est le plus ancien des outils de web scraping Python présentés ici. À l’instar de Scrapy, il s’agit d’un analyseur syn­taxique HTML. Par con­sé­quent, un web scraping avec Beau­ti­ful­Soup suit le schéma suivant :

URL → requête HTTP → HTML → Beau­ti­ful­Soup

Con­trai­re­ment à Scrapy, le dé­ve­lop­pe­ment d’un scraper avec Beau­ti­ful­Soup ne requiert pas de pro­gram­ma­tion orientée objet. À la place, le scraper y est écrit comme un script simple. Beau­ti­ful­Soup est ainsi le moyen le plus simple d’obtenir des in­for­ma­tions ciblées dans cette « soupe de balises ».

Com­pa­ra­tif des outils de web scraping Python

Chacun des trois outils présentés comporte des avantages et des in­con­vé­nients. Nous les avons regroupés pour vous dans un com­pa­ra­tif clair :

Scrapy Selenium Beau­ti­ful­Soup
Facile à apprendre ++ + +++
Lecture des contenus dy­na­miques ++ +++ +
Réaliser des ap­pli­ca­tions complexes +++ + ++
Ro­bus­tesse face aux erreurs HTML ++ + +++
Optimisé pour la per­for­mance du scraping +++ + +
Éco­sys­tème riche +++ + ++
En résumé

Quel outil devez-vous fi­na­le­ment utiliser pour votre projet ? Pour faire simple, prenez Beau­ti­ful­Soup si vous souhaitez un dé­ve­lop­pe­ment rapide ou si vous souhaitez vous fa­mi­lia­ri­ser avec Python et le web scraping dans un premier temps. Scrapy permet de réaliser des ap­pli­ca­tions de web scraping so­phis­ti­quées en Python, pour les­quelles vous devrez disposer du savoir-faire cor­res­pon­dant. Optez pour Selenium si vous devez scraper des contenus dy­na­miques avec Python.

Tutoriel web scraping avec Python et Beau­ti­ful­Soup

Nous vous montrons à présent comment extraire des données d’un site Internet avec Beau­ti­ful­Soup. Vous devez tout d’abord installer Python et plusieurs outils. Vous aurez besoin :

  • de Python à partir de la version 3.4,
  • du ges­tion­naire de paquets Python pip,
  • du module venv.

Pour procéder à l’ins­tal­la­tion, veuillez suivre les ins­truc­tions pré­sen­tées sur la page d’ins­tal­la­tion de Python.

Dès que vous aurez installé le ges­tion­naire de paquet libre Homebrew sur votre système, vous pourrez également installer Python avec la commande suivante :

brew install python
Note

Les ex­pli­ca­tions suivantes et le code présenté con­cer­nent Python 3 sous macOS. En principe, le code devrait également fonc­tion­ner sur les autres systèmes d’ex­ploi­ta­tion. Des mo­di­fi­ca­tions pourront toutefois être né­ces­saires, en par­ti­cu­lier 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 Beau­ti­ful­Soup

Le site internet Quotes to Scrape met à dis­po­si­tion une sélection de citations. Il s’agit d’une offre dédiée aux tests de scraping. Par con­sé­quent, nul besoin de se soucier des con­di­tions d’uti­li­sa­tion.

Com­men­çons. Ouvrez une invite de commande (Terminal.App sur Mac) et démarrez l’in­ter­pré­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’in­ter­pré­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 en­re­gis­trer 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 con­sis­te­ront sim­ple­ment à vérifier les mo­di­fi­ca­tions, à d’autres moments, ils im­pli­que­ront des analyses complexes. Sous Python, vous disposez d’une vaste palette de paquets.

  1. Installer les paquets sur l’invite de commande avec pip3.
pip3 install <package></package>
  1. 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 Uti­li­sa­tion
venv Gérer l’en­vi­ron­ne­ment virtuel du projet
request In­ter­ro­ger les sites Internet
lxml Utiliser un analyseur syn­taxique al­ter­na­tif 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
Conseil

Utilisez le Python Package Index (PyPI) pour avoir une vue d’ensemble des paquets Python dis­po­nibles.

Veuillez prendre con­nais­sance des mentions légales en vigueur sur cet article.

Aller au menu principal