Web scraping avec Ajax : Guide complet

Auteur :

Réagir :

Commenter

Scraper un site qui utilise AJAX est plus complexe qu’un web scraping classique. Le contenu n’est pas dans le HTML initial : il arrive après coup, via JavaScript. Un scraper simple ne voit donc rien, et il faut adopter une approche adaptée pour récupérer ces données dynamiques.

Fonctionnement du web scraping sur un site utilisant AJAX pour charger ses données en JavaScript
Fonctionnement du web scraping sur un site utilisant AJAX. ©Christina pour Alucare.fr

AJAX et web scraping : pourquoi c’est différent ?

Le web scraping consiste à analyser le code HTML d’une page web pour en extraire automatiquement les données utiles. Ça fonctionne très bien sur un site statique. Le problème arrive avec AJAX (pour Asynchronous JavaScript and XML), une technologie qui permet de charger ou de mettre à jour du contenu sans recharger toute la page.

Comment fonctionne AJAX ?

Le navigateur (ou browser) envoie de petites requêtes asynchrones au serveur en arrière-plan. Le serveur renvoie les données, souvent au format JSON. La page affiche ensuite ces informations à la volée, sans recharger le reste. C’est ce qui rend le web plus rapide et plus interactif.

Schéma du fonctionnement d'AJAX qui charge des données en arrière-plan sans recharger toute la page web
Fonctionnement du web scraping sur un site qui utilise AJAX. ©Christina pour Alucare.fr

Pourquoi le scraping AJAX est plus complexe ?

Quand un site utilise AJAX, le contenu chargé n’apparaît pas dans le code source HTML initial. Il est injecté après coup par le JavaScript, une fois la page ouverte. Un scraper classique ne récupère que le contenu statique : il ne voit donc pas les données dynamiques ajoutées ensuite.

Pour les récupérer, tu as besoin d’un outil capable d’exécuter le JavaScript. En pratique, trois approches dominent :

  • Reproduire directement les requêtes AJAX, c’est-à-dire les appels XHR qui chargent les données.
  • Piloter un navigateur headless comme Selenium ou Playwright, qui assure le rendu (ou rendering) de la page comme un vrai navigateur.
  • Passer par une API de scraping tout-en-un.

Quelles sont les méthodes et outils de scraping AJAX ?

Méthode 1 : reproduire les requêtes AJAX

C’est la méthode la plus performante pour récupérer des données dynamiques. Au lieu de rendre toute la page, tu interceptes les requêtes AJAX envoyées au serveur, puis tu les reproduis directement pour obtenir les données brutes, souvent au format JSON.

Pour repérer ces appels, ouvre les outils de développement de ton navigateur, puis l’onglet Network avec le filtre XHR. Tu y verras l’URL exacte de l’endpoint, les headers et le format de la réponse.

Les points forts de cette technique :

  • Très rapide et légère, car elle ne nécessite aucun rendu complet de la page.
  • Elle contourne les problèmes liés au rendu JavaScript.

Ses limites :

  • Plus complexe à mettre en place qu’un navigateur headless.
  • Elle demande une analyse minutieuse des requêtes, des headers et des paramètres. Certains sites imposent un token ou des headers obligatoires.

Côté bibliothèques, tu as le choix selon le langage :

Bibliothèques requests (Python) et axios (JavaScript) pour reproduire les requêtes AJAX
Python et JavaScript proposent deux bibliothèques pour reproduire les requêtes AJAX : requests et axios. ©Christina pour Alucare.fr

Méthode 2 : utiliser un navigateur headless

C’est la méthode la plus simple pour scraper des pages dynamiques. Tu automatises un vrai navigateur web sans interface graphique. Il rend la page exactement comme le ferait un utilisateur, exécute le JavaScript, déclenche les appels AJAX et affiche le contenu final.

Les avantages :

  • Tu scrapes exactement ce que voit l’utilisateur, contenu chargé compris.
  • C’est simple à mettre en œuvre, même sur un site très dynamique.

Les inconvénients :

  • C’est plus lent qu’une requête directe.
  • C’est gourmand en ressources, car tu lances un navigateur complet.

Les outils les plus utilisés pour cette approche :

  • Selenium : l’outil polyvalent, historique et bien documenté.
  • Playwright : moderne, rapide et multi-navigateurs.
  • Puppeteer : spécialisé pour Chrome et Chromium.

Comparaison des navigateurs headless Puppeteer, Playwright et Selenium pour scraper des pages AJAX
Puppeteer, Playwright et Selenium automatisent un navigateur headless pour scraper des pages dynamiques. ©Christina pour Alucare.fr

Tu peux combiner un navigateur headless avec BeautifulSoup (module bs4) : le navigateur charge la page et assure le rendering du JavaScript, puis tu parses le HTML rendu avec la bibliothèque.

Méthode 3 : les API de scraping tout-en-un

Certaines plateformes proposent des services complets de scraping, parmi les outils gratuits ou payants du marché. On peut citer Bright Data, ZenRows, ScrapingBee ou Crawlbase. Elles gèrent automatiquement le rendu JavaScript, les proxies et l’extraction des données : tu envoies une URL, elles te renvoient le contenu final.

Les avantages :

  • Simples et fiables, même à grande échelle.
  • Aucune gestion d’infrastructure ni de proxies de ton côté.

Les inconvénients :

  • Le coût peut être élevé selon le volume.
  • Tu as moins de contrôle sur le processus.

Interface de Bright Data, une API de scraping tout-en-un pour les sites AJAX
Bright Data est une API de scraping tout-en-un qui gère le rendu JavaScript et les proxies. ©Christina pour Alucare.fr

Comment scraper un site avec AJAX ?

Voici comment scraper concrètement un site qui charge ses articles via AJAX, avec deux exemples de code en Python : un avec requests, un avec un navigateur headless.

1. Identifier les requêtes AJAX dans les outils de développement

Le contenu chargé par AJAX n’est pas dans le HTML initial. Il faut donc repérer l’appel réseau qui va chercher les données.

  • Ouvre les outils de développement de ton navigateur (touche F12 ou clic droit puis “Inspecter”).
  • Va dans l’onglet Réseau (Network) puis recharge la page.
  • Observe les requêtes déclenchées par le site, y compris celles qui chargent les articles.
  • Filtre sur les requêtes de type XHR ou fetch : ce sont elles qui récupèrent les données en arrière-plan.

Clique sur la bonne requête pour voir son URL, ses headers et sa réponse. Le plus souvent, la réponse est au format JSON, parfois en HTML.

2. Choisir la méthode de scraping

Une fois la requête AJAX repérée, tu as deux options.

  • Reproduire la requête : tu rejoues directement l’appel en Python avec la bibliothèque requests. Tu récupères les données brutes en JSON ou en HTML, sans navigateur. C’est la méthode la plus rapide.
  • Navigateur headless : si le site exige l’exécution de JavaScript ou des interactions complexes (clic, scroll), tu utilises Selenium ou Playwright. L’outil charge la page comme le ferait un utilisateur réel.

3. Reproduire la requête AJAX avec requests

Voici le code de base pour rejouer l’appel identifié dans l’onglet réseau.

import requests

# URL de la requête AJAX identifiée dans les outils de développement
url = 'https://example.com/ajax-endpoint'

# Paramètres de la requête (à adapter aux données observées)
params = {
    'page': 1,
    'category': 'technology'
}

# Headers à copier depuis l'onglet Network (User-Agent, Referer, token...)
headers = {
    'User-Agent': 'Mozilla/5.0',
    'X-Requested-With': 'XMLHttpRequest'
}

# Envoi de la requête GET
response = requests.get(url, params=params, headers=headers)

# Vérifier le statut de la réponse
if response.status_code == 200:
    data = response.json()
    print(data)
else:
    print(f"Erreur {response.status_code}")

Détail ligne par ligne :

  • import requests : charge la bibliothèque qui envoie les requêtes HTTP.
  • url : remplace cette adresse par l’endpoint AJAX repéré dans le network tab.
  • headers : copie les en-têtes vus dans l’onglet Network. Certains sites exigent un User-Agent, un Referer ou un token CSRF pour accepter la requête.
  • Un status 200 signifie que la requête a réussi.
  • response.json() convertit la réponse JSON en dictionnaire Python.
  • print(data) : affiche les données extraites (liste d’articles, prix, etc.).
  • else : affiche le code d’erreur si l’appel échoue (par exemple 403 ou 404).

4. Scraper avec un navigateur headless (Selenium + BeautifulSoup)

Quand la reproduction de requête ne suffit pas, un navigateur headless exécute le JavaScript à ta place. Tu récupères ensuite le HTML rendu, puis tu le parses avec BeautifulSoup (module bs4).

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import time

# Lancer Chrome en mode headless (sans interface)
options = Options()
options.add_argument("--headless")
driver = webdriver.Chrome(options=options)

# Ouvrir la page qui charge son contenu via AJAX
driver.get("https://example.com")

# Laisser le JavaScript charger les données
time.sleep(3)

# Parser le HTML rendu avec BeautifulSoup
soup = BeautifulSoup(driver.page_source, "html.parser")
articles = soup.find_all("div", class_="article")

for article in articles:
    print(article.get_text())

driver.quit()

Ici, Selenium pilote un vrai Chrome qui assure le rendering de la page, et driver.page_source renvoie le HTML une fois le contenu AJAX chargé. Playwright et Puppeteer fonctionnent sur le même principe, avec une syntaxe différente.

5. Extraire les données du JSON ou du HTML rendu

Une fois la réponse récupérée, tu isoles les informations utiles selon son format.

  • Réponse en JSON : utilise response.json() pour obtenir un dictionnaire Python, puis accède aux valeurs par leurs clés.
  • Réponse en HTML : passe par BeautifulSoup (module bs4) avec find ou select pour cibler les éléments via leur classe ou leur id.

Quelle méthode de scraping AJAX choisir ?

Chaque approche a ses forces selon ton niveau et ton projet. Voici un comparatif rapide.

Méthode Vitesse Complexité Coût Meilleure pour…
Reproduction de requête Très rapide Élevée Faible Scraping à grande échelle, données structurées
Navigateur headless Lente Moyenne Faible Sites complexes, projets rapides, débutants
API de scraping Rapide Très faible Élevé Projets critiques, sans maintenance d’infrastructure

En pratique : commence par la reproduction de requête si l’endpoint AJAX renvoie du JSON propre. Passe au navigateur headless dès que le JavaScript devient incontournable.

Quels sont les défis du scraping AJAX et leurs solutions ?

Scraper un site en AJAX pose des problèmes qu’un scraping classique ne rencontre pas. Voici les principaux défis, et surtout comment les contourner.

Défi 1 : le contenu invisible au premier abord

Quand tu charges une page AJAX, le HTML initial est souvent vide : les données n’arrivent qu’après l’exécution du JavaScript. La solution est d’utiliser un navigateur headless comme Selenium, Playwright ou Puppeteer, qui assure le rendering complet de la page avant de lire son contenu.

Défi 2 : les requêtes simples qui échouent

Reproduire l’appel AJAX ne suffit pas toujours. Beaucoup de sites protègent leur API, et ta requête peut renvoyer une erreur 403 alors que le navigateur, lui, obtient bien la réponse. Il manque des informations dans ta requête. En pratique, il faut souvent :

  • Copier les headers obligatoires vus dans l’onglet Network (comme User-Agent ou Referer).
  • Ajouter le token CSRF ou les cookies de session quand le serveur les exige.
  • Vérifier le status code de la réponse pour repérer vite ce qui bloque.

Défi 3 : la gestion des délais de chargement

Les données chargées par AJAX peuvent mettre du temps à apparaître. Si le scraper lit la page trop tôt, il ne trouve rien. Deux approches selon le besoin :

  • Une pause fixe (un sleep en secondes) avant de lire la page. Simple, mais peu fiable.
  • Une attente conditionnelle, bien plus propre, via les waits de Selenium : l’attente implicite patiente automatiquement que les éléments soient disponibles, tandis que l’attente explicite attend précisément un élément ou une condition définie avant de continuer.

Défi 4 : scraper à grande échelle sans se faire bloquer

Sur quelques pages, aucun souci. Mais si tu scrapes des milliers de pages, le site finit par te repérer et te bloquer. Pour tenir la distance :

  • Fais tourner tes requêtes sur des proxies pour varier les adresses IP.
  • Respecte un délai entre les appels au lieu de tout envoyer d’un coup.
  • Gère la pagination et le scroll infini de façon progressive, comme un vrai visiteur.

La clé est de rester discret. Plus ton comportement ressemble à celui d’un humain, moins tu risques d’être coupé.

FAQ

Peux-tu utiliser BeautifulSoup pour scraper un site web avec AJAX ?

Pas directement. BeautifulSoup est une bibliothèque de parsing statique : elle lit uniquement le HTML chargé au départ. Comme AJAX injecte le contenu via JavaScript, tu dois la compléter avec un outil capable d’exécuter ce JavaScript, comme Selenium ou Playwright. Le navigateur headless récupère le HTML rendu, puis tu passes ce contenu à BeautifulSoup pour le parsing.

Autre option : intercepter directement les requêtes AJAX et récupérer la réponse JSON, souvent plus simple à traiter que le HTML.

Comment gérer les erreurs d’authentification ou les en-têtes de session sur un site AJAX ?

Un site protégé peut renvoyer une erreur 401 (non autorisé) ou 403 (interdit) quand tes requêtes n’embarquent pas les bons cookies ou en-têtes HTTP. La solution : intercepter ces informations pendant la navigation initiale, puis les réutiliser dans tes requêtes AJAX simulées. Beaucoup de sites exigent aussi un token CSRF ou un en-tête X-Requested-With, sans lequel le serveur refuse la requête. C’est justement pour ça qu’une simple requête requests échoue là où le navigateur passe.

Comment scraper un site avec un infinite scroll ou un bouton “Charger plus” ?

Le chargement infini est une forme de chargement AJAX. Pour l’automatiser, tu as deux approches :

  • Identifier la requête AJAX qui charge le contenu supplémentaire, puis la reproduire directement (souvent une URL avec un paramètre de pagination).
  • Ou simuler des clics sur le bouton “Charger plus” via un navigateur headless comme Selenium ou Puppeteer, jusqu’à récupérer toutes les données.

Existe-t-il des extensions Chrome pour le scraping AJAX ?

Oui. Plusieurs extensions Chrome facilitent le scraping AJAX pour des besoins simples, sans écrire une ligne de code. Les plus connues :

  • Web Scraper
  • Data Miner
  • Instant Data Scraper

Extension Chrome Instant Data Scraper affichant les données extraites d'une page web utilisant AJAX.
Instant Data Scraper, une extension Chrome pour collecter des données de pages web sans coder. ©Christina pour Alucare.fr

Quelle différence entre un “wait” explicite et implicite avec Selenium ou Playwright ?

  • Un wait implicite est une attente globale, appliquée à tous les éléments. Ton script patiente un certain délai avant de lever une erreur si un élément n’apparaît pas.
  • Un wait explicite est une attente conditionnelle, ciblée sur un élément précis. Il attend seulement jusqu’à ce qu’une condition soit remplie.

En pratique, le wait explicite est préférable : il évite les délais inutiles et réduit les erreurs quand le contenu AJAX met du temps à se charger.

En bref, scraper avec AJAX demande un peu plus d’astuce, mais avec les bonnes méthodes, rien ne vous échappe. Et toi ? Quelle méthode utilise-tu pour scraper les sites AJAX ? Partage tes astuces en commentaire.

👍Ton opinion
L'article est informatif
L'article est objectif
L'article répond à ma question
Le contenu est à jour
🔍 Vous avez trouvé des erreurs ? Dites-nous où !

Vous avez trouvé cela utile ? Partagez-le avec un ami !


Alucare est un média indépendant et gratuit. Soutenez-nous en nous ajoutant à vos favoris Google News :

Publiez un commentaire sur le forum de discussion