Scraper un site dynamique

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

Le problème

Lorsque vous envoyez une requête HTTP standard à un site web utilisant intensivement 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.

Cela est de plus en plus courant avec les frameworks modernes comme React, Vue, Angular et Next.js.

La solution : Requêtes de navigateur

Le endpoint de navigateur 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 que le contenu soit rendu
  4. Retourne le HTML entièrement rendu

Étape 1 : Identifiez ce dont vous avez besoin

Avant de faire la requête, visitez la page cible dans votre navigateur et utilisez les DevTools (F12) pour trouver un élément ou un texte 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 se chargent

Étape 2 : Envoyez une requête de navigateur

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 informant que le contenu n'a pas été chargé.

Étape 3 : Analyser le HTML

La response contient le HTML entièrement rendu dans le champ body. Analysez-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 "Afficher le code source" 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 avec un CAPTCHA ?

  • Pour les requêtes simples/HTTP, passez à l'endpoint proxy (POST /api/proxy/) pour une rotation automatique des IP.
  • Pour acheminer une requête de navigateur via un proxy, transmettez le paramètre proxy de l'endpoint du navigateur. L'endpoint proxy enveloppe uniquement les requêtes simples/HTTP, et non les requêtes de navigateur.

Le paramètre proxy prend l'ID de proxy opaque renvoyé par une réponse précédente, et jamais votre propre adresse de proxy. Exécutez d'abord un appel POST /api/proxy/ (ou POST /api/auto/), lisez le champ proxy qu'il renvoie, puis épinglez-le :

# Step 1: let FourA find a working exit. The response carries "proxy": "A1B2C3".
curl -X POST "https://eu.api.foura.ai/api/proxy/" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"maxTries": 5, "request": {"method": "GET", "url": "https://example.com/products"}}'

# Step 2: render through that same exit.
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", "proxy": "A1B2C3", "timeout_ms": 20000}'

L'envoi d'une adresse au lieu d'un ID renvoie 400 Invalid proxy format. Le modèle complet se trouve dans Réutiliser un proxy entre les requêtes.

Étapes suivantes

Mis à jour : 12 août 2026