Scraper un site dynamique

Les sites web dynamiques chargent leur contenu via JavaScript après le chargement initial de la page. Ce guide montre comment collecter des données à partir de ces sites en utilisant l'endpoint browser de FourA.

Le problème

Lorsque vous envoyez une request HTTP standard à un site web riche en JavaScript, vous obtenez la structure HTML mais pas le contenu réel. Les données dont vous avez besoin (listes de produits, prix, résultats de recherche) sont chargées par JavaScript après le rendu de la page dans un navigateur.

C'est de plus en plus fréquent avec les frameworks modernes comme React, Vue, Angular et Next.js.

La solution : Browser requests

L'endpoint browser de FourA (POST /api/browser/) ouvre votre URL dans une instance de navigateur Chrome qui :

  1. Charge la page
  2. Exécute tout le JavaScript
  3. Attend le rendu du contenu
  4. Renvoie le HTML entièrement rendu

Étape 1 : Identifier ce dont vous avez besoin

Avant d'envoyer la request, visitez la page cible dans votre navigateur et utilisez les DevTools (F12) pour trouver un texte ou un élément qui confirme que le contenu est chargé. Par exemple :

  • Un nom de produit qui apparaît après le rendu JS
  • Une classe CSS comme product-grid dans le HTML rendu
  • Une chaîne de texte comme "results" qui n'apparaît que lorsque les données sont chargées

Étape 2 : Envoyer une Browser request

curl -X POST https://eu.api.foura.ai/api/browser/ \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/products",
    "timeout_ms": 15000,
    "checkText": "product-grid"
  }'

L'option checkText indique à FourA de vérifier que la chaîne "product-grid" apparaît dans la page rendue. Si elle n'apparaît pas avant le timeout, la request échoue, vous indiquant que le contenu n'a pas été chargé.

Étape 3 : Parser le HTML

La response contient le HTML entièrement rendu dans le champ body. Parsez-le avec votre bibliothèque préférée :

Python (BeautifulSoup)

import requests
from bs4 import BeautifulSoup

resp = requests.post("https://eu.api.foura.ai/api/browser/", headers={
    "X-API-Key": "YOUR_API_KEY",
    "Content-Type": "application/json"
}, json={
    "url": "https://example.com/products",
    "timeout_ms": 15000,
    "checkText": "product-grid"
})

html = resp.json()["body"]
soup = BeautifulSoup(html, "html.parser")

for product in soup.select(".product-card"):
    name = product.select_one(".product-name").text.strip()
    price = product.select_one(".product-price").text.strip()
    print(f"{name}: {price}")

Node.js (cheerio)

import * as cheerio from 'cheerio';

const resp = await fetch('https://eu.api.foura.ai/api/browser/', {
  method: 'POST',
  headers: { 'X-API-Key': 'YOUR_API_KEY', 'Content-Type': 'application/json' },
  body: JSON.stringify({
    url: 'https://example.com/products',
    timeout_ms: 15000,
    checkText: 'product-grid'
  })
});

const { body: html } = await resp.json();
const $ = cheerio.load(html);

$('.product-card').each((i, el) => {
  console.log($(el).find('.product-name').text(), $(el).find('.product-price').text());
});

Dépannage

Vous obtenez toujours un contenu vide ?

  • Vérifiez que la page utilise réellement le rendu JavaScript (comparez « Code source de la page » et les DevTools)
  • Augmentez timeout_ms : certaines pages se chargent lentement
  • Vérifiez si la page nécessite une authentification ou des cookies (utilisez le paramètre cookies)

Vous obtenez une page CAPTCHA ?

  • Pour les requests uniques/HTTP, passez à l'endpoint proxy (POST /api/proxy/) pour une rotation automatique des IP.
  • Pour ajouter la rotation de proxy aux browser requests, utilisez le paramètre proxy de l'endpoint browser au lieu d'envelopper la requête dans l'endpoint proxy. L'endpoint proxy n'enveloppe que les requests uniques/HTTP, pas les browser requests.
curl -X POST "https://eu.api.foura.ai/api/browser/" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com", "proxy": "http://proxy-url:port"}'

Étapes suivantes

Mis à jour : 31 mai 2026