Comment exécuter un navigateur sans tête avec Python pour le Web Scraping : Conseils et astuces
Mihnea-Octavian Manolache le 03 Feb 2023

L'utilisation d'un navigateur sans tête Python avec Selenium est presque la norme dans le domaine du web scraping. Mais qu'est-ce qu'un navigateur sans tête ? Et quel est le meilleur navigateur sans tête pour Selenium ? Et pourquoi même utiliser un navigateur headless en Python quand on a des `requests` ? Il y a beaucoup de questions autour de ce sujet. Ce qui signifie que nous avons beaucoup de réponses à découvrir ensemble. Mais avant de creuser plus profondément, traçons quelques objectifs d'apprentissage. A la fin de cet article, vous devriez être capable de :
- Comprendre ce qu'est un navigateur sans tête et ses cas d'utilisation
- Savoir comment ouvrir un navigateur sans tête en Python
- Créer un scraper web avec Python et Selenium
Enfin, nous parlerons également des alternatives aux navigateurs sans tête Python. Même si l'accent est mis sur Python, mon objectif est de découvrir la meilleure solution de scraping. Et cela tient compte du temps de réponse, des ressources utilisées, etc. Alors, sans plus attendre, entrons dans le vif du sujet !
Que signifie "navigateur sans tête Python" ?
À un niveau élevé, un navigateur est un programme informatique qui permet aux utilisateurs de naviguer et d'interagir avec une page web. Un navigateur sans tête est exactement cela, mais sans interface utilisateur graphique. Cela signifie qu'un navigateur sans tête Python est un programme qui peut.. :
- Naviguer vers n'importe quel site web sur l'internet
- Rendre les fichiers JavaScript servis par le site web
- Interagir avec les composants de cette page web
Le fait qu'il n'y ait pas d'interface graphique associée soulève quelques questions sur l'interaction. Pourtant, la réponse est assez simple. Comme il n'y a pas d'interface graphique, les humains ne peuvent pas interagir directement avec la page. C'est là que les pilotes web entrent en jeu. Un pilote web est une interface qui permet l'introspection et le contrôle. En termes simples, les pilotes web sont des cadres qui nous permettent de contrôler de manière programmatique différents navigateurs web.
Il existe quelques frameworks qui permettent l'automatisation des navigateurs en Python. Mais le principal est Selenium. Selenium est une suite d'outils principalement conçus pour les tests automatisés. Mais dans la pratique, il est aussi largement utilisé pour le web scraping.
Pourquoi utiliser un navigateur sans tête en Python ?
Selon l'en-tête de la page d'accueil de Selenium :
"Selenium automatise les navigateurs. C'est tout ! Ce que vous faites de ce pouvoir dépend entièrement de vous".
Cela nous amène à penser que les navigateurs automatisés ont plusieurs cas d'utilisation. Mais pourquoi les exécuter en mode "headless" ? La réponse est encore une fois simple. Un navigateur Python sans tête utilise moins de ressources (CPU et mémoire) qu'un navigateur avec tête. Et ce, principalement parce qu'il n'y a pas d'éléments graphiques à dessiner.
Encore une fois, moins c'est plus, comparé à un client HTTP de base comme `requests` de Python par exemple. C'est parce que le navigateur sans tête ouvre encore beaucoup de processus afin d'interagir avec la page et de rendre les fichiers JavaScript. Comme vous le savez, `requests` est incapable de rendre du JavaScript. Vous ne pouvez que récupérer du HTML brut en l'utilisant. Et de nos jours, c'est loin d'être suffisant pour le web scraping. La plupart des plateformes web modernes s'appuient fortement sur JavaScript pour remplir le DOM. Par exemple, si vous essayez de `curler` une application React, vous obtiendrez une page web vide qui vous demandera d'activer JavaScript :
<!doctype html>
<html lang="en">
<head>
...
</head>
<body>
<noscript> You need to enable JavaScript to run this app. </noscript>
<div id="root"></div>
</body>
</html>
Bien que vous ne puissiez pas faire cela avec `requests`, vous pouvez le faire avec un navigateur sans tête. Cela répond à l'une de nos questions initiales. Les scrapeurs web modernes utilisent des navigateurs sans tête au lieu de requêtes car sinon, la réponse ne serait pas concluante.
Quels sont les inconvénients d'un navigateur sans tête ?
Le principal inconvénient d'un navigateur headless Python (et de la plupart des navigateurs automatisés) est son empreinte digitale. Si vous suivez mes articles, vous savez que je parle parfois de furtivité. Il s'agit de la capacité d'un navigateur automatisé à passer inaperçu.
Et en Python, les navigateurs sans tête sont facilement identifiables. Pour commencer, vérifier une simple propriété du navigateur telle que `navigator.webdriver ` permet de savoir instantanément si un navigateur est contrôlé par un pilote web. Dans le domaine du web scraping, l'un des principaux défis consiste à trouver des moyens d'éviter la détection. Nous appelons ces méthodes ou techniques d'évasion. Pour en savoir plus , cliquez ici.
Chez Web Scraping API par exemple, nous avons une équipe dédiée qui travaille en permanence sur notre mode furtif. Il s'agit de s'assurer que l'empreinte digitale de notre navigateur est unique et indétectable à chaque requête.
Navigateurs sans tête disponibles avec Python Selenium
Tout d'abord, sachez que Selenium est très puissant. Et il n'est même pas limité à Python. Il existe des clients Selenium et des pilotes web pour C#, Ruby, Java, Python et même JavaScript. La prise en charge du pilote web Selenium est encore plus impressionnante. Il prend en charge tous les principaux navigateurs :
Dans le monde du web scraping, les navigateurs Python headless les plus utilisés sont Chrome et Firefox. Je pense que c'est principalement parce que ces deux navigateurs sont à la fois performants et multiplateformes. Vous pouvez par exemple développer votre projet de web scraping dans un environnement MacOS et le déployer facilement sur Linux.
Comment ouvrir un navigateur sans tête en Python
Maintenant que nous avons abordé quelques concepts théoriques, je pense qu'il est temps de passer à la partie pratique. Dans cette section, je vais vous montrer comment construire un scraper web avec Selenium. Pour ce projet, assurez-vous que votre machine est équipée de python et de Chrome.
#1 : Mise en place de l'environnement
Comme d'habitude, en Python, nous devons tout encapsuler dans un environnement virtuel. Si vous n'êtes pas familier avec les environnements virtuels, lisez d'abord ceci. Maintenant, ouvrons une nouvelle fenêtre de terminal et nous allons.. :
- Créer un nouveau dossier
- Naviguer vers le dossier
- Créer un nouvel environnement virtuel
- Activer l'environnement virtuel
~ mkdir headless_scraper
~ cd headless_scraper
~ python3 -m venv env
~ source env/bin/activate
#2 : Installer les dépendances
Il est assez évident que nous avons besoin de Selenium et d'un pilote web pour notre projet. Heureusement, nous pouvons installer les deux en utilisant le gestionnaire de paquets de Pyhton, `pip`. Dans la même fenêtre de terminal, tapez la commande suivante :
~ pip install selenium webdriver-manager
Vous êtes maintenant prêt à réussir ! Nous pouvons maintenant passer au codage proprement dit. Petit avertissement, cet article se concentre sur l'interaction avec un navigateur sans tête. Une solution complète de web scraping demande beaucoup plus d'efforts. Mais je suis sûr que si vous suivez nos articles de blog, vous pourrez y arriver en peu de temps.
#3 : Ouvrir un navigateur automatisé
Jusqu'à présent, nous avons le projet, mais il n'y a pas de fichier que nous pouvons exécuter. Créons un nouveau fichier `.py` et ouvrons-le dans notre IDE :
~ touch headles_scraper.py
~ code .
Vous devriez maintenant être dans Visual Studio Code ou dans votre IDE. Vous pouvez commencer par importer les paquets nécessaires dans `handle_scraper.py` :
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
Ce dernier est un paquet qui vous aide à gérer facilement les pilotes web pour les différents navigateurs supportés par Selenium. Vous pouvez en savoir plus ici. Ensuite, nous voulons créer un nouveau navigateur avec Selenium et ouvrir un site web :
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get('https://webscrapingapi.com')
Exécutez ce fichier maintenant et vous verrez qu'il fonctionne. Mais au lieu d'utiliser un navigateur Python sans tête, il ouvre une fenêtre Chrome pleine de tête :

#4 : Rendre le système sans tête
Nous avons décidé de construire un scraper web convivial. Idéalement, nous voulons donc ouvrir un navigateur sans tête avec Selenium. Heureusement, il existe une méthode simple pour faire passer Selenium de headful à headless. Nous avons juste besoin d'utiliser les options du pilote web de Chrome. Importons donc `Options` et ajoutons deux lignes de code supplémentaires :
...
from selenium.webdriver.chrome.options import Options
...
options = Options()
options.headless = True
driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)
driver.get('https://webscrapingapi.com')
Exécutez à nouveau votre script. Comme vous pouvez le constater, cette fois-ci, aucune fenêtre ne s'affiche. Mais cela fonctionne-t-il vraiment en arrière-plan ? Un moyen rapide de visualiser et de vérifier cela est de faire une capture d'écran à l'aide de Selenium. Il suffit d'ajouter cette ligne à la fin de votre script :
driver.get_screenshot_as_file('headless.png')
Si tout s'est bien passé, vous devriez avoir la même image que moi :

#5 : Ajouter des fonctionnalités de scraping
Qu'est-ce qu'un "web scraper" ? À la base, un scraper web est un programme qui appelle un point de terminaison vers un serveur et collecte des données à partir de celui-ci. Dans le cas des sites web, ces données consistent généralement en des fichiers HTML. Mais certains serveurs servent aujourd'hui également des objets JSON. Nous nous en tiendrons donc à ce terme : données. Pour la section suivante, fixons des objectifs plus élevés. Utilisons un peu de programmation orientée objet ! Nos objectifs sont les suivants :
- Créer une classe Scraper
- Ajouter une méthode pour extraire les données brutes
- Ajouter une méthode pour extraire les données d'un seul élément
- Ajouter une méthode pour extraire des données à partir d'éléments de la même classe
Nous avons donc trois méthodes de base que nous voulons construire. Cependant, à des fins d'apprentissage, ces trois méthodes ouvrent la voie non seulement au web scraping, mais aussi à la POO avec Python. Et je pense que c'est plutôt cool ! Supprimons maintenant tout ce que nous avons codé et repartons de zéro :
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.remote.webelement import WebElement
class Scraper :
def __init__(self, headless : bool = True) -> None :
self.headless = headless
pass
def setup_scraper(self) -> None :
self.options = Options()
self.options.headless = self.headless
self.driver = webdriver.Chrome(options=self.options)
def navigate(self, target) -> None :
self.driver.get(target) if target else print('[ !] No target given. Please specify a URL.')
def extract_raw_data(self) -> str :
return self.driver.page_source
def extract_single_element(self, selector : str, selector_type : By = By.CSS_SELECTOR) -> WebElement :
return self.driver.find_element(selector_type, selector)
def extract_all_elements(self, selector : str, selector_type : By = By.CSS_SELECTOR) -> list[WebElement] :
return self.driver.find_elements(selector_type, selector)
J'ai ajouté des annotations de type pour faciliter la compréhension, plutôt que la performance. De cette façon, vous pouvez visualiser l'application du point de vue des entrées-sorties. Les méthodes sont assez explicites. Nous n'effectuons aucune action sur les données, nous les renvoyons simplement. Si vous le souhaitez, cela peut être un point de départ pour construire un scraper complexe avec un navigateur sans tête Python.
Jusqu'à présent, l'exécution du fichier ne fait rien. C'est parce que nous avons seulement déclaré notre Scraper et ses méthodes. Nous devons maintenant les utiliser. Ajoutons donc les bouts de code suivants :
# Initialiser un nouveau scraper et naviguer vers une cible
scraper = Scraper()
scraper.setup_scraper()
scraper.navigate('https://httpbin.org')
# Extraire et imprimer l'intégralité du document HTML
raw_data = scraper.extract_raw_data()
print(raw_data)
# Extraire et imprimer un élément par son nom de classe
single_element = scraper.extract_single_element('title', By.CLASS_NAME)
print(single_element.text)
# Extraire et imprimer tous les éléments appartenant à un type de balise
all_elements = scraper.extract_all_elements('a', By.TAG_NAME)
print([el.get_attribute('href') for el in all_elements])
Et c'est tout. Si vous exécutez votre script maintenant, vous pourrez voir une action se produire. Encore une fois, il s'agit simplement d'un prototype conçu pour vous aider à démarrer. Si vous voulez en savoir plus sur la façon dont un navigateur sans tête Python peut être utilisé pour le web scraping, je vous mets au défi :
- Lire la documentation de Selenium
- Ajouter plus de fonctionnalités au script que nous avons construit aujourd'hui
Ainsi, vous pourrez à la fois acquérir des connaissances et ajouter un projet à votre portefeuille.
Quelles sont les meilleures alternatives aux navigateurs Python sans tête ?
Python est l'un des langages de programmation les plus populaires pour construire des scrapeurs web. Pourtant, ce n'est pas la seule solution. Ce n'est pas non plus la meilleure ! Dans cette section, nous allons discuter des alternatives à un navigateur sans tête Python. Nous commencerons par expliquer pourquoi envisager des solutions alternatives et nous examinerons également des exemples spécifiques.
La principale raison pour laquelle vous opteriez pour une alternative à la construction d'un web scraper Python vous-même est la question des ressources. Une solution complète de web scraping nécessite la mise en place d'un système de rotation d'IP, de certaines techniques d'évasion, d'une prise en compte des performances, et ce n'est qu'un exemple parmi tant d'autres. Construire un scraper web n'est donc pas seulement coûteux, mais aussi chronophage. Sans compter que la maintenance de l'infrastructure génère encore plus de coûts.
Le deuxième inconvénient du navigateur sans tête Python est lié aux performances. Bien que Python soit un langage formidable et très convivial, il n'est pas spécialement connu pour sa rapidité. Contrairement à Java par exemple (qui dispose également d'un package Selenium), Python est à la fois dynamiquement typé et interprété. Ces deux caractéristiques le rendent beaucoup plus lent que d'autres langages. Maintenant que nous avons une compréhension générale, soyons plus précis. Voici les 5 meilleures alternatives à Selenium et au navigateur sans tête Python :
#1 : API de récupération de données sur le Web
Si vous souhaitez remédier au premier inconvénient que nous avons identifié, vous devez vous tourner vers des fournisseurs de scraping tiers. Web Scraping API propose une suite complète de scraping. De plus, notre service est doté de fonctionnalités telles que :
- Système de rotation des IP pour les proxys des centres de données et les proxys résidentiels
- Mode furtif
- Résolveurs de chaines de caractères (Captcha)
Ces trois éléments à eux seuls font qu'il est pratiquement impossible pour une cible de rattraper notre scraper et de le bloquer. Et puis il y a les fonctionnalités de scraping. Avec l'API Web Scraping, vous pouvez extraire des données basées sur des sélecteurs, passer d'un type d'appareil à l'autre, prendre des captures d'écran, et bien d'autres choses encore. Une liste complète des fonctionnalités est disponible ici.
#N°2 : Marionnettiste
Puppeteer est l'équivalent de Selenium pour JavaScript. C'est l'une des bibliothèques les plus utilisées pour l'automatisation du Web. Contrairement à Selenium, l'état par défaut de Puppeteer est headless. Il n'est donc pas nécessaire d'ajouter du code supplémentaire pour le rendre headless. Ce qui est encore plus intéressant, c'est qu'il existe également une implémentation de l'API Puppeteer pour Python. Vous pouvez consulter ce blog où je vais en profondeur sur la construction d'un scraper web avec Pyppeteer.
#N°3 : Dramaturge
Playwright est un autre outil d'automatisation web développé par les contributeurs de Microsoft. Il est populaire principalement parce qu'il prend en charge plusieurs langues et plates-formes. Sa devise est en fait "Tout navigateur, toute plate-forme". Son API est accessible sur n'importe quel système d'exploitation et avec n'importe laquelle des langues suivantes :
Ce sont les principales alternatives à un navigateur sans tête Python. Mais d'autres outils sont également disponibles. ZombieJS ou HtmlUnit ne sont que deux exemples parmi d'autres. Je pense que le choix d'une technologie est à la fois une question de performance et de préférence personnelle. Je vous encourage donc à les tester toutes et à choisir votre préférée.
Conclusions
L'utilisation d'un navigateur sans tête Python a ses avantages et ses inconvénients. D'une part, vous construisez une solution personnalisée à laquelle vous pouvez toujours ajouter de nouvelles fonctionnalités. D'autre part, le développement et la maintenance peuvent être assez coûteux. Et il y a aussi la question de la furtivité. Si vous avez besoin d'une solution professionnelle, je pense qu'il est préférable de faire appel à un fournisseur tiers. Sinon, à des fins d'apprentissage, je vous encouragerai toujours à jouer avec la technologie.
Nouvelles et mises à jour
Restez au courant des derniers guides et nouvelles sur le web scraping en vous inscrivant à notre lettre d'information.
We care about the protection of your data. Read our <l>Privacy Policy</l>.Privacy Policy.

Articles connexes

Collectez sans effort des données en temps réel à partir des moteurs de recherche à l'aide de l'API SERP Scraping. Améliorez vos analyses de marché, votre référencement et vos recherches thématiques en toute simplicité. Commencez dès aujourd'hui !


Explorez les complexités du scraping des données de produits Amazon avec notre guide approfondi. Des meilleures pratiques aux outils tels que l'API Amazon Scraper, en passant par les considérations juridiques, apprenez à relever les défis, à contourner les CAPTCHA et à extraire efficacement des informations précieuses.


Explorez la comparaison approfondie entre Scrapy et Selenium pour le web scraping. De l'acquisition de données à grande échelle à la gestion de contenus dynamiques, découvrez les avantages, les inconvénients et les caractéristiques uniques de chacun. Apprenez à choisir le meilleur framework en fonction des besoins et de l'échelle de votre projet.
