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 :
- Charge la page
- Exécute tout le JavaScript
- Attend que le contenu soit rendu
- 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-griddans 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
proxyde 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
- Choisir le bon endpoint: Quand utiliser browser ou single
- Surveiller les prix des concurrents: Tutoriel complet de suivi des prix
- Protection anti-bot: Gérer les sites protégés
- Réutiliser un proxy entre les requêtes: Épingler une sortie sur l'ensemble d'un workflow