# 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](https://www.ionos.fr/digitalguide/sites-internet/developpement-web/apprendre-le-html-le-tutoriel-pour-debutant/ "Apprendre le HTML : le tutoriel pour débutant") 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](https://www.ionos.fr/digitalguide/sites-internet/developpement-web/quest-ce-que-le-web-scraping/ "Qu’est-ce que le Web scraping&nbsp;?") 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.

## Pourquoi utiliser Python pour le web scraping ?

Le langage de programmation [Python](https://www.ionos.fr/digitalguide/sites-internet/developpement-web/tutoriel-python/ "Tutoriel 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](https://scrapy.org/ "Scrapy - A Fast and Powerful Scraping and Web Crawling Framework"), [Selenium](https://www.selenium.dev/ "SeleniumHQ Browser Automation") et [BeautifulSoup](https://www.crummy.com/software/BeautifulSoup/bs4/doc/ "Beautiful Soup Documentation"). 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 à :

1. consulter un site Internet à une adresse URL,
2. extraire automatiquement les données structurées selon les schémas,
3. 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](https://www.ionos.fr/digitalguide/web-marketing/analyse-web/data-mining-la-methode-danalyse-du-big-data/).

### 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 :

```none
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 :

```none
# 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](https://www.ionos.fr/digitalguide/sites-internet/droit-dinternet/le-rgpd-quels-changements-pour-les-entreprises/ "Le RGPD : quels changements pour les entreprises"). Le fait de scraper des profils Facebook pour collecter des données à caractère personnel est par exemple interdit.

Note **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](https://www.ionos.fr/digitalguide/hebergement/aspects-techniques/le-referencement-naturel-avec-le-fichier-robotstxt/ "Le référencement naturel avec le fichier 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 :

```none
# 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](https://www.ionos.fr/digitalguide/sites-internet/developpement-web/quest-ce-quune-api/ "Qu’est-ce qu’une API&nbsp;?") (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](https://www.scrapinghub.com/scrapy-cloud "Scrapy Cloud - The Most Advanced Platform for Running Web Crawlers") 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](https://scrapyd.readthedocs.io/en/stable/ "Scrapyd — Scrapyd 1.2.0 documentation").

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](https://www.ionos.fr/digitalguide/sites-internet/developpement-web/tutoriel-selenium-webdriver/ "Tutoriel Selenium WebDriver") 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](https://www.ionos.fr/digitalguide/sites-internet/developpement-web/document-object-model-dom/ "Document Object Model (DOM)") (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 :

<table>
  <thead>
    <tr>
      <th></th>
      <th>Scrapy</th>
      <th>Selenium</th>
      <th>BeautifulSoup</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Facile à apprendre</td>
      <td>++</td>
      <td>+</td>
      <td>+++</td>
    </tr>
    <tr>
      <td>Lecture des contenus dynamiques</td>
      <td>++</td>
      <td>+++</td>
      <td>+</td>
    </tr>
    <tr>
      <td>Réaliser des applications complexes</td>
      <td>+++</td>
      <td>+</td>
      <td>++</td>
    </tr>
    <tr>
      <td>Robustesse face aux erreurs HTML</td>
      <td>++</td>
      <td>+</td>
      <td>+++</td>
    </tr>
    <tr>
      <td>Optimisé pour la performance du scraping</td>
      <td>+++</td>
      <td>+</td>
      <td>+</td>
    </tr>
    <tr>
      <td>Écosystème riche</td>
      <td>+++</td>
      <td>+</td>
      <td>++</td>
    </tr>
  </tbody>
</table>

En résumé 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](https://www.python.org/downloads/ "Download Python — Python.org").

Dès que vous aurez installé le gestionnaire de paquet libre [Homebrew](https://brew.sh/fr "The Missing Package Manager for macOS (or Linux) — Homebrew") sur votre système, vous pourrez également installer Python avec la commande suivante :

```none
brew install python
```

Note 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 :

```none
# 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](https://quotes.toscrape.com/ "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 :

```none
# 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.

```none
# 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**.

1. Installer les paquets sur l’invite de commande avec *pip3*.

```none
pip3 install <package></package>
```

2. Intégrer les modules dans le script Python avec *import*.

```none
from <package> import <module></module></package>
```

Les paquets suivants sont souvent utilisés dans les projets de web scraping :

<table>
  <thead>
    <tr>
      <th>Paquet</th>
      <th>Utilisation</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>venv</td>
      <td>Gérer l’environnement virtuel du projet</td>
    </tr>
    <tr>
      <td>request</td>
      <td>Interroger les sites Internet</td>
    </tr>
    <tr>
      <td>lxml</td>
      <td>Utiliser un analyseur syntaxique alternatif pour HTML et XML</td>
    </tr>
    <tr>
      <td>csv</td>
      <td>Lire et écrire les données de tableaux au format CSV</td>
    </tr>
    <tr>
      <td>pandas</td>
      <td>Traiter et analyser des données</td>
    </tr>
    <tr>
      <td>scrapy</td>
      <td>Utiliser Scrapy</td>
    </tr>
    <tr>
      <td>selenium</td>
      <td>Utiliser le pilote web Selenium</td>
    </tr>
  </tbody>
</table>

Conseil Utilisez le [Python Package Index](https://pypi.org/ "PyPI - The Python Package Index") (PyPI) pour avoir une vue d’ensemble des paquets Python disponibles.

Veuillez prendre connaissance des [mentions légales](https://www.ionos.fr/digitalguide/exoneration-de-responsabilite/) en vigueur sur cet article.


This is a markdown version of: [https://www.ionos.fr/digitalguide/sites-internet/developpement-web/web-scraping-avec-python/](https://www.ionos.fr/digitalguide/sites-internet/developpement-web/web-scraping-avec-python/) for AI/LLM consumption.