Defekte Social-Media-Links mit Wayback Machine CDX prüfen
Aktualisiert am

Wenn ein Social-Media-Post verschwunden ist oder eine alte URL nicht mehr lädt, ist die erste Frage oft: Gibt es noch einen Snapshot in der Wayback Machine? CDX hilft bei dieser Prüfung, weil es den Archivindex liefert: erfasste URLs, Zeitstempel, Statuscodes, MIME-Typen, Digests und Antwortgrößen. Das beweist noch nicht, was auf der archivierten Seite sichtbar war. Es liefert aber Kandidaten, die du bereinigen, deduplizieren, visualisieren und anschließend manuell prüfen kannst.
| Schritt | Vorgehen | Warum es wichtig ist |
|---|---|---|
| 1. Seed-URLs sammeln | Original-URL, Quelle, Sammeldatum und Zieltyp speichern | Macht die Herkunft nachvollziehbar |
| 2. Varianten normalisieren | Tracking-Rauschen entfernen, ohne echte Plattformunterschiede zu verdecken | Verhindert falsche Duplikate |
| 3. CDX abfragen | Zeitstempel, Original-URL, MIME-Typ, Statuscode, Digest und Länge abrufen | Erzeugt den rohen Archivdatensatz |
| 4. Zeilen anreichern | Zeitstempel parsen, Plattform ableiten, Profile, Posts und Threads klassifizieren | Macht die Daten auswertbar |
| 5. Sorgfältig deduplizieren | digest, URL und Zielgruppen vergleichen | Verhindert übertriebene Aussagen zur Archivierung |
| 6. Snapshots validieren | https://web.archive.org/web/{timestamp}/{original_url} öffnen | Trennt Indexeinträge von belastbarer Evidenz |
| 7. Abdeckung visualisieren | Captures nach Plattform, Status, Datum und Ziel darstellen | Zeigt Lücken und Prüfprioritäten |
CDX ist die Indexschicht archivierter Captures. Behandle sie wie einen Katalogeintrag, nicht wie die archivierte Seite selbst.
Für angrenzende Workflows siehe Pandas-Datenbereinigung, Pandas to_datetime, Pandas Drop Duplicates und Web Scraping mit Python.
Warum Social-Media-Archivdaten unordentlich sind
Social-Media-URLs wirken stabil, aber Plattformverhalten macht Archivanalysen schnell unscharf. Ein Twitter/X-Post kann unter twitter.com, x.com oder mobile.twitter.com auftauchen. Ein Reddit-Thread kann alte Pfade, Kommentar-Anker, Query-Parameter und Shortlinks enthalten. Instagram-URLs unterscheiden sich je nach Profil, Post, Reel oder eingebettetem Medienpfad.
Diese Varianten sind wichtig, weil zwei für Menschen identische URLs als getrennte CDX-Schlüssel erscheinen können. Eine zu breite Abfrage sammelt leicht fremde Assets. Eine zu enge Abfrage verpasst Captures unter einem anderen Hostnamen.
Häufige Rauschquellen:
- URL-Varianten: Hostnamen, abschließende Slashes, Fragmente und Tracking-Parameter.
- Zeitstempel-Dichte: Viele Captures können wiederholt identische Antworten sein.
- Plattformverhalten: Redirects, Login-Walls, Interstitials, App-Shells oder stark JavaScript-basierte Seiten.
- Evidenzverwechslung: Ein CDX-Eintrag wird oft fälschlich als Inhaltsbeweis gelesen.
Das Ziel ist nicht, Social-Media-Archivdaten perfekt zu machen. Das Ziel ist ein prüfbarer Workflow.
Matrix zur öffentlichen Datenverfügbarkeit
Nutze diese Matrix, um vor der Analyse keine zu starken Aussagen zu treffen.
| Datentyp | Twitter/X | TikTok | ||
|---|---|---|---|---|
| Öffentliche Profil-Metadaten | CDX und Teil-Snapshots | Öffentliches JSON und CDX | CDX und Teil-Snapshots | CDX und Teil-Snapshots |
| Öffentlicher Post-Text | Abhängig vom Snapshot | Öffentliches JSON und Snapshots | Abhängig vom Snapshot | Abhängig vom Snapshot |
| Öffentliche Post-Medien | Best Effort | Oft einfacher als Instagram | Schwierig und unvollständig | Schwierig und unvollständig |
| Gelöschte öffentliche Posts | Nur wenn vor dem Löschen erfasst | Nur wenn vor dem Löschen erfasst | Selten | Selten |
| Historische Engagement-Zahlen | Abhängig vom Snapshot | Neues JSON oder Snapshot-abhängig | Meist nicht verfügbar | Meist nicht verfügbar |
Archivdaten sind am stärksten für öffentliche Seitenhistorie. Sie sind kein privater Export, keine vollständige Account-Historie und kein Beweis dafür, dass fehlende Datensätze nie existiert haben.
Was die CDX API zurückgibt
Die Wayback CDX API liefert Archivindex-Zeilen für ein URL-Muster. Eine kompakte Abfrage sieht so aus:
curl "https://web.archive.org/cdx/search/cdx?url=twitter.com/*/status/*&output=json&fl=timestamp,original,mimetype,statuscode,digest,length&filter=statuscode:200&limit=100"Die Kernfelder sind:
| Feld | Bedeutung | Nutzung |
|---|---|---|
timestamp | Capture-Zeit in YYYYMMDDhhmmss | Zeitachsen bauen |
original | Ursprünglich erfasste URL | Ziele rekonstruieren und normalisieren |
mimetype | MIME-Typ der archivierten Antwort | HTML, Bilder, JSON und Assets trennen |
statuscode | Vom Archiv aufgezeichneter HTTP-Status | Redirects, Fehler und blockierte Antworten filtern |
digest | Inhalts-Fingerprint | Wiederholt identische Captures finden |
length | Antwortgröße | Sehr kleine Fehlerseiten oder ungewöhnliche Antworten markieren |
collapse=digest kann Duplikate reduzieren. Für Research-Workflows ist es aber oft besser, zuerst rohe Zeilen zu behalten und später mit expliziten Regeln zu deduplizieren.
Datensatz aufbauen
Beginne mit expliziten Seed-URLs:
label,platform,url
example_x_post,x,https://twitter.com/example/status/1234567890
example_reddit_thread,reddit,https://www.reddit.com/r/example/comments/abc123/example_thread/
example_instagram_profile,instagram,https://www.instagram.com/example/Ergänze Felder wie source, collection_date, expected_platform, target_type und notes. Provenienz gehört in den Datensatz, nicht in eine separate Erinnerung.
Normalisiere konservativ. Entferne offensichtliches Tracking-Rauschen, aber bewahre Pfade, die einen bestimmten Post, Kommentar oder ein Medienelement identifizieren können:
from urllib.parse import parse_qsl, urlencode, urlparse, urlunparse
TRACKING_PREFIXES = ("utm_",)
TRACKING_KEYS = {"fbclid", "gclid", "igshid"}
def normalize_url(url: str) -> str:
parsed = urlparse(url.strip())
query = [
(key, value)
for key, value in parse_qsl(parsed.query, keep_blank_values=True)
if key not in TRACKING_KEYS
and not any(key.startswith(prefix) for prefix in TRACKING_PREFIXES)
]
path = parsed.path[:-1] if parsed.path != "/" and parsed.path.endswith("/") else parsed.path
return urlunparse(("https", parsed.netloc.lower(), path, "", urlencode(query), ""))Wenn zwei URLs unterschiedliche Objekte meinen könnten, behalte beide und füge lieber ein abgeleitetes Feld normalized_group hinzu, statt sie zwangsweise zu einem Wert zu machen.
CDX-Zeilen bereinigen und anreichern
Nach dem Export von CDX JSON oder CSV parsest du den Zeitstempel, konvertierst numerische Felder, leitest die Plattform ab und erzeugst Wayback-Snapshot-URLs:
from urllib.parse import urlparse
import pandas as pd
df = pd.read_csv("social_cdx_export.csv")
df["captured_at"] = pd.to_datetime(
df["timestamp"].astype(str),
format="%Y%m%d%H%M%S",
utc=True,
errors="coerce",
)
df["capture_month"] = df["captured_at"].dt.strftime("%Y-%m")
df["statuscode"] = pd.to_numeric(df["statuscode"], errors="coerce")
df["length"] = pd.to_numeric(df["length"], errors="coerce")
def platform_from_url(url: str) -> str:
host = urlparse(str(url)).netloc.lower()
if "twitter.com" in host or "x.com" in host:
return "x"
if "reddit.com" in host:
return "reddit"
if "instagram.com" in host:
return "instagram"
return "other"
df["platform"] = df["original"].apply(platform_from_url)
df["wayback_url"] = (
"https://web.archive.org/web/"
+ df["timestamp"].astype(str)
+ "/"
+ df["original"].astype(str)
)Dedupliziere danach passend zur Frage, die du beantworten willst:
deduped = (
df.sort_values("captured_at")
.drop_duplicates(subset=["original", "digest"], keep="first")
.copy()
)
duplicate_ratio = 1 - (len(deduped) / len(df))Wenn dich jeder Zeitpunkt interessiert, zu dem das Archiv eine URL gesehen hat, behalte mehr Zeilen. Wenn dich unterschiedliche Inhaltszustände interessieren, dedupliziere aggressiver.
Vor jeder Aussage validieren
Eine CDX-Zeile mit statuscode=200 ist ein Hinweis, kein Ergebnis. Der Snapshot kann der ursprüngliche Post sein, aber auch eine Login-Wall, ein Redirect-Ziel, eine App-Shell, ein Interstitial oder ein unvollständiger Capture.
Arbeite mit drei Vertrauensstufen:
| Stufe | Bedeutung | Einsatz |
|---|---|---|
| Indexiert | CDX hat eine Zeile geliefert | Discovery und Review-Queue |
| Abgerufen | Der Wayback-Snapshot öffnet sich und zeigt sinnvollen Inhalt | Kandidatenanalyse |
| Validiert | Ein Reviewer hat den benötigten Inhalt oder die Metadaten bestätigt | Evidenzsensible Arbeit |
Füge für jede Zeile, die eine Schlussfolgerung stützt, Review-Felder hinzu:
| Spalte | Zweck |
|---|---|
wayback_url | Direkte Snapshot-URL |
validation_status | indexed, retrieved, valid_snapshot, login_wall, redirect_only, error oder unknown |
validation_notes | Menschlich lesbare Begründung für den Status |
Das ist besonders bei Instagram wichtig. Forschung zu Instagram-Captures zeigt, dass viele Mementos auf Login-Seiten umleiten oder Post-Bilder fehlen lassen. Reine Capture-Zahlen können deshalb irreführend sein.
Abdeckung visualisieren
Sobald der Datensatz sauber ist, hilft Visualisierung bei der Entscheidung, welche Reviews sich lohnen:
- Capture-Zeitachse nach Plattform,
- Statuscode-Verteilung nach Plattform,
- MIME-Typ-Verteilung,
- Anzahl eindeutiger Digests pro Ziel,
- erstes und letztes Capture-Datum je URL,
- Duplikatquote nach Plattform.
Für explorative Notebook-Arbeit kann PyGWalker den Dataframe interaktiv untersuchen:
import pygwalker as pyg
pyg.walk(deduped)Für eine schnelle Zusammenfassung:
summary = (
df.groupby("platform")
.agg(
total_captures=("original", "count"),
unique_urls=("original", "nunique"),
unique_digests=("digest", "nunique"),
first_capture=("captured_at", "min"),
last_capture=("captured_at", "max"),
)
.reset_index()
)
summary["duplicate_ratio"] = 1 - summary["unique_digests"] / summary["total_captures"]Graphic Walker ist nützlich für eine browserbasierte Variante desselben Workflows: bereinigten Datensatz laden, Zeitstempel- und Plattformfelder in eine Zeitachse ziehen und dann zwischen Statuscode-, MIME-Typ- und Digest-Auswertungen wechseln.
Was CDX Daten beweisen können und was nicht
CDX Daten können zeigen, dass eine öffentliche URL archivierte Captures hatte, wann diese Captures indexiert wurden, welcher Statuscode und MIME-Typ aufgezeichnet wurden und ob wiederholte Captures denselben Digest teilen.
CDX Daten können allein nicht beweisen, dass ein gelöschter Post in einer bestimmten Form existierte, dass ein Screenshot authentisch ist, dass die archivierte Seite für alle Nutzer gleich gerendert wurde oder dass jedes Asset, jeder Kommentar, jedes Bild oder jedes Embed erhalten blieb.
Nutze CDX für Discovery und Struktur. Nutze Snapshot-Validierung für Evidenz.
Häufige Fehlerfälle
| Fehlerfall | Vorgehen |
|---|---|
200-Antwort ist eine Login-Wall | Als login_wall markieren, nicht als valide Evidenz |
| Zu viele doppelte Captures | digest vergleichen, bevor Capture-Volumen interpretiert wird |
| Redirect-Ketten | Redirect-only-Zeilen behalten, aber Ziel prüfen |
| Fehlende Assets | Gerenderte Snapshots inspizieren, wenn Bilder oder Video wichtig sind |
| Hostname-Migration | twitter.com, x.com und mobile Hostnamen explizit tracken |
Wenn du einen UI-first-Workflow bevorzugst, kann PeekVault (opens in a new tab) öffentliche Wayback-Datensätze für Social-Media-URLs durchsuchen und Zeilen als CSV, JSON oder HTML exportieren. Behandle jeden Export als Startdatensatz, der weiterhin validiert werden muss.
Verantwortungsvolle Nutzung
Archivanalysen können sensible Kontexte berühren, besonders wenn Social-Media-Inhalte geändert, gelöscht oder umstritten sind.
Setze diese Grenzen:
- Arbeite mit öffentlichen Archivdatensätzen.
- Impliziere keinen Zugriff auf private Accounts oder private Inhalte.
- Behandle fehlende Archivdatensätze nicht als Beweis dafür, dass etwas nie existiert hat.
- Behandle eine CDX-Zeile nicht als Inhaltsbeweis, ohne den Snapshot zu öffnen.
- Bewahre Provenienz und Validierungsnotizen auf.
- Respektiere Takedown-, Datenschutz- und Sicherheitsbedenken.
Diese Grenzen sind ethisch, aber auch praktisch. Ein Datensatz, der rohe Indexzeilen von validierter Evidenz trennt, lässt sich leichter prüfen, reproduzieren und hinterfragen.
FAQ
Was sind Wayback Machine CDX Daten?
Wayback Machine CDX Daten sind Metadaten des Archivindex. Sie listen erfasste URLs, Zeitstempel, Statuscodes, MIME-Typen, Digests und Längen. Sie helfen dir, mögliche Snapshots zu finden, sind aber nicht der archivierte Seiteninhalt selbst.
Können CDX Daten beweisen, dass ein gelöschter Social-Media-Post existierte?
Nicht allein. CDX Daten können zeigen, dass eine öffentliche URL Archiveinträge hatte. Du musst trotzdem den eigentlichen Wayback-Snapshot prüfen und bestätigen, dass der relevante Inhalt sichtbar und aussagekräftig ist.
Warum scheitert ein 200-Statuscode manchmal in der Archivanalyse?
Ein 200-Status bedeutet, dass das Archiv eine erfolgreiche HTTP-Antwort aufgezeichnet hat. Diese Antwort kann aber trotzdem eine Login-Wall, App-Shell, Redirect-Seite oder unvollständige Erfassung sein. Behandle den Statuscode als Filter, nicht als endgültige Evidenz.
Wie sollte ich wiederholte Wayback-Captures deduplizieren?
Starte mit original plus digest, damit wiederholt identische Antworten für dieselbe URL zu einer Zeile zusammenfallen. Für breitere Analysen vergleiche Deduplizierung nach Plattform, Zieltyp, normalisierter URL und Digest.
Verwandte Anleitungen
- Data-Science-Themenhub
- Beste öffentliche Datensätze für Projekte
- Pandas-Datenbereinigung
- Pandas to_datetime
- Pandas Drop Duplicates
- DataFrame als CSV exportieren
- Web Scraping mit Python
Quellen
- Internet Archive: Wayback CDX Server API Dokumentation (opens in a new tab)
- Bragg und Weigle: Discovering the Traces of Disinformation on Instagram in the Internet Archive (opens in a new tab)
- Kanaries: PyGWalker Dokumentation (opens in a new tab)
- Kanaries: Graphic Walker Dokumentation (opens in a new tab)