Scraping

Wie man ein Dataset mit Web Scraping aufbaut

Ein Praxisleitfaden zum Aufbau sauberer, vollständiger Web-Scraping-Datasets: Pipeline-Stufen, Frische, Deduplizierung, und warum Blocks und Geo-Lücken deine Daten still verzerren.

Chris Collins

Chris Collins

23. Juni 2026 · 11 Min. Lesezeit

Die meisten Leitfäden zum Aufbau eines Datasets per Web Scraping hören bei “schreib einen Scraper, speichere die Ergebnisse” auf. Das sind die einfachen 20%. Die schweren 80%, der Teil, der entscheidet, ob dein Dataset tatsächlich brauchbar ist, sind alles rund um den Fetch: sicherzustellen, dass du die richtigen Zeilen gesammelt hast, dass sie vollständig sind, dass sie aktuell sind, und dass die Lücken in deinen Daten zufällig statt systematisch sind.

Dieser letzte Punkt ruiniert Datasets im Stillen, und ihn schreibt fast niemand auf. Wenn ein Scrape bei 30% der Seiten fehlschlägt, verlierst du nicht zufällige 30% deiner Daten. Du verlierst bestimmte 30%, die schwerer erreichbare, stärker verteidigte, stärker geo-beschränkte Scheibe, und was übrig bleibt, ist eine verzerrte Stichprobe, die vollständig aussieht. Ein darauf trainiertes Modell, oder eine daraus getroffene Entscheidung, erbt diese Verzerrung, ohne dass jemand es merkt.

Das ist ein Praxisleitfaden zum Aufbau eines Web-Scraping-Datasets, das hält: die Pipeline-Stufen, die Qualitätsdimensionen, die zählen, und wo die Proxy-Schicht der Unterschied zwischen einem repräsentativen und einem verzerrten Dataset ist.

Was “ein gutes Dataset” wirklich bedeutet

Vor jedem Code: sei dir klar, worauf du optimierst. Ein aus Scraping aufgebautes Dataset wird an fünf Dingen gemessen:

Vollständigkeit. Hast du alles im Scope gesammelt, oder nur die Teile, die sich nicht gewehrt haben? Fehlende Zeilen sind schlecht; systematisch fehlende sind schlimmer.

Repräsentativität. Passt die Stichprobe zur echten Grundgesamtheit? Wenn du Produktpreise scrapest, aber dein Scraper bei den großen, trafficstarken Händlern geblockt wird und bei den kleinen durchsegelt, ist dein “Durchschnittspreis” in eine Richtung falsch, die du nicht sehen kannst.

Frische. Web-Daten verfallen. Ein Preis-Dataset von letztem Monat ist ein anderes Dataset als das von heute. Du musst wissen, wie veraltet jede Zeile ist, und einen Plan haben, sie zu aktualisieren.

Konsistenz. Jede Zeile sollte demselben Schema folgen, mit denselben Einheiten, Formaten und Encodings. Scraping zieht aus chaotischem HTML, also ist Normalisierung die halbe Arbeit.

Herkunft (Provenance). Für jede Zeile: woher sie kam (Quell-URL), wann du sie geholt hast, und von wo (Geo). Ohne Herkunft kannst du das Dataset später nicht debuggen, deduplizieren, aktualisieren oder verteidigen.

Behalte diese fünf im Kopf, denn jede Pipeline-Entscheidung unten dient einer davon.

Die Pipeline, Stufe für Stufe

Eine Scraping-zu-Dataset-Pipeline sind sechs Stufen. Behandle sie als eigenständige Schritte mit eigener Validierung, nicht als ein großes Skript.

1. Entdecken. Zähle die URLs im Scope auf, aus einer Sitemap, einem Such-/Listing-Crawl, einem API-Index oder einem bekannten ID-Bereich. Diese Stufe definiert deine beabsichtigte Grundgesamtheit. Schreib sie explizit auf; sie ist dein Maßstab für Vollständigkeit später.

2. Fetch. Hol jede URL ab. Hier passieren Blocks, Geo-Redirects, Rate-Limits und Timeouts, und hier entsteht die Dataset-Verzerrung. Mehr dazu unten, denn das ist die Stufe, die für die Qualität am meisten zählt.

3. Extrahieren. Parse die Antwort in strukturierte Felder. Sei defensiv: Layouts ändern sich, Felder verschwinden, und ein fragiler Selektor wird still zu Nulls über Tausende Zeilen.

4. Normalisieren. Wandle rohe extrahierte Werte in konsistente Typen und Einheiten um, Währungen in eine Denomination, Daten in ISO, Whitespace entfernt, Encodings repariert, Kategoriales auf ein kontrolliertes Vokabular gemappt.

5. Deduplizieren. Dieselbe Entität erscheint oft unter mehreren URLs (kanonisch + Varianten, paginierte Duplikate, neu gelistete Items). Dedupliziere auf einem stabilen Schlüssel, nicht auf der URL.

6. Speichern und aktualisieren. Persistiere mit voller Herkunft, dann entscheide eine Re-Crawl-Kadenz, damit das Dataset frisch bleibt, statt zu einem Einmal-Snapshot zu verfallen.

Die Stufe, die die Qualität entscheidet: der Fetch

Hier ist das Kernargument des ganzen Beitrags. Die Qualität deines Datasets ist an der Fetch-Stufe gedeckelt, weil ein geblockter Request nicht nur Daten verliert, sondern nicht-zufällige Daten.

Drei Mechanismen verwandeln Fetch-Fehler in Dataset-Verzerrung:

Block-Verzerrung. Anti-Bot-Systeme (Cloudflare, Akamai, DataDome) schützen die hochwertigen, trafficstarken Ziele am aggressivsten. Wenn dein Scraper von einer Datacenter-IP läuft und dort geblockt wird, verliert dein Dataset systematisch die wichtigsten Zeilen und behält die einfachen. Das Ergebnis kippt zu kleineren, weniger verteidigten Quellen, und es sieht vollständig aus, weil du trotzdem Tausende Zeilen bekommen hast. (Siehe warum Scraper geblockt werden für die Mechanik.)

Geo-Verzerrung. Viele Sites liefern je nach Standort des Besuchers anderen Content, andere Preise oder Verfügbarkeit, und redirecten oder lokalisieren still anhand der IP. Wenn alle deine Requests aus einer Region stammen, spiegelt jedes geo-variierende Feld in deinem Dataset diesen einen Beobachtungspunkt wider, nicht die globale Realität, die du erfasst zu haben glaubst. Scrape “globale Produktverfügbarkeit” aus einem Land, und du hast tatsächlich die Sicht eines Landes erfasst, falsch als global etikettiert.

Rate-Limit-Verzerrung. Wenn ein Ziel dich drosselt, ist die naive Reaktion, langsamer zu werden oder die langsam antwortenden Seiten aufzugeben, oft die schweren, datenreichen. Du übersamplest am Ende die schnellen, leichten Seiten.

Der Fix für alle drei ist derselbe: über einen Pool von IPs fetchen, die wie echte Nutzer aussehen, an den richtigen Orten, damit die Abdeckung vollständig und gleichmäßig ist, statt zu dem zu kippen, was leicht erreichbar war.

Warum die Proxy-Schicht eine Datenqualitäts-Entscheidung ist, nicht nur Klempnerei

Deshalb zählt ein Residential-Proxy-Netz speziell für den Dataset-Aufbau, über “nicht geblockt werden” hinaus:

Vollständige Abdeckung. Residential-IPs tragen das Vertrauensprofil echter Consumer-Verbindungen, also kommen sie bei den verteidigten Zielen durch, die eine Datacenter-IP nicht erreichen kann. Das schließt die Block-Verzerrungslücke, du sammelst die schweren Zeilen, nicht nur die einfachen.

Geo-Abdeckung mit Absicht. Mit Land-, Bundesland- und Stadt-Targeting kannst du jeden Markt gezielt sampeln und jede Zeile mit dem Beobachtungspunkt etikettieren, von dem sie kam. Statt eines zufälligen Blickwinkels bekommst du ein kontrolliertes Multi-Geo-Dataset, in dem Geo eine Spalte ist, kein verstecktes Confounding. Das ist der Unterschied zwischen “ich habe Preise gescrapet” und “ich habe Preise erfasst, wie sie aus 12 bestimmten Märkten zu sehen sind, pro Zeile festgehalten”.

Gleichmäßiges Sampling at Scale. Rotation durch einen großen Pool verteilt Requests, sodass keine einzelne IP Rate-Limits auslöst, was verhindert, dass du die schnellen Seiten übersamplest und die langsamen, datenschweren untersamplest.

Klar gesagt: die Proxy-Schicht ist, wo du entscheidest, ob dein Dataset eine repräsentative Stichprobe oder eine Convenience-Stichprobe ist. Für Dataset-Arbeit ist das kein Klempner-Detail, sondern eine Methodik-Entscheidung. (Für den breiteren Infra-Blick siehe Proxy-Infrastruktur für Machine Learning.)

Frische: ein Dataset ist ein Verb, kein Substantiv

Ein einmaliger Scrape ist ein Snapshot, und Snapshots verrotten. Entscheide vorab, ob du ein statisches Dataset baust (okay für eine Stichtags-Studie) oder ein lebendiges (nötig für Preise, Bestand, Listings, alles, was sich ändert).

Für lebendige Datasets:

  • Lege eine Re-Crawl-Kadenz fest, abgestimmt darauf, wie schnell sich die Daten ändern, stündlich für volatile Preise, wöchentlich für Katalog-Metadaten, monatlich für langsam bewegte Referenzdaten.
  • Mach inkrementelle Refreshes, keine vollen Re-Scrapes. Erkenne, was sich geändert hat (ETags, Last-Modified, Content-Hashes, Listing-Diffs) und hol nur das neu. Billiger, schneller und schonender fürs Ziel.
  • Stempel jede Zeile mit einem Fetch-Timestamp, damit Downstream-Konsumenten nach Aktualität filtern und du die Veralterung messen kannst.

Frische ist auch ein Abdeckungsproblem: wenn dein Refresh-Crawl jedes Mal bei denselben verteidigten Seiten geblockt wird, veralten diese Zeilen, während die einfachen aktuell bleiben, was mit der Zeit erneut Verzerrung einführt. Gleicher Fix.

Deduplizierung und Normalisierung, wo Datasets gewonnen oder verloren werden

Rohe gescrapete Daten sind schmutzig. Zwei Stufen säubern sie:

Normalisiere auf ein Schema. Entscheide zuerst das Zielschema, dann mappe jede Quelle hinein. Währungen auf eine Denomination, Daten auf ISO 8601, Zahlen aus “1.299 Einheiten”-Strings geparst, Text getrimmt und unicode-normalisiert, Kategoriales auf ein kontrolliertes Vokabular geschnappt. Inkonsistente Normalisierung ist der häufigste Grund, warum ein gescrapetes Dataset technisch vollständig, aber analytisch nutzlos ist.

Dedupliziere auf einem stabilen Schlüssel, nicht der URL. Dasselbe Produkt, dieselbe Person, derselbe Datensatz lebt routinemäßig unter mehreren URLs. Bau einen Dedupe-Schlüssel aus der stabilen Identität (SKU, ISBN, normalisierter Name + Ort, kanonische URL) und kollabiere Duplikate, behalte die frischeste oder vollständigste Version. Auf der rohen URL allein zu deduplizieren lässt dich mit aufgeblähten Zählungen und doppelt gewichteten Zeilen zurück, die jedes Aggregat still verzerren.

Mit Herkunft speichern

Für jede Zeile speichere mindestens:

  • Die Quell-URL, von der sie kam
  • Den Fetch-Timestamp (UTC)
  • Den Geo-Beobachtungspunkt, den der Request nutzte (Land/Stadt), falls Geo für die Daten zählt
  • Einen Content-Hash oder eine Version, um beim Re-Crawl Änderungen zu erkennen
  • Den rohen Payload (oder eine Referenz darauf), getrennt von den geparsten Feldern, damit du neu parsen kannst, ohne neu zu scrapen, wenn dein Extraktor besser wird

Herkunft fühlt sich wie Overhead an, bis zum ersten Mal, wenn jemand fragt “woher kommt diese Zahl” oder dein Extraktor einen Bug hat und du 500k Zeilen neu parsen musst, ohne das Netz zu treffen. Speichere sie ab Tag eins.

Das Dataset validieren, bevor du ihm traust

Bevor jemand auf dem Dataset aufbaut, fahre Abdeckungs- und Qualitätsprüfungen, so fängst du die Verzerrung ab, die die Fetch-Stufe einführen kann:

  • Abdeckungs-Audit. Vergleiche gesammelte Zeilen mit der beabsichtigten Grundgesamtheit aus der Entdecken-Stufe. Eine Abschlussrate von 92% ist okay; die Frage ist, ob die fehlenden 8% zufällig sind. Stichprobenprüfe die Fehler, clustern sie auf einer Quelle, einer Geo oder einem Site-Typ, hast du systematische Verzerrung zu beheben, nicht nur fehlende Daten.
  • Null-Raten-Prüfung pro Feld. Ein Feld, das plötzlich 40% null ist, bedeutet meist einen kaputten Selektor, keine fehlenden Daten.
  • Verteilungs-Plausibilitätsprüfungen. Passt die Preisverteilung, der Kategorien-Mix oder die Geo-Streuung zu dem, was du erwarten würdest? Eine Schieflage offenbart oft ein Sampling-Problem weiter oben.
  • Frische-Prüfung. Wie ist die Altersverteilung der Zeilen? Wenn ein Teil immer veraltet ist, wird dein Refresh-Crawl dort geblockt.

Diese Prüfungen sind billig und sie sind der Unterschied zwischen ein Dataset ausliefern und ein selbstbewusst-falsches ausliefern.

Eine Anmerkung zu verantwortungsvollem Vorgehen

Datasets aus dem Web aufzubauen kommt mit echten Pflichten. Sammle nur öffentliche Daten, halte robots.txt ein, wo sie tragend ist, respektiere Rate-Limits und beeinträchtige die Sites nicht, von denen du ziehst, halte dich von personenbezogenen Daten fern, außer du hast eine Rechtsgrundlage, und befolge die Bedingungen jedes Ziels. Ein Proxy ändert, von welcher IP ein Request kommt, nicht, ob du ihn stellen solltest. Unsere Acceptable Use Policy ist die maßgebliche Quelle dafür, was auf Shifter erlaubt ist, und ethische Datensammlung ist lesenswert, bevor du hochskalierst.

FAQ

Was ist der schwerste Teil beim Aufbau eines Datasets per Web Scraping? Nicht das Scrapen, die Abdeckung. Eine vollständige, unverzerrte Stichprobe zu bekommen ist weit schwerer als Seiten zu holen, weil fehlgeschlagene Requests nicht-zufällige Scheiben von Daten entfernen und das resultierende Dataset trotzdem vollständig aussieht. Die meisten Dataset-Qualitätsprobleme führen zurück zur Fetch-Stufe.

Wie verzerren Blocks ein gescrapetes Dataset? Anti-Bot-Systeme schützen hochwertige Ziele am aggressivsten, also verliert ein geblockter Scraper die wichtigen, gut verteidigten Zeilen und behält die einfachen. Das Dataset kippt zu weniger verteidigten Quellen, was jedes darauf gebaute Aggregat oder Modell korrumpiert.

Brauche ich Residential-Proxies, um ein Dataset zu bauen? Nur wenn deine Ziele Datacenter-IPs blocken oder Content nach Geografie variieren, was die meisten wertvollen Ziele tun. Für ungeschützte, geo-neutrale Quellen sind Datacenter-IPs okay. Für vollständige, repräsentative Abdeckung verteidigter oder lokalisierter Sites schließen Residential-Proxies die Verzerrungslücke.

Wie halte ich ein gescrapetes Dataset frisch? Lege eine Re-Crawl-Kadenz fest, abgestimmt darauf, wie schnell sich die Daten ändern, mach inkrementelle Refreshes (erkenne Änderungen via ETags/Hashes/Diffs statt voller Re-Scrapes), und stempel jede Zeile mit einem Fetch-Timestamp, um Veralterung zu messen und danach zu filtern.

Wie sollte ich gescrapete Daten deduplizieren? Auf einem stabilen Identitätsschlüssel (SKU, ISBN, kanonische URL, normalisierter Name+Ort), nie auf der rohen URL, weil dieselbe Entität unter vielen URLs erscheint. Kollabiere Duplikate auf die frischeste oder vollständigste Version.

Was sollte ich neben den extrahierten Feldern speichern? Herkunft: Quell-URL, Fetch-Timestamp, Geo-Beobachtungspunkt, einen Content-Hash für die Änderungserkennung, und idealerweise den rohen Payload, damit du neu parsen kannst, ohne neu zu scrapen, wenn dein Extraktor besser wird.

Das Fazit

Ein Dataset mit Web Scraping aufzubauen ist ein Datenqualitäts-Problem im Scraping-Kostüm. Jeder kann Seiten holen; die Arbeit ist, sicherzustellen, dass du die richtigen Seiten geholt hast, vollständig, aktuell, und ohne ein systematisches Loch da, wo die schweren Ziele sein sollten. Die Pipeline, entdecken, fetch, extrahieren, normalisieren, deduplizieren, speichern, aktualisieren, ist geradlinig. Die eine Stufe, die deine Qualität still deckelt, ist der Fetch, denn dort verwandeln Blocks und Geo fehlende Daten in verzerrte Daten.

Bring die Fetch-Schicht in Ordnung, und der Rest ist Engineering. Wenn deine Quellen verteidigt sind oder nach Geo variieren, ist ein Residential-Proxy-Netz das, was eine Convenience-Stichprobe in eine repräsentative verwandelt, vollständige Abdeckung der schweren Ziele, gezieltes Multi-Geo-Sampling, und gleichmäßige Rotation at Scale. Wenn du es verdrahten willst, zeigt der Python-Leitfaden den Fetch-Stufen-Code, und die Pricing-Seite hat die Pläne pro GB. Bau zuerst die Abdeckung, und das Dataset erledigt sich von selbst.

Tags: web scraping datasets data collection residential proxies data engineering

Bereit, loszulegen?

Testen Sie Shifters Residential-Proxys, 205M+ IPs, 195+ Länder, ab $1.00/GB.

Jetzt starten