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 :
- Charge la page
- Exécute tout le JavaScript
- Attend le rendu du contenu
- 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-griddans 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
proxyde 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
- Choisir le bon endpoint : Quand utiliser browser vs single
- Surveiller les prix des concurrents : Tutoriel complet de suivi des prix
- Protection anti-bot : Gérer les sites protégés