Récupération d'actifs indirects Wayback
Problème
Lors de l'archivage de contenu provenant de services disparus, les URL d'actifs directs (images, vidéos, avatars) retournent souvent des 404/503 depuis Wayback Machine même quand les pages les référençant ont été archivées. Les actifs eux-mêmes n'ont peut-être pas été crawlés, mais leurs URL existent dans le HTML archivé.
Contexte / Conditions de déclenchement
- L'URL Wayback directe pour l'actif retourne 404 ou 503
- Vous avez une URL de profil/page mais pas l'URL de l'actif
- Récupération de média depuis des services disparus (Vine, Tumblr, startups défuntes)
- Wayback a la page mais pas les actifs intégrés
- Actifs hébergés sur CDN qui n'étaient pas dans le périmètre de crawl de Wayback
Solution
Étape 1 : Récupérer la page archivée
import requests
import re
session = requests.Session()
session.headers['User-Agent'] = 'YourCrawler/0.1 (archival research)'
# Récupérer le profil/page archivés
page_url = f"https://web.archive.org/web/20170110/https://example.com/user/{username}"
resp = session.get(page_url, timeout=20, allow_redirects=True)
Étape 2 : Extraire les URL d'actifs du HTML
# Essayer plusieurs patterns - la structure des pages varie
patterns = [
# Image Open Graph
(r'og:image["\s]+content="([^"]+)"', 'og:image'),
# Données JSON dans la page
(r'"avatarUrl"\s*:\s*"([^"]+)"', 'JSON avatarUrl'),
(r'"imageUrl"\s*:\s*"([^"]+)"', 'JSON imageUrl'),
# URL CDN
(r'(https?://[^"\s]+cdn\.[^"\s]+\.(jpg|png|mp4))', 'CDN URL'),
# URL S3
(r'(https?://[^"\s]+\.s3\.amazonaws\.com/[^"\s]+)', 'S3 URL'),
]
for pattern, name in patterns:
match = re.search(pattern, html)
if match:
asset_url = match.group(1).replace('&', '&')
break
Étape 3 : Gérer les URL encapsulées par Wayback
Les URL extraites des pages archivées sont souvent déjà des URL Wayback :
# Si l'URL est déjà encapsulée, convertir im_ en id_ pour le contenu brut
if 'web.archive.org/web/' in asset_url:
# Remplacer /web/TIMESTAMP/ ou /web/TIMESTAMPim_/ par /web/TIMESTAMPid_/
download_url = re.sub(r'/web/(\d+)(im_)?/', r'/web/\1id_/', asset_url)
else:
# Encapsuler l'URL brute dans Wayback
download_url = f"https://web.archive.org/web/{timestamp}id_/{asset_url}"
Étape 4 : Méthodes de secours si Wayback échoue
Si Wayback retourne 404/503 pour l'actif, essayer des alternatives :
# Extraire l'URL CDN originale
cdn_match = re.search(r'(https?://[^/]+cdn\.[^"\s]+)', asset_url)
if cdn_match:
original_url = cdn_match.group(1)
# Méthode 1 : Essayer le CDN live via IP (si le DNS est mort mais les serveurs vivent)
# Voir : skill dead-cdn-dns-bypass
# Méthode 2 : Essayer différents timestamps Wayback
for ts in ['20170110', '20160601', '20150601']:
alt_url = f"https://web.archive.org/web/{ts}id_/{original_url}"
resp = session.get(alt_url, timeout=30)
if resp.status_code == 200:
break
# Méthode 3 : Vérifier si l'actif existe sur la plateforme successeur
# (ex. : utilisateur migré vers Twitter/TikTok avec le même nom d'utilisateur)
Vérification
- Vérifier la réponse HTTP 200 depuis l'URL de téléchargement finale
- Valider que le content-type correspond au type attendu
- Vérifier les magic bytes du fichier (JPEG :
\xff\xd8\xff, PNG :\x89PNG) - Confirmer que la taille du fichier dépasse le seuil minimum
Exemple : Récupération d'avatars Vine
def recover_avatar_from_profile(vanity_url: str, user_id: str, session) -> bool:
"""Récupérer l'avatar en crawlant le profil Vine archivé."""
timestamps = ['20170110', '20161201', '20160601', '20150601']
for ts in timestamps:
# Récupérer la page de profil archivée
profile_url = f"https://web.archive.org/web/{ts}/https://vine.co/{vanity_url}"
resp = session.get(profile_url, timeout=20)
if resp.status_code != 200:
continue
# Extraire l'URL de l'avatar depuis la page
match = re.search(r'og:image["\s]+content="([^"]+)"', resp.text)
if not match:
match = re.search(r'"avatarUrl"\s*:\s*"([^"]+)"', resp.text)
if match:
avatar_url = match.group(1).replace('&', '&')
# Convertir en URL de contenu brut
if 'web.archive.org/web/' in avatar_url:
download_url = re.sub(r'/web/(\d+)(im_)?/', r'/web/\1id_/', avatar_url)
else:
download_url = f"https://web.archive.org/web/{ts}id_/{avatar_url}"
# Télécharger
img_resp = session.get(download_url, timeout=30)
if img_resp.status_code == 200 and len(img_resp.content) > 100:
# Valider et sauvegarder
if img_resp.content[:3] == b'\xff\xd8\xff': # JPEG
save_avatar(user_id, img_resp.content, 'jpg')
return True
return False
Résultat : Avatars récupérés pour 95 % des top créateurs Vine (incluant Logan Paul, Nash Grier, Lele Pons) dont les URL d'avatar directes n'étaient pas archivées.
Notes
- Modificateurs Wayback im vs id :
im_retourne l'image avec la barre d'outils Wayback,id_retourne les bytes bruts - Rate limiting : Respecter les serveurs Wayback - ajouter des délais de 1-2 secondes entre les requêtes
- Plusieurs timestamps : Essayer plusieurs dates d'archive - certaines peuvent avoir l'actif, d'autres non
- Décodage d'entités HTML : Toujours décoder
&en&dans les URL extraites - Gestion des redirections : Utiliser
allow_redirects=True- Wayback redirige souvent vers le snapshot le plus proche
Skills associées
dead-cdn-dns-bypass- Quand le DNS du CDN est mort mais les serveurs répondent encorewayback-api-archive-recovery- Pour découvrir ce qui a été archivé via l'API CDXwayback-machine-raw-content-id-modifier- Pour récupérer le contenu brut sans l'encapsulation Wayback