Dynamische Website scrapen
Dynamische Websites laden Inhalte mittels JavaScript nach dem anfänglichen Laden der Seite. Diese Anleitung zeigt, wie du Daten von diesen Seiten über den Browser-Endpoint von FourA sammelst.
Das Problem
Wenn du einen Standard-HTTP-Request an eine JavaScript-lastige Website sendest, erhältst du das HTML-Gerüst, aber nicht den eigentlichen Inhalt. Die benötigten Daten (Produktlisten, Preise, Suchergebnisse) werden von JavaScript geladen, nachdem die Seite im Browser gerendert wurde.
Dies ist bei modernen Frameworks wie React, Vue, Angular und Next.js zunehmend üblich.
Die Lösung: Browser-Requests
Der Browser-Endpoint von FourA (POST /api/browser/) öffnet deine URL in einer Chrome-Browser-Instanz, die:
- Die Seite lädt
- Das gesamte JavaScript ausführt
- Darauf wartet, dass der Inhalt gerendert wird
- Das vollständig gerenderte HTML zurückgibt
Schritt 1: Identifiziere, was du brauchst
Bevor du den Request stellst, besuche die Zielseite im Browser und nutze die DevTools (F12), um ein Textstück oder Element zu finden, das bestätigt, dass der Inhalt geladen wurde. Zum Beispiel:
- Ein Produktname, der nach dem JS-Rendern erscheint
- Eine CSS-Klasse wie
product-gridim gerenderten HTML - Ein Text-String wie "results", der nur erscheint, wenn Daten geladen werden
Schritt 2: Sende einen 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"
}'
Die Option checkText weist FourA an, zu prüfen, ob der String "product-grid" auf der gerenderten Seite erscheint. Erscheint er nicht vor dem Timeout, schlägt der Request fehl, sodass du weißt, dass der Inhalt nicht geladen wurde.
Schritt 3: HTML parsen
Die Response enthält das vollständig gerenderte HTML im Feld body. Parse es mit deiner bevorzugten Bibliothek:
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());
});
Fehlerbehebung
Erhältst du immer noch leere Inhalte?
- Überprüfe, ob die Seite tatsächlich JavaScript-Rendering verwendet (vergleiche Seitenquelltext mit DevTools)
- Erhöhe
timeout_ms: Einige Seiten laden langsam - Prüfe, ob die Seite Authentifizierung oder Cookies erfordert (verwende den Parameter
cookies)
Erhältst du eine CAPTCHA-Seite?
- Wechsle bei einzelnen HTTP-Requests zum Proxy-Endpoint (
POST /api/proxy/) für automatische IP-Rotation. - Um einen Browser-Request über einen Proxy weiterzuleiten, übergib den Parameter
proxydes Browser-Endpoints. Der Proxy-Endpoint verarbeitet nur einzelne HTTP-Requests, keine Browser-Requests.
Der Parameter proxy übernimmt die opake Proxy-ID, die eine frühere Response zurückgegeben hat, niemals eine eigene Proxy-Adresse. Führe zuerst einen Aufruf von POST /api/proxy/ (oder POST /api/auto/) aus, lies das zurückgegebene Feld proxy und pinne es dann:
# 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}'
Das Senden einer Adresse anstelle einer ID gibt 400 Invalid proxy format zurück. Das vollständige Muster findest du unter Proxy über Requests hinweg wiederverwenden.
Nächste Schritte
- Den richtigen Endpoint wählen: Wann Browser oder Single zu nutzen ist
- Konkurrenzpreise überwachen: Vollständiges Tutorial zum Price Tracking
- Anti-Bot Protection: Geschützte Seiten handhaben
- Proxy über Requests hinweg wiederverwenden: Einen Exit-Node für einen gesamten Workflow festpinnen