Eine einzelne Webseite zu lesen und eine kurze Zusammenfassung zu schreiben ist kein Problem. Das für ein paar Hundert Seiten jeden Morgen zu tun ist eine andere Aufgabe, und genau die Art Arbeit, für die ein Sprachmodell gut geeignet ist. Der schwierige Teil war nie das Zusammenfassen. Es ist, sauberen, lesbaren Text von Seiten zu bekommen, die sich wehren, und dann einem Modell mehr Text zuzuführen, als sein Kontextfenster fassen kann, ohne den roten Faden zu verlieren.
Dieser Leitfaden behandelt beide Hälften von Anfang bis Ende. Sie sammeln Seiten mit der Crawlbase Crawling API als sauberes Markdown, fassen sie dann mit einem LLM zusammen, und wenn eine Seite zu lang für einen einzigen Aufruf ist, unterteilen Sie sie in Chunks und führen eine Map-Reduce-Zusammenfassung durch, damit nichts verloren geht. Alles hier ist lauffähiges Python, auf öffentliche Webinhalte beschränkt. Am Ende haben Sie eine kleine Pipeline, die eine Liste von URLs in kurze, konsistente Zusammenfassungen verwandelt, die Sie speichern, durchsuchen oder in einen Bericht einfügen können. Das ist der Kern, wie man Webdaten mit Crawlbase und AI zusammenfasst.
Warum Webdaten mit Crawlbase und AI zusammenfassen
Eine einzelne Seitenansicht sagt Ihnen, was ein Dokument gerade sagt. Der Wert zeigt sich, wenn Sie es im großen Maßstab tun: Verfolgen, was eine Reihe von Wettbewerberseiten im Laufe der Zeit sagt, einen Feed von Artikeln in einen täglichen Digest verdichten oder einen Stapel von Produkt- und Rezensionsseiten in ein paar Zeilen umwandeln, die ein Mensch tatsächlich lesen wird. Ein LLM ist schnell und konsistent, wendet dieselben Kriterien auf jedes Dokument an und wird auf Seite zweihundert nicht müde.
Das Modell ist jedoch nur so gut wie der Text, den Sie ihm übergeben, und genau da scheitern die meisten "AI-Summarizer"-Projekte still. Moderne Seiten sind JavaScript-lastig, in Navigation, Werbung, Cookie-Banner und Boilerplate eingewickelt, und viele blockieren automatisierten Traffic vollständig. Rohe HTML in ein Modell zu leiten bedeutet, Token für das Zusammenfassen von Markup und Menüs statt Inhalten zu verschwenden. Die Lösung ist, Sammlung von Zusammenfassung zu trennen: Crawlbase das Rendering, Entsperren und die saubere Extraktion überlassen und das Modell das tun lassen, was es gut kann. Einen tieferen Blick auf diesen Extraktionsschritt bietet wie AI-Datenextraktion funktioniert.
Wie die Pipeline zusammenpasst
Es gibt zwei Phasen, und sie getrennt zu halten macht das Ganze wartbar.
- Sammeln. Die Crawling API ruft jede URL hinter einer vertrauenswürdigen IP ab, rendert JavaScript bei Bedarf und gibt sauberes Markdown statt rohem HTML zurück. Das bedeutet, der Text, den Sie zusammenfassen, ist bereits von Navigation, Skripten und Styling befreit.
- Zusammenfassen. Ein LLM liest das Markdown und gibt eine kurze Zusammenfassung zurück. Für Seiten, die in das Kontextfenster des Modells passen, ist das ein Aufruf. Für lange Seiten teilen Sie den Text in Chunks auf, fassen jeden zusammen und dann fassen Sie die Zusammenfassungen zusammen. Dieses letzte Muster ist Map-Reduce.
Crawlbase nach Markdown statt HTML zu fragen klingt wie eine Kleinigkeit, ist aber wichtiger als es klingt. Markdown behält Überschriften, Listen und Struktur bei, während der Lärm entfällt, sodass das Modell sein Kontextbudget für Bedeutung ausgibt. Mehr zu dieser Wahl unter LLM-bereites Markdown-Web-Scraping.
Die Crawling API kann eine Seite als Markdown zurückgeben, wenn Sie format=markdown übergeben (oder die Markdown-Option des Scrapers). Bevorzugen Sie das immer gegenüber rohem HTML bei der Zusammenfassung. Rohes HTML verbrennt Token mit Tags und Inline-Stilen, die das Modell nicht benötigt, und das zusätzliche Rauschen schadet der Zusammenfassungsqualität messbar. Markdown bewahrt die Struktur, die dem Modell hilft, und lässt den Rest weg.
Das Projekt einrichten
Sie benötigen Python 3 und zwei Konten: ein kostenloses Crawlbase-Konto für das Token und ein OpenAI-Konto für das Modell. Erstellen Sie zuerst das Crawlbase-Konto; bei der Anmeldung erhalten Sie bis zu 20.000 kostenlose API-Anfragen: 1.000 bei der Anmeldung und mehr, während Sie die Onboarding-Schritte abschließen, was mehr als genug ist, um diesem Leitfaden zu folgen. Kopieren Sie Ihr Normal-Anfrage-Token von der Kontodokumentationsseite und holen Sie sich auch einen API-Schlüssel von OpenAI.
Dann erstellen Sie einen Projektordner und installieren die Bibliotheken.
python --version mkdir web-summarizer && cd web-summarizer python -m venv .venv && source .venv/bin/activate pip install requests openai tiktoken
Drei Abhängigkeiten erledigen die Arbeit: requests ruft die Crawling API auf, openai ist der Modell-Client und tiktoken zählt Token, damit Sie wissen, wenn eine Seite für einen einzigen Aufruf zu groß ist. Setzen Sie Ihre zwei Geheimnisse als Umgebungsvariablen, damit sie außerhalb des Codes bleiben.
export CRAWLBASE_TOKEN="your_crawlbase_normal_token" export OPENAI_API_KEY="your_openai_api_key"
Schritt 1: Eine Seite als sauberes Markdown abrufen
Beginnen Sie mit dem Sammeln. Sie senden der Crawling API die Ziel-URL und eine Option format=markdown, und sie gibt die Seite bereits als Markdown zurück. Die folgende Funktion kapselt diesen Aufruf, prüft den Upstream-Status und gibt nur den Markdown-Body zurück, damit der Rest der Pipeline nie rohes HTML sieht.
import os import requests CRAWLBASE_TOKEN = os.environ["CRAWLBASE_TOKEN"] API_ENDPOINT = "https://api.crawlbase.com/" def fetch_markdown(url: str) -> str: params = { "token": CRAWLBASE_TOKEN, "url": url, "format": "markdown", } response = requests.get(API_ENDPOINT, params=params, timeout=90) response.raise_for_status() return response.text if __name__ == "__main__": markdown = fetch_markdown("https://www.crawlbase.com/blog/") print(markdown[:800])
Führen Sie es aus und Sie erhalten den Artikeltext als Markdown, Überschriften und Listen intakt, mit dem Seiten-Chrome bereits entfernt. Wenn Ihr Ziel Inhalte mit JavaScript rendert, funktioniert derselbe Aufruf mit dem JavaScript-Token statt dem Normal-Token, sodass die Seite in einem echten Browser gerendert wird, bevor sie konvertiert wird. Tauschen Sie das Token aus und Sie fassen Single-Page-App-Inhalte ohne weitere Code-Änderungen zusammen.
Sauberer Text rein, gute Zusammenfassungen raus. Die Crawling API rendert JavaScript, rotiert durch Residential-IPs, um Sperren zu umgehen, und gibt jede Seite als zusammenfassungsbereites Markdown in einem einzigen Aufruf zurück, damit das Modell nie Navigationsleisten oder Cookie-Banner sieht. Starten Sie im kostenlosen Tarif und richten Sie es auf eine beliebige öffentliche URL.
Schritt 2: Eine kurze Seite in einem Aufruf zusammenfassen
Wenn eine Seite problemlos in das Kontextfenster des Modells passt, ist das Zusammenfassen eine einzige Anfrage. Die folgende Funktion nimmt Markdown-Text und eine kurze Anweisung, sendet sie mit niedriger Temperatur für Konsistenz an das Modell und gibt den Zusammenfassungs-String zurück. Eine niedrige Temperatur ist hier wichtig: Sie möchten, dass dieselbe Eingabe stabile Ausgabe über Läufe hinweg produziert, nicht kreative Vielfalt.
from openai import OpenAI client = OpenAI() # reads OPENAI_API_KEY from the environment MODEL = "gpt-4o-mini" def summarize(text: str, instruction: str) -> str: prompt = f"{instruction}\n\n---\n\n{text}" response = client.chat.completions.create( model=MODEL, messages=[{"role": "user", "content": prompt}], temperature=0.2, ) return response.choices[0].message.content.strip() SUMMARY_PROMPT = ( "Summarize the following web page in 4-6 sentences. " "Lead with the main point, then the key supporting facts. " "Ignore navigation, ads, and boilerplate." ) if __name__ == "__main__": page = fetch_markdown("https://www.crawlbase.com/blog/") print(summarize(page, SUMMARY_PROMPT))
Das ist der gesamte Happy Path für einen normalen Artikel. Markdown abrufen, mit einer Anweisung senden, Ergebnis ausgeben. Das Modell erledigt die Spracharbeit; Crawlbase hat die Datenarbeit erledigt. Das einzige, was zwischen diesem und einer nicht passenden Seite steht, ist die Länge, was der nächste Schritt ist.
Schritt 3: Lange Seiten mit Chunking verarbeiten
Jedes Modell hat ein Kontextfenster, eine harte Grenze dafür, wie viel Text es in einem Aufruf lesen kann. Lange Artikel, Dokumentationsseiten und Forenthreads können darüber hinausgehen, und wenn das passiert, lehnt die API die Anfrage ab. Die Lösung ist, den Text in Chunks aufzuteilen, die jeweils passen, mit einer kleinen Überlappung, damit ein an einer Grenze halbierter Satz noch vollständig in einem der Chunks erscheint.
Verwenden Sie tiktoken, um Token statt Zeichen zu zählen, da das Limit in Token gemessen wird. Die folgende Funktion geht durch die Token-Liste und schneidet sie in Fenster fester Größe.
import tiktoken encoder = tiktoken.encoding_for_model("gpt-4o-mini") def chunk_text(text: str, max_tokens: int = 2000, overlap: int = 150): tokens = encoder.encode(text) chunks = [] start = 0 while start < len(tokens): end = start + max_tokens window = tokens[start:end] chunks.append(encoder.decode(window)) start = end - overlap return chunks
Jeder Chunk ist nun ein in sich geschlossenes Textstück, das klein genug ist, um eigenständig zusammengefasst zu werden. Ein max_tokens-Wert von 2.000 lässt komfortablen Raum für den Prompt und die Antwort in einem modernen Kontextfenster; verringern Sie ihn, wenn Sie ein kleineres Modell verwenden. Die Überlappung verhindert, dass Sie den Grenzsatz zwischen zwei Chunks verlieren. Mit sauberem Markdown von Crawlbase als Eingabe sind diese Chunks reiner Inhalt, was die Chunk-Anzahl niedrig und die Zusammenfassungen thematisch hält.
Schritt 4: Chunk-Zusammenfassungen mit Map-Reduce kombinieren
Chunking gibt Ihnen mehrere Teile; Map-Reduce verwandelt sie zurück in eine Antwort. Das Muster hat zwei Phasen. In der Map-Phase fassen Sie jeden Chunk unabhängig zusammen und erhalten eine Liste von Teilzusammenfassungen. In der Reduce-Phase konkatenieren Sie diese Teile und fassen sie zusammen zu einer einzigen endgültigen Zusammenfassung. Wenn die kombinierten Teile selbst zu lang sind, reduzieren Sie erneut und wiederholen, bis eine Zusammenfassung übrig bleibt.
MAP_PROMPT = ( "Summarize this section of a longer document in 3-4 sentences. " "Keep concrete facts, names, and numbers." ) REDUCE_PROMPT = ( "The following are summaries of consecutive sections of one document. " "Combine them into a single coherent summary of 5-7 sentences, " "removing repetition and keeping the overall narrative." ) def summarize_long(text: str) -> str: chunks = chunk_text(text) if len(chunks) == 1: return summarize(chunks[0], SUMMARY_PROMPT) partials = [summarize(c, MAP_PROMPT) for c in chunks] combined = "\n\n".join(partials) while len(encoder.encode(combined)) > 2000: partials = [summarize(c, MAP_PROMPT) for c in chunk_text(combined)] combined = "\n\n".join(partials) return summarize(combined, REDUCE_PROMPT)
Diese eine Funktion verarbeitet nun jede Länge. Eine kurze Seite nimmt einen Aufruf und gibt sofort zurück. Eine lange Seite wird gemappt, reduziert und bei Bedarf erneut reduziert, wobei die Schleife garantiert, dass die endgültige Eingabe immer passt. Die separaten Map- und Reduce-Prompts sind wichtig: Der Map-Prompt bittet um faktenreiche Teile, damit Details den ersten Durchgang überleben, und der Reduce-Prompt bittet um eine saubere Erzählung, damit die endgültige Zusammenfassung wie ein zusammenhängendes Stück und nicht wie eine zusammengenähte Liste klingt.
Schritt 5: Über viele URLs ausführen
Die zwei Phasen setzen sich nun zu einer kleinen Pipeline zusammen. Geben Sie ihr eine Liste von URLs, rufen Sie jede als Markdown ab, fassen Sie jede mit der längenerkennenden Funktion zusammen und sammeln Sie die Ergebnisse. Kapseln Sie jede URL in einem try/except, damit eine fehlerhafte Seite nicht den gesamten Batch versenkt, und Sie haben etwas, das Sie auf einen Feed richten können.
import json URLS = [ "https://www.crawlbase.com/blog/", "https://www.crawlbase.com/blog/ai-data-extraction-how-it-works/", ] def run_pipeline(urls): results = [] for url in urls: try: markdown = fetch_markdown(url) summary = summarize_long(markdown) results.append({"url": url, "summary": summary}) except Exception as error: print(f"Skipped {url}: {error}") return results if __name__ == "__main__": output = run_pipeline(URLS) print(json.dumps(output, indent=2))
Die Ausgabe ist ein JSON-Array aus url- und summary-Paaren, bereit zum Schreiben in eine Datei, in eine Datenbank übertragen oder in einen Digest gerendert zu werden. Ein gekürztes Beispiel, was zurückkommt:
[ { "url": "https://www.crawlbase.com/blog/", "summary": "The Crawlbase blog covers web scraping, proxies, and data extraction, with hands-on tutorials for engineers. Recent posts focus on rendering JavaScript sites, avoiding blocks, and turning pages into clean structured data." }, { "url": "https://www.crawlbase.com/blog/ai-data-extraction-how-it-works/", "summary": "The article explains how AI models extract structured fields from messy web pages, contrasting rule-based scrapers with model-driven extraction that adapts to layout changes." } ]
Praktische Tipps für den Produktionseinsatz
Abgerufenes Markdown cachen
Sammlung und Zusammenfassung scheitern aus unterschiedlichen Gründen, also koppeln Sie sie nicht. Speichern Sie das Markdown jeder Seite sofort nach dem Abruf auf der Festplatte, indexiert durch URL. Wenn Sie mit einem anderen Prompt oder Modell erneut ausführen möchten, fassen Sie aus dem Cache zusammen statt erneut zu crawlen, was schneller ist und keine API-Credits für Seiten ausgibt, die Sie bereits haben.
Ihre Anfragen pacing und wiederholen
Beide APIs können eine enge Schleife rate-limitieren. Fügen Sie eine kurze Pause zwischen URLs hinzu und kapseln Sie den Modell-Aufruf in einem Retry mit Backoff, damit ein vorübergehender Fehler keine Seite verliert. Die Crawling API übernimmt IP-Rotation und Entsperren für Sie, daher ist das hier benötigte Pacing gering, aber es lohnt sich trotzdem, ein höflicher Client zu sein.
Ihre Prompts und das Modell fixieren
Wiederverwendbare, versionskontrollierte Prompts sind das, was Zusammenfassungen über Läufe hinweg konsistent macht. Halten Sie die Map- und Reduce-Prompts an einem Ort, fixieren Sie den Modellnamen und halten Sie die Temperatur niedrig. Wenn Sie eines davon ändern, behandeln Sie es als Änderung an Ihrer Ausgabe, weil es das ist.
Das Werkzeug an die Seite anpassen
Verwenden Sie das Normal-Token für statische Seiten und das JavaScript-Token für Single-Page-Apps, die Inhalte im Browser rendern. Wenn Sie feldweise Daten wie Preis, Titel und Bewertung statt Prosa möchten, greifen Sie auf die Crawling API zurück, um strukturiertes JSON zu erhalten, und fassen Sie dann das zusammen. Und wenn Sie das in einen Agenten oder einen MCP-basierten Workflow integrieren, stellt der Web MCP dasselbe Crawling und Extraktion Ihrem Modell als Tools bereit. Für einen vollständigen agentischen Aufbau geht einen AI-Datenpipeline mit LangChain und Crawlbase aufbauen weiter.
Wichtigste Erkenntnisse
- Sammlung von Zusammenfassung trennen. Crawlbase holt sauberen Text; das Modell erledigt die Spracharbeit. Die zwei Phasen zu trennen ist das, was die Pipeline wartbar macht.
-
Markdown, nicht HTML abrufen.
format=markdownübergeben, damit das Modell seinen Kontext für Inhalte ausgibt, nicht Navigationsleisten und Skripte. -
Token zählen, dann aufteilen.
tiktokenverwenden, um lange Seiten in überlappende Fenster aufzuteilen, die jeweils in das Kontextfenster passen. - Map-Reduce skaliert auf jede Länge. Jeden Chunk zusammenfassen, dann die Zusammenfassungen zusammenfassen und erneut reduzieren, bis eine übrig bleibt.
- Cachen und fixieren für den Produktionseinsatz. Abgerufenes Markdown speichern, Prompts versionieren, das Modell fixieren und die Temperatur niedrig halten für konsistente Ausgabe.
Häufig gestellte Fragen
Warum Markdown statt rohem HTML für die Zusammenfassung abrufen?
Rohes HTML ist voll von Tags, Skripten, Inline-Stilen, Navigation und Werbung, die keine Bedeutung für eine Zusammenfassung tragen, aber trotzdem Token kosten. Die Crawling API kann eine Seite als Markdown zurückgeben, was Überschriften, Listen und Fließtext beibehält, während der Lärm wegfällt. Das bedeutet, das Modell gibt seinen begrenzten Kontext für tatsächliche Inhalte aus, Zusammenfassungen werden sauberer und Sie zahlen für weniger Token pro Seite.
Was ist Map-Reduce-Zusammenfassung und wann brauche ich sie?
Map-Reduce ist ein zweiphasiges Muster für Text, der zu lang für einen einzigen Modell-Aufruf ist. In der Map-Phase fassen Sie jeden Chunk des Dokuments eigenständig zusammen; in der Reduce-Phase fassen Sie diese Teilzusammenfassungen zu einer einzigen endgültigen Antwort zusammen. Sie benötigen es, wenn eine Seite das Kontextfenster des Modells überschreitet. Kurze Seiten überspringen direkt zu einem einzigen Aufruf, weshalb das Beispiel zuerst die Chunk-Anzahl prüft.
Wie wähle ich eine Chunk-Größe?
Chunk-Größen in Token, nicht Zeichen, messen und Raum für den Prompt und die Antwort lassen. Ein 2.000-Token-Chunk funktioniert gut auf modernen Modellen mit großen Kontextfenstern; verringern Sie ihn für kleinere Modelle. Fügen Sie eine kleine Überlappung hinzu, etwa 100 bis 200 Token, damit ein an einer Chunk-Grenze geteilter Satz noch vollständig in einem der Chunks erscheint. Token mit tiktoken zählen, indem Sie dieselbe Kodierung wie Ihr Modell verwenden.
Kann ich JavaScript-gerenderte Seiten zusammenfassen?
Ja. Tauschen Sie das Normal-Token gegen das JavaScript-Token im Crawling-API-Aufruf aus. Es rendert die Seite in einem echten Browser, bevor es sie in Markdown konvertiert, sodass Single-Page-App-Inhalte vorhanden sind, wenn das Modell sie liest. Der Rest der Pipeline, das Chunking und das Map-Reduce, ändert sich überhaupt nicht.
Brauche ich ein kostenpflichtiges Crawlbase- oder OpenAI-Konto, um diesem Leitfaden zu folgen?
Nein. Crawlbase gibt Ihnen bis zu 20.000 kostenlose API-Anfragen: 1.000 bei der Anmeldung und mehr, während Sie die Onboarding-Schritte abschließen, was ausreicht, um dies vollständig zu testen. OpenAI-Nutzung wird pro Token abgerechnet, und ein kleines Modell wie gpt-4o-mini hält die Zusammenfassungskosten niedrig. Beides ist gut, um auf ihren kostenlosen oder kostengünstigen Tarifen zu starten, bevor Sie skalieren.
Kann ich ein anderes Modell oder einen anderen Anbieter verwenden?
Ja. Die Pipeline hängt nur von zwei Dingen des Modells ab: einem Chat-artigen Aufruf, der einen Prompt entgegennimmt und Text zurückgibt, und einem Token-Zähler für das Chunking. Tauschen Sie den Client in der Funktion summarize für einen beliebigen Anbieter aus, den Sie bevorzugen, und aktualisieren Sie die tiktoken-Kodierung, um das Modell abzugleichen. Die Sammlungsphase und die Map-Reduce-Logik bleiben exakt gleich.
Crawlen Sie jede Website im großen Maßstab, ohne gegen die Infrastruktur zu kämpfen.
Crawlbase übernimmt Proxys, Fingerprints und CAPTCHAs, damit Ihr Team Datenpipelines ausliefert, statt Crawl-Infrastruktur zu pflegen. 1.000 Anfragen kostenlos, keine Karte erforderlich.

