Wayback Machine - Contenu brut avec modificateur id_
Problème
Lors de la récupération d'endpoints API JSON archivés depuis la Wayback Machine, vous obtenez du contenu enveloppé en HTML avec la barre d'outils Wayback au lieu de la réponse JSON brute. Cela provoque des erreurs de parsing JSON comme « Expecting value: line 1 column 1 (char 0) » car la réponse commence par <!DOCTYPE html> au lieu d'un JSON valide.
Contexte / Conditions de déclenchement
- Récupération d'endpoints API archivés depuis
web.archive.org/web/{timestamp}/{url} - Le parsing JSON échoue avec « Expecting value: line 1 column 1 (char 0) »
- Le contenu de la réponse commence par du HTML au lieu du JSON attendu
- Crawling d'API REST archivées, de flux JSON ou de tout contenu non-HTML depuis Wayback
- Utilisation de
json.loads(),response.json()ou parsing JSON similaire en Python
Solution
Ajoutez id_ après le timestamp dans l'URL Wayback pour obtenir le contenu brut :
Par défaut (enveloppé en HTML) :
https://web.archive.org/web/20170112012313/https://vine.co/api/users/profiles/123
Contenu brut (ajoutez id_) :
https://web.archive.org/web/20170112012313id_/https://vine.co/api/users/profiles/123
Correction du code
# AVANT (cassé - retourne du HTML)
url = f"https://web.archive.org/web/{timestamp}/https://example.com/api/data"
# APRÈS (marche - retourne du JSON brut)
url = f"https://web.archive.org/web/{timestamp}id_/https://example.com/api/data"
Autres modificateurs Wayback
id_- Brut/identité (sans modifications, retourne le contenu original)if_- Mode iframe embedjs_- Mode réécriture JavaScriptcs_- Mode réécriture CSSim_- Mode image
Vérification
-
Testez l'URL avec curl pour voir la réponse réelle :
# Sans id_ - affiche du HTML avec la barre d'outils Wayback curl -s "https://web.archive.org/web/20170112012313/https://example.com/api/data" | head -5 # Avec id_ - affiche du JSON brut curl -s "https://web.archive.org/web/20170112012313id_/https://example.com/api/data" | head -5 -
Vérifiez que le parsing JSON fonctionne :
import json import urllib.request url = f"https://web.archive.org/web/{timestamp}id_/{api_url}" with urllib.request.urlopen(url) as resp: data = json.loads(resp.read()) # Devrait marcher maintenant
Exemple
Crawling de profils archivés de l'API Vine :
WAYBACK_BASE = "https://web.archive.org/web"
def fetch_profile(user_id: str, timestamp: str):
# Utilisez le modificateur id_ pour obtenir du JSON brut au lieu du contenu enveloppé en HTML
url = f"{WAYBACK_BASE}/{timestamp}id_/https://vine.co/api/users/profiles/{user_id}"
with urllib.request.urlopen(url) as resp:
data = json.loads(resp.read())
return data['data'] # Marche correctement maintenant
Notes
- Le modificateur
id_fonctionne pour tout type de contenu, pas seulement JSON (images, CSS, JS, etc.) - Certains contenus archivés peuvent toujours échouer s'ils n'ont jamais été correctement capturés
- Les requêtes à l'API CDX (pour trouver des URL archivées) n'ont pas besoin du modificateur
- Limitez le débit des requêtes vers archive.org (5+ secondes entre les requêtes recommandées)
- Les réponses vides (0 octet) indiquent que l'entrée d'archive existe mais le contenu n'a pas été capturé