Paginierung und dynamische Inhalte verarbeiten
Links zur nächsten Seite verfolgen und Playwright für JavaScript-gerenderte Seiten verwenden.
Paginierung und dynamische Inhalte verarbeiten ist eine kostenlose AI Agents-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des AI Agents-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der AI Agents-Kurs umfasst insgesamt 4 Lektionen.
Das Problem der Paginierung
Die meisten echten Webseiten liefern nicht alle Daten auf einer einzigen Seite. Ergebnisse werden auf mehrere Seiten verteilt, um die Auslastung zu verringern. Ein Agent muss die Paginierung erkennen und ihr folgen, um vollständige Datensätze zu erfassen.
Es gibt zwei gängige Paginierungsmuster: Links zur nächsten Seite und URL-Muster mit Seitenzahlen.
Links zur nächsten Seite erkennen
Viele Websites enthalten eine Schaltfläche oder einen Pfeil-Link mit der Beschriftung „Weiter“. Suchen Sie das Anchor-Tag mit rel='next' oder mit einem Text wie „Next“, extrahieren Sie dessen href und folgen Sie dem Link in einer Schleife, bis kein solcher Link mehr vorhanden ist.
from bs4 import BeautifulSoup
import httpx
def scrape_all_pages(start_url: str) -> list:
results = []
url = start_url
while url:
response = httpx.get(url, timeout=10.0)
soup = BeautifulSoup(response.text, 'html.parser')
# Collect data from this page
for item in soup.select('.result-item'):
results.append(item.text.strip())
# Find the next page link
next_link = soup.find('a', rel='next') or soup.find('a', string='Next')
url = next_link.get('href') if next_link else None
return resultsURL-Muster mit Seitenzahlen
Viele APIs und Websites verwenden vorhersehbare URL-Muster: /results?page=1, /results?page=2 usw. Ein Agent kann diese direkt durchlaufen, ohne das DOM nach einem Link zur nächsten Seite zu durchsuchen.
import httpx
def scrape_paginated_api(base_url: str, max_pages: int = 10) -> list:
all_items = []
for page in range(1, max_pages + 1):
response = httpx.get(
base_url,
params={'page': page, 'per_page': 50},
timeout=10.0
)
response.raise_for_status()
data = response.json()
items = data.get('results', [])
if not items:
break # No more data
all_items.extend(items)
print(f'Page {page}: fetched {len(items)} items')
return all_itemsCursor-basierte Paginierung
Moderne APIs wie GitHub, Slack und Twitter verwenden eine cursorbasierte Paginierung. Jede Antwort enthält ein Cursor-Token für die nächste Seite. Übergeben Sie den Cursor in der nächsten Anfrage, bis er fehlt oder null ist.
import httpx
def fetch_with_cursor(url: str, headers: dict) -> list:
all_data = []
cursor = None
while True:
params = {'cursor': cursor} if cursor else {}
response = httpx.get(url, headers=headers, params=params, timeout=10.0)
response.raise_for_status()
data = response.json()
all_data.extend(data.get('items', []))
cursor = data.get('next_cursor') # None when done
if not cursor:
break
return all_dataStatische vs. dynamische Inhalte
Manche Seiten laden Inhalte über JavaScript, nachdem das anfängliche HTML ausgeliefert wurde. Ein normaler HTTP-Client erhält nur das leere Grundgerüst – die eigentlichen Daten werden vom JS im Browser eingefügt.
Für solche Seiten führen Tools wie Playwright eine echte Browser-Engine aus und warten, bis JavaScript ausgeführt wurde, bevor sie Inhalte extrahieren.
Playwright installieren und importieren
Installieren Sie Playwright mit pip install playwright und führen Sie anschließend playwright install chromium aus, um den Browser herunterzuladen. Verwenden Sie async_playwright() für asynchrone Agent-Workflows.
# Installation (run in terminal):
# pip install playwright
# playwright install chromium
from playwright.async_api import async_playwright
import asyncio
async def fetch_dynamic(url: str) -> str:
async with async_playwright() as p:
browser = await p.chromium.launch(headless=True)
page = await browser.new_page()
await page.goto(url)
html = await page.content() # Full rendered HTML
await browser.close()
return html
# html = asyncio.run(fetch_dynamic('https://example.com'))Auf das Laden dynamischer Inhalte warten
JavaScript-Seiten laden Daten häufig asynchron. Weisen Sie Playwright an, zu warten, bis ein bestimmtes Element erscheint, bevor Sie Inhalte extrahieren. So stellen Sie sicher, dass die benötigten Daten tatsächlich im DOM vorhanden sind.
from playwright.async_api import async_playwright
async def scrape_dynamic_table(url: str) -> list:
async with async_playwright() as p:
browser = await p.chromium.launch(headless=True)
page = await browser.new_page()
await page.goto(url)
# Wait for the table to appear in the DOM
await page.wait_for_selector('table.results', timeout=10000)
html = await page.content()
await browser.close()
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
return [td.text for td in soup.select('table.results td')]Mit Seiten interagieren
Playwright kann Benutzerinteraktionen simulieren: Klicks, das Ausfüllen von Formularen, Scrollen und Tastatureingaben. Dadurch kann ein Agent Login-Abläufe, Dropdown-Menüs oder Seiten mit unendlichem Scrollen durchlaufen.
from playwright.async_api import async_playwright
async def click_load_more(url: str) -> str:
async with async_playwright() as p:
browser = await p.chromium.launch(headless=True)
page = await browser.new_page()
await page.goto(url)
# Click the 'Load More' button
load_more = page.locator('button:text("Load More")')
if await load_more.count() > 0:
await load_more.click()
await page.wait_for_timeout(2000) # wait 2s for content
html = await page.content()
await browser.close()
return htmlMit unendlichem Scrollen umgehen
Manche Websites laden weitere Inhalte, während Sie nach unten scrollen. Playwright kann das Scrollen simulieren, um dieses Nachladen auszulösen. Scrollen Sie wiederholt und prüfen Sie jedes Mal, ob neue Inhalte erschienen sind.
from playwright.async_api import async_playwright
async def scrape_infinite_scroll(url: str, scroll_count: int = 5) -> str:
async with async_playwright() as p:
browser = await p.chromium.launch(headless=True)
page = await browser.new_page()
await page.goto(url)
for _ in range(scroll_count):
await page.evaluate('window.scrollTo(0, document.body.scrollHeight)')
await page.wait_for_timeout(1500) # wait for new content
html = await page.content()
await browser.close()
return htmlPlaywright mit BeautifulSoup kombinieren
Nachdem Playwright die Seite gerendert hat und das vollständige HTML zurückgibt, übergeben Sie es zur einfachen Extraktion an BeautifulSoup. So kombinieren Sie die Stärken beider Bibliotheken.
from playwright.async_api import async_playwright
from bs4 import BeautifulSoup
async def extract_js_rendered_data(url: str) -> list:
async with async_playwright() as p:
browser = await p.chromium.launch(headless=True)
page = await browser.new_page()
await page.goto(url)
await page.wait_for_selector('.product-card')
html = await page.content()
await browser.close()
soup = BeautifulSoup(html, 'html.parser')
products = []
for card in soup.select('.product-card'):
products.append({
'name': card.select_one('.name').text.strip(),
'price': card.select_one('.price').text.strip()
})
return productsDas richtige Tool auswählen
Nicht jede Seite benötigt Playwright. Verwenden Sie den einfachsten funktionierenden Ansatz:
- Statisches HTML: httpx + BeautifulSoup (schnell, kein Browser-Overhead)
- JSON-API mit Paginierung: httpx mit Seiten- oder Cursor-Parametern
- Von JS gerenderte Inhalte: asynchrones Playwright (langsamer, aber leistungsfähiger)
Beginnen Sie immer mit dem statischen Ansatz und greifen Sie nur dann auf Playwright zurück, wenn es erforderlich ist.
Wissenscheck: Paginierung und dynamische Inhalte
Testen Sie Ihr Verständnis der Paginierung und des Umgangs mit dynamischen Inhalten.
Zusammenfassung: Paginierung und dynamische Inhalte
Ihre Agenten können jetzt das gesamte Spektrum an Webinhalten verarbeiten:
- Folgen Sie Links zur nächsten Seite oder durchlaufen Sie URL-Parameter für Seitenzahlen
- Verwenden Sie Cursor-Token für die Paginierung moderner APIs
- Verwenden Sie
async_playwright()für JavaScript-gerenderte Seiten - Warten Sie mit
page.wait_for_selector()auf Elemente - Kombinieren Sie Playwright mit BeautifulSoup für eine einfache Extraktion
Beginnen Sie immer mit dem einfachsten Ansatz und wechseln Sie nur dann zu Playwright, wenn der statische Ansatz nicht ausreicht.
Häufig gestellte Fragen
Ist die Lektion „Paginierung und dynamische Inhalte verarbeiten“ kostenlos?
Ja — der vollständige Text von „Paginierung und dynamische Inhalte verarbeiten“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des AI Agents-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der AI Agents-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Paginierung und dynamische Inhalte verarbeiten“?
Links zur nächsten Seite verfolgen und Playwright für JavaScript-gerenderte Seiten verwenden. Du übst AI Agents mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um AI Agents zu starten?
Keine Vorkenntnisse erforderlich. AI Agents auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „Paginierung und dynamische Inhalte verarbeiten“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser AI Agents-Lektion Code schreiben und ausführen?
Ja. Jede AI Agents-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- HTTP-Clients für Agenten: httpx und requests
- HTML mit BeautifulSoup parsen
- Paginierung und dynamische Inhalte verarbeiten
- Rücksichtsvolle Scraping-Praktiken