Uno script Python può salvare i tuoi elementi di Reddit in CSV e JSON, ma da solo non può aggirare il limite di ciò che Reddit mostra. Gli elenchi si fermano intorno ai 1.000 elementi: PRAW può scorrere ciò che l'API gli restituisce, ma non recuperare da quell'elenco gli elementi salvati che ne sono già rimasti fuori.
Per provare a recuperare i post più vecchi, avvia anche una richiesta ufficiale dei dati da un browser desktop, su reddit.com/settings/data-request. Reddit afferma che la preparazione dell'archivio può richiedere fino a 30 giorni. L'archivio può includere saved_posts.csv e saved_comments.csv; la guida di Reddit li descrive come elenchi degli elementi salvati. Non dare per scontato che contengano il testo dei post: diverse analisi delle esportazioni descrivono righe con un ID e un permalink.
Due percorsi, due risultati diversi
Il flusso di lavoro di questo tutorial usa PRAW per esportare sul tuo computer ciò che l'elenco degli elementi salvati restituisce ancora. Lo script crea due file: un JSON, utile per conservare campi strutturati, e un CSV, pratico da aprire in un foglio di calcolo. Se cerchi elementi salvati precedenti al limite, vale la pena provare in parallelo la richiesta ufficiale, anche se Reddit non conferma esplicitamente che l'archivio includa sempre questi elementi.
flowchart TD A["Crear solicitud oficial"] --> B["Descargar archivo"] A --> C["Preparar acceso a PRAW"] C --> D["Leer guardados visibles"] D --> E["Escribir CSV y JSON"] B --> F["Comprobar filas y enlaces"] E --> F
1. Installa PRAW e prepara l'accesso
PRAW è la libreria Python che scorre gli elenchi di Reddit. Installala nell'ambiente in cui eseguirai lo script:
python -m pip install praw
Ti serviranno le credenziali di un'applicazione Reddit. La guida di DEV Community descrive un'applicazione di tipo script e il flusso di autenticazione con nome utente e password di PRAW; Marqly avverte che l'accesso all'API potrebbe richiedere un'approvazione esplicita. Verifica di essere autorizzato a usarla e non inserire le credenziali direttamente nel codice. L'esempio seguente le legge dall'ambiente.
In un terminale macOS o Linux, sostituisci i valori di esempio con i tuoi. Questi comandi influiscono solo sulla sessione corrente del terminale:
export REDDIT_CLIENT_ID="tu_client_id"
export REDDIT_CLIENT_SECRET="tu_client_secret"
export REDDIT_USERNAME="tu_usuario"
export REDDIT_PASSWORD="tu_contrasena"
export REDDIT_USER_AGENT="saved-export/1.0 by u/tu_usuario"
Se il tuo account usa l'autenticazione a due fattori, PRAW si aspetta che tu aggiunga alla password il codice di sei cifre, separato da due punti, come indicato nella guida di DEV Community. Non salvare questo valore in un file che intendi condividere.
2. Leggi gli elementi salvati e genera entrambi i formati
Salva questo programma come reddit_saved_export.py. Usa limit=None per chiedere a PRAW tutti gli elementi disponibili nell'elenco; questo non significa che Reddit restituirà una cronologia illimitata. Il codice distingue i commenti dai post e lascia vuoti i campi che non esistono per un determinato tipo di elemento.
import csv
import json
import os
from datetime import datetime, timezone
import praw
# Las credenciales llegan desde variables de entorno.
reddit = praw.Reddit(
client_id=os.environ["REDDIT_CLIENT_ID"],
client_secret=os.environ["REDDIT_CLIENT_SECRET"],
username=os.environ["REDDIT_USERNAME"],
password=os.environ["REDDIT_PASSWORD"],
user_agent=os.environ["REDDIT_USER_AGENT"],
)
rows = []
for item in reddit.user.me().saved(limit=None):
is_comment = item.name.startswith("t1_")
title = getattr(item, "title", None) or getattr(item, "link_title", "") or ""
body = getattr(item, "selftext", None)
if body is None:
body = getattr(item, "body", "") or ""
rows.append({
"id": item.id,
"type": "comment" if is_comment else "post",
"title": title,
"subreddit": str(item.subreddit),
"author": str(item.author) if item.author else "",
"permalink": f"https://www.reddit.com{item.permalink}",
"url": getattr(item, "url", "") or "",
"created_utc": datetime.fromtimestamp(
item.created_utc, tz=timezone.utc
).isoformat(),
"score": item.score,
"body": body,
})
# JSON conserva los campos y el texto completo disponible.
with open("reddit_saved.json", "w", encoding="utf-8") as file:
json.dump(rows, file, ensure_ascii=False, indent=2)
# CSV puede abrirse en programas de hojas de cálculo.
fieldnames = [
"id", "type", "title", "subreddit", "author", "permalink",
"url", "created_utc", "score", "body",
]
with open("reddit_saved.csv", "w", encoding="utf-8", newline="") as file:
writer = csv.DictWriter(file, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(rows)
print(f"Exportados {len(rows)} elementos visibles.")
Esegui il programma dallo stesso terminale in cui hai definito le variabili:
python reddit_saved_export.py
I due file appariranno nella directory corrente. I campi di testo corrispondono ai contenuti ancora disponibili e restituiti da Reddit per quell'elemento; lo script non crea una copia dei post eliminati. Inoltre, non conserva la data in cui hai salvato l'elemento: il campo created_utc corrisponde alla data di creazione dell'elemento.
3. Verifica cosa è stato scritto
Prima di considerare il file una copia completa, verifica che entrambi i formati siano leggibili e confronta il numero di righe. Questo secondo programma non contatta Reddit: controlla solo i file locali.
import csv
import json
from pathlib import Path
json_path = Path("reddit_saved.json")
csv_path = Path("reddit_saved.csv")
with json_path.open(encoding="utf-8") as file:
json_rows = json.load(file)
with csv_path.open(encoding="utf-8", newline="") as file:
csv_rows = list(csv.DictReader(file))
print(f"JSON: {len(json_rows)} elementos")
print(f"CSV: {len(csv_rows)} elementos")
print(f"Filas coincidentes: {len(json_rows) == len(csv_rows)}")
if json_rows:
print("Primer enlace:", json_rows[0]["permalink"])
Se il conteggio si avvicina a 1.000, non interpretarlo come il totale dei tuoi elementi salvati nel corso del tempo. La documentazione di PRAW indica che la maggior parte degli elenchi di Reddit ha un limite massimo di 1.000 elementi e viene restituita in pagine fino a 100 elementi.
4. Prova il percorso ufficiale per la cronologia più vecchia
Da un browser desktop, accedi all'account corretto e visita reddit.com/settings/data-request. Segui il modulo e, se consente di selezionare un intervallo, DEV Community consiglia di scegliere l'intera cronologia. Reddit afferma che la preparazione può richiedere fino a 30 giorni; il link per il download può arrivare nella casella di posta di Reddit o, in alcuni casi, all'indirizzo email verificato.
Quando scarichi l'archivio, cerca saved_posts.csv e saved_comments.csv. Stashr e Marqly descrivono questi CSV come elenchi di ID e permalink, senza titoli né testo. Non è garantito che includano elementi che non compaiono più nell'elenco: Reddit li descrive come gli elementi salvati, ma non conferma espressamente che l'esportazione superi sempre il limite. Conta le righe e conserva il file originale prima di modificarlo.
Errori da evitare
limit=None non elimina il limite. Chiede solo a PRAW di scorrere tutto ciò che l'elenco consente. Un ciclo più lungo o il ripetere il download non farà ricomparire gli elementi che Reddit non restituisce più attraverso questo percorso.
Non confondere la data di creazione con quella in cui hai salvato qualcosa. L'esempio esporta created_utc, non un timestamp dell'azione di salvataggio. Inoltre, il CSV ufficiale potrebbe contenere solo un insieme di link: se ti servono titoli o testo, lo script li recupera per gli elementi che riesce ancora a leggere, ma non li aggiunge retroattivamente all'esportazione ufficiale.
Infine, tratta i file e le credenziali come dati privati. Un elenco di elementi salvati può includere contenuti che non vorresti lasciare in una cartella condivisa. Non caricare il file né pubblicare le variabili di accesso.
Il risultato è un'esportazione locale degli elementi salvati visibili al momento dell'esecuzione dello script, più una richiesta ufficiale che potrebbe fornire link aggiuntivi. Conserva entrambe le copie: PRAW offre più contesto per l'elenco attuale; la richiesta dei dati è l'opzione da verificare per gli elementi più vecchi.
Fonti: DEV Community, PRAW, Stashr, Marqly