L'API officielle de Reddit nécessite une inscription OAuth, impose des limites de débit strictes et a récemment introduit des paliers payants qui rendent la collecte de données à grande échelle coûteuse. L'API Scavio offre une alternative : interroger les publications et commentaires Reddit via un seul point de terminaison authentifié qui renvoie du JSON structuré avec le subreddit, l'auteur, le score, les horodatages et les arbres de commentaires complets. Ce tutoriel montre comment rechercher des publications Reddit, récupérer des fils de discussion individuels avec commentaires et construire un pipeline de collecte de données sans toucher à l'API officielle de Reddit.
Prérequis
- Python 3.8 ou supérieur
- bibliothèque requests installée
- Une clé API Scavio
- Sujets ou subreddits à partir desquels vous souhaitez collecter des données
Parcours
Étape 1: Rechercher des publications Reddit par mot-clé
Utilisez le point de terminaison de recherche Reddit de Scavio pour trouver des publications correspondant à un mot-clé. Les résultats incluent le titre de la publication, le subreddit, l'auteur, le score et l'horodatage.
import os
import requests
API_KEY = os.environ["SCAVIO_API_KEY"]
def search_reddit(query: str, sort: str = "relevance") -> list[dict]:
r = requests.post(
"https://api.scavio.dev/api/v1/reddit/search",
headers={"Authorization": f"Bearer {API_KEY}"},
json={"query": query, "sort": sort},
timeout=30
)
r.raise_for_status()
return r.json()["data"]["posts"]Étape 2: Récupérer une publication complète avec les commentaires
À partir d'une URL de publication Reddit, récupérez la publication complète ainsi que tous les commentaires organisés en fils de discussion en un seul appel.
def fetch_thread(url: str) -> dict:
r = requests.post(
"https://api.scavio.dev/api/v1/reddit/post",
headers={"Authorization": f"Bearer {API_KEY}"},
json={"url": url},
timeout=30
)
r.raise_for_status()
return r.json()["data"]Étape 3: Extraire des données structurées des résultats
Analysez les publications et les commentaires dans un format plat prêt pour l'analyse, avec les champs pertinents extraits.
def extract_post_data(post: dict) -> dict:
return {
"id": post.get("id"),
"title": post.get("title"),
"subreddit": post.get("subreddit"),
"author": post.get("author"),
"score": post.get("score"),
"timestamp": post.get("timestamp"),
"url": post.get("url"),
}
def extract_comments(thread: dict) -> list[dict]:
return [{
"author": c.get("author"),
"body": c.get("body"),
"score": c.get("score"),
"depth": c.get("depth"),
} for c in thread.get("comments", [])]Étape 4: Exporter en JSON
Enregistrez les publications et commentaires collectés sous forme de jeu de données JSON structuré.
import json
def collect_dataset(query: str, max_threads: int = 5) -> dict:
posts = search_reddit(query, sort="new")
dataset = []
for post in posts[:max_threads]:
thread = fetch_thread(post["url"])
dataset.append({
"post": extract_post_data(post),
"comments": extract_comments(thread),
})
return {"query": query, "threads": dataset}
with open("reddit_data.json", "w") as f:
json.dump(collect_dataset("python web frameworks"), f, indent=2)Exemple Python
import os
import json
import requests
API_KEY = os.environ["SCAVIO_API_KEY"]
def search_reddit(query: str) -> list[dict]:
r = requests.post("https://api.scavio.dev/api/v1/reddit/search",
headers={"Authorization": f"Bearer {API_KEY}"},
json={"query": query, "sort": "new"}, timeout=30)
r.raise_for_status()
return r.json()["data"]["posts"]
def fetch_thread(url: str) -> dict:
r = requests.post("https://api.scavio.dev/api/v1/reddit/post",
headers={"Authorization": f"Bearer {API_KEY}"},
json={"url": url}, timeout=30)
r.raise_for_status()
return r.json()["data"]
if __name__ == "__main__":
posts = search_reddit("best python frameworks 2026")
print(f"Found {len(posts)} posts")
for p in posts[:3]:
print(f" r/{p['subreddit']}: {p['title']}")
thread = fetch_thread(p["url"])
comments = thread.get("comments", [])
print(f" {len(comments)} comments")Exemple JavaScript
const API_KEY = process.env.SCAVIO_API_KEY;
async function searchReddit(query) {
const r = await fetch("https://api.scavio.dev/api/v1/reddit/search", {
method: "POST",
headers: { Authorization: `Bearer ${API_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({ query, sort: "new" })
});
return (await r.json()).data.posts;
}
async function fetchThread(url) {
const r = await fetch("https://api.scavio.dev/api/v1/reddit/post", {
method: "POST",
headers: { Authorization: `Bearer ${API_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({ url })
});
return (await r.json()).data;
}
async function main() {
const posts = await searchReddit("best python frameworks 2026");
for (const p of posts.slice(0, 3)) {
console.log(`r/${p.subreddit}: ${p.title}`);
const thread = await fetchThread(p.url);
console.log(` ${thread.comments?.length || 0} comments`);
}
}
main().catch(console.error);Sortie attendue
Found 14 posts
r/Python: FastAPI vs Django for new projects in 2026
47 comments
r/webdev: What Python framework are you using this year?
23 comments
r/learnpython: Best framework to learn as a beginner?
18 comments