Cómo comprobar enlaces rotos de redes sociales con Wayback Machine CDX
Actualizado el

Cuando un post desaparece o una URL social deja de abrir, la primera pregunta suele ser si Wayback Machine guardó alguna captura. CDX ayuda a responder eso porque funciona como un índice de archivo: URLs capturadas, fechas, códigos de estado, tipos MIME, huellas digest y tamaños de respuesta. No prueba por sí solo qué mostraba la página, pero sí permite encontrar candidatos, limpiar datos, deduplicar, visualizar cobertura y validar snapshots antes de sacar conclusiones.
| Paso | Qué hacer | Por qué importa |
|---|---|---|
| 1. Reunir URLs semilla | Guardar URL original, fuente, fecha de recolección y tipo de objetivo | Mantiene visible la procedencia |
| 2. Normalizar variantes | Quitar ruido de tracking sin borrar diferencias reales de plataforma | Evita falsos duplicados |
| 3. Consultar CDX | Extraer timestamp, URL original, MIME, estado, digest y longitud | Crea el dataset bruto del archivo |
| 4. Enriquecer filas | Parsear fechas, inferir plataforma y clasificar perfiles, posts o hilos | Hace los datos analizables |
| 5. Deduplicar con cuidado | Comparar digest, URL y grupos de objetivo | Evita exagerar la preservación |
| 6. Validar snapshots | Abrir https://web.archive.org/web/{timestamp}/{original_url} | Separa filas indexadas de evidencia |
| 7. Visualizar cobertura | Graficar capturas por plataforma, estado, fecha y objetivo | Muestra huecos y prioridades de revisión |
CDX es la capa de índice de las capturas archivadas. Piensa en ella como una ficha de catálogo, no como la página archivada.
Para flujos cercanos, consulta limpieza de datos con Pandas, Pandas to_datetime, eliminación de duplicados en Pandas y web scraping con Python.
Por qué los archivos de redes sociales son ruidosos
Las URLs sociales parecen estables, pero el comportamiento de cada plataforma complica el análisis. Un post de Twitter/X puede aparecer bajo twitter.com, x.com o mobile.twitter.com. Un hilo de Reddit puede incluir rutas antiguas, anclas de comentarios, parámetros de consulta y enlaces cortos. En Instagram, las rutas cambian entre perfil, publicación, reel y recursos incrustados.
Estas variantes importan porque dos URLs equivalentes para una persona pueden aparecer como claves CDX distintas. Una consulta demasiado amplia puede traer assets irrelevantes. Una consulta demasiado estrecha puede perder capturas alojadas en otro hostname.
Fuentes habituales de ruido:
- Variantes de URL: hostnames, barras finales, fragmentos y parámetros de tracking.
- Densidad temporal: muchas capturas pueden ser respuestas idénticas repetidas.
- Comportamiento de plataforma: redirecciones, muros de login, intersticiales, shells de aplicación o páginas muy dependientes de JavaScript.
- Confusión probatoria: una fila CDX se trata a veces como si fuera prueba del contenido.
El objetivo no es hacer perfecto el archivo social. El objetivo es que el flujo sea auditable.
Matriz de disponibilidad pública
Usa esta matriz para no prometer más de lo que los datos pueden sostener.
| Tipo de dato | Twitter/X | TikTok | ||
|---|---|---|---|---|
| Metadatos públicos de perfil | CDX y snapshots parciales | JSON público y CDX | CDX y snapshots parciales | CDX y snapshots parciales |
| Texto público de posts | Depende del snapshot | JSON público y snapshots | Depende del snapshot | Depende del snapshot |
| Medios públicos | Mejor esfuerzo | A menudo más fácil que Instagram | Difícil y parcial | Difícil y parcial |
| Posts públicos eliminados | Solo si se capturaron antes de borrarse | Solo si se capturaron antes de borrarse | Raro | Raro |
| Métricas históricas de interacción | Dependen del snapshot | JSON reciente o snapshot | Normalmente no disponible | Normalmente no disponible |
Los datos de archivo son más sólidos para estudiar el historial de páginas públicas. No son una exportación privada, un historial completo de cuenta ni una prueba de que los registros ausentes nunca existieron.
Qué devuelve la API CDX
La Wayback CDX API devuelve filas de índice para un patrón de URL. Una consulta compacta se ve así:
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"Campos principales:
| Campo | Significado | Uso |
|---|---|---|
timestamp | Hora de captura en YYYYMMDDhhmmss | Construir líneas de tiempo |
original | URL original capturada | Recuperar y normalizar objetivos |
mimetype | Tipo MIME de la respuesta archivada | Separar HTML, imágenes, JSON y assets |
statuscode | Estado HTTP registrado por el archivo | Filtrar redirecciones, errores y bloqueos |
digest | Huella del contenido | Detectar capturas idénticas repetidas |
length | Tamaño de la respuesta | Marcar páginas de error pequeñas o respuestas raras |
collapse=digest puede reducir duplicados, pero en investigación suele ser mejor conservar primero las filas brutas y deduplicar después con reglas explícitas.
Construir el dataset
Empieza con URLs semilla explícitas:
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/Añade campos como source, collection_date, expected_platform, target_type y notes. La procedencia forma parte del dataset; no debe quedar como memoria externa.
Normaliza con criterio conservador. Elimina tracking evidente, pero conserva rutas que puedan identificar un post, comentario o recurso concreto:
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), ""))Si dos URLs podrían representar objetos distintos, conserva ambas y añade un campo derivado normalized_group en lugar de forzarlas a un único valor.
Limpiar y enriquecer filas CDX
Después de exportar CDX en JSON o CSV, parsea el timestamp, convierte campos numéricos, infiere la plataforma y crea URLs directas de Wayback:
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)
)Luego deduplica según la pregunta de análisis:
deduped = (
df.sort_values("captured_at")
.drop_duplicates(subset=["original", "digest"], keep="first")
.copy()
)
duplicate_ratio = 1 - (len(deduped) / len(df))Si te importa cada vez que el archivo vio una URL, conserva más filas. Si te importan estados de contenido distintos, deduplica con más fuerza.
Validar antes de afirmar
Una fila CDX con statuscode=200 es una pista, no una conclusión. El snapshot puede ser el post original, pero también un muro de login, una redirección, un shell de app, un intersticial o una captura parcial.
Usa tres niveles de confianza:
| Nivel | Significado | Úsalo para |
|---|---|---|
| Indexado | CDX devolvió una fila | Descubrimiento y colas de revisión |
| Recuperado | El snapshot de Wayback abre y muestra contenido útil | Análisis candidato |
| Validado | Una persona confirmó que el contenido o metadato necesario es visible | Trabajo sensible a evidencia |
Para cada fila que apoye una conclusión, añade campos de revisión:
| Columna | Propósito |
|---|---|
wayback_url | URL directa del snapshot |
validation_status | indexed, retrieved, valid_snapshot, login_wall, redirect_only, error o unknown |
validation_notes | Motivo legible del estado |
Esto es especialmente importante en Instagram. Investigaciones sobre capturas de Instagram han encontrado que muchos mementos redirigen a login o no incluyen imágenes de posts, por lo que los conteos brutos pueden engañar.
Visualizar cobertura
Cuando el dataset está limpio, la visualización ayuda a decidir si merece la pena revisar más:
- línea temporal de capturas por plataforma,
- distribución de códigos de estado por plataforma,
- distribución de tipos MIME,
- número de
digestúnicos por objetivo, - primera y última fecha de captura por URL,
- ratio de duplicados por plataforma.
Para exploración en notebooks, PyGWalker permite inspeccionar el dataframe de forma interactiva:
import pygwalker as pyg
pyg.walk(deduped)Para una tabla resumen rápida:
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 es útil si prefieres el mismo flujo en navegador: carga el dataset limpio, arrastra campos de fecha y plataforma a una línea temporal y cambia entre resúmenes por estado, MIME y digest.
Qué puede y no puede probar CDX
CDX puede ayudar a establecer que una URL pública tuvo capturas archivadas, cuándo se indexaron, qué código de estado y tipo MIME se registraron y si varias capturas parecen compartir una misma huella digest.
CDX no puede probar por sí solo que un post eliminado existiera con una forma exacta, que una captura de pantalla sea auténtica, que la página archivada se renderizara igual para todos los usuarios ni que todos los assets, comentarios, imágenes o embeds se conservaran.
Usa CDX para descubrir y estructurar. Usa validación de snapshots para evidencia.
Fallos comunes
| Caso | Qué hacer |
|---|---|
Una respuesta 200 es un muro de login | Etiquétala como login_wall, no como evidencia válida |
| Demasiadas capturas duplicadas | Compara digest antes de interpretar el volumen |
| Cadenas de redirección | Conserva filas de solo redirección, pero revisa el destino |
| Assets ausentes | Inspecciona snapshots renderizados si importan imágenes o video |
| Migración de hostname | Rastrea twitter.com, x.com y hostnames móviles explícitamente |
Si prefieres empezar desde una interfaz, PeekVault (opens in a new tab) puede buscar registros públicos de Wayback para URLs sociales y exportar filas como CSV, JSON o HTML. Trata cualquier exportación como dataset inicial que todavía requiere validación.
Uso responsable
El análisis de archivos puede tocar contextos sensibles, sobre todo cuando el contenido social cambió, desapareció o está en disputa.
Límites recomendados:
- Trabaja con registros de archivo públicos.
- No insinúes acceso a cuentas o contenido privado.
- No trates la ausencia de registros como prueba de que algo nunca existió.
- No trates una fila CDX como prueba de contenido sin abrir el snapshot.
- Conserva procedencia y notas de validación.
- Respeta solicitudes de retirada, privacidad y seguridad.
Estos límites son éticos y prácticos. Un dataset que separa filas brutas de índice y evidencia validada es más fácil de revisar, reproducir y cuestionar.
Preguntas frecuentes
¿Qué son los datos CDX de Wayback Machine?
Son metadatos del índice de archivo. Enumeran URLs capturadas, timestamps, códigos de estado, tipos MIME, huellas digest y tamaños. Ayudan a encontrar snapshots candidatos, pero no son el contenido archivado de la página.
¿CDX puede probar que existió un post eliminado?
No por sí solo. CDX puede mostrar que una URL pública tuvo registros de archivo, pero aún debes inspeccionar el snapshot real de Wayback y confirmar que el contenido relevante es visible y significativo.
¿Por qué un estado 200 a veces falla en análisis de archivo?
Un 200 significa que el archivo registró una respuesta HTTP exitosa, pero esa respuesta puede ser un muro de login, un shell de app, una redirección o una captura incompleta. Trátalo como filtro, no como evidencia final.
¿Cómo deduplicar capturas repetidas de Wayback?
Empieza con original más digest para colapsar respuestas idénticas de la misma URL en una sola fila. Para análisis más amplio, compara deduplicación por plataforma, tipo de objetivo, URL normalizada y digest.
Guías relacionadas
- Hub de ciencia de datos
- Mejores datasets públicos para tus proyectos
- Limpieza de datos con Pandas
- Pandas to_datetime
- Eliminar duplicados en Pandas
- Exportar un DataFrame a CSV
- Web scraping con Python
Referencias
- Internet Archive: documentación de Wayback CDX Server API (opens in a new tab)
- Bragg y Weigle: Discovering the Traces of Disinformation on Instagram in the Internet Archive (opens in a new tab)
- Kanaries: documentación de PyGWalker (opens in a new tab)
- Kanaries: documentación de Graphic Walker (opens in a new tab)