Añade .rss a cualquier URL de Reddit y obtienes un feed gratis sin login, que es la respuesta correcta para monitorización ligera y de bajo volumen de un subreddit o una búsqueda. Es la respuesta equivocada en cuanto necesitas puntuaciones, número de comentarios, texto completo, paginación o muchas consultas, porque el feed RSS es pobre y Reddit protege sus datos detrás de una capitalización de $30B y un robots.txt agresivo. Esta es la pregunta que dos subreddits hicieron esta semana, r/learnpython y r/scrapingtheweb, y la respuesta honesta tiene tres niveles, no uno. Aquí está cada uno, con código y el compromiso exacto.
Requisitos previos
- Python 3.9+ o Node 18+
- Para el nivel de API: una clave de Scavio (50 créditos gratis en scavio.dev)
- Entender que scrapear el HTML de Reddit directamente viola robots.txt y acaba bloqueándote
Guia paso a paso
Paso 1: 1. Nivel gratis: el truco del .rss
Añade .rss a una URL de subreddit, usuario o búsqueda. Obtienes un feed XML de los elementos recientes con title, author, link y timestamp, sin auth. Funciona bien para 'avísame cuando r/X tenga una publicación nueva'. Lo que no obtienes: score, número de comentarios, selftext completo ni paginación más allá de la ventana reciente. Reddit también limita el ritmo de las descargas anónimas del feed, así que un bucle de sondeo agresivo acaba estrangulado.
import feedparser
feed = feedparser.parse('https://www.reddit.com/r/aiagents/new/.rss')
for e in feed.entries[:5]:
print(e.title, '-', e.author, '-', e.published)Paso 2: 2. Dónde se rompe el RSS
El RSS te da titulares, no datos. Si estás puntuando publicaciones por intención de compra, deduplicando entre subreddits, leyendo hilos de comentarios o lanzando 50 búsquedas por palabra clave, el feed no lleva los campos y el límite de ritmo anónimo muerde. La API oficial de Reddit resuelve los campos pero añade OAuth, límites de ritmo por minuto y el mantenimiento de un flujo de refresco de token que se rompe en silencio.
# RSS entry has no .score, no .num_comments, no .selftext
# print(e.score) -> AttributeErrorPaso 3: 3. Nivel de API: búsqueda estructurada sin el baile de OAuth
Una API de Reddit estructurada devuelve publicaciones con los campos que el RSS deja fuera y se encarga de la paginación por ti. /api/v1/reddit/search de Scavio toma una clave Bearer y devuelve data.posts más totalResults y nextCursor. Verificado en vivo el 2026-06-26: una búsqueda devolvió 7 publicaciones en data.posts con title, author, subreddit, url, timestamp y position, facturada en 2 créditos. Sin OAuth, sin refresco de token, sin parsear HTML.
import os, requests
KEY = os.environ['SCAVIO_API_KEY']
r = requests.post(
'https://api.scavio.dev/api/v1/reddit/search',
headers={'Authorization': f'Bearer {KEY}'},
json={'query': 'best web search api for agents'},
).json()
posts = r['data']['posts']
print(r['data']['totalResults'], 'posts;', r['credits_used'], 'credits')
for p in posts[:5]:
print(p['subreddit'], '-', p['title'])Paso 4: 4. Pagina y descarga hilos completos
Pasa de vuelta data.nextCursor para recorrer los resultados. Para leer los comentarios de un hilo, usa /api/v1/reddit/post con la URL o el id de la publicación. Este es el nivel que alimenta las tuberías de monitorización de marca y generación de leads, donde necesitas el hilo completo y un esquema estable, no un feed de titulares.
# next page
r2 = requests.post(
'https://api.scavio.dev/api/v1/reddit/search',
headers={'Authorization': f'Bearer {KEY}'},
json={'query': 'best web search api for agents', 'cursor': r['data']['nextCursor']},
).json()Ejemplo en Python
import os, requests
KEY = os.environ['SCAVIO_API_KEY']
def reddit_search(query):
r = requests.post(
'https://api.scavio.dev/api/v1/reddit/search',
headers={'Authorization': f'Bearer {KEY}'},
json={'query': query},
).json()
return r['data']['posts']
for p in reddit_search('best web search api for agents')[:5]:
print(p['subreddit'], '-', p['title'])Ejemplo en JavaScript
const KEY = process.env.SCAVIO_API_KEY;
async function redditSearch(query) {
const r = await fetch('https://api.scavio.dev/api/v1/reddit/search', {
method: 'POST',
headers: { Authorization: `Bearer ${KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ query }),
}).then((x) => x.json());
return r.data.posts;
}
for (const p of (await redditSearch('best web search api for agents')).slice(0, 5)) {
console.log(p.subreddit, '-', p.title);
}Salida esperada
El RSS devuelve un feed XML con title/author/link/published y nada más. La llamada a Scavio devuelve data.posts (7 en nuestra prueba) con title, author, subreddit, url, timestamp y position, más data.totalResults y data.nextCursor para la paginación, y credits_used: 2. Regla de decisión: RSS para 'avísame de publicaciones nuevas'; API estructurada en cuanto necesites puntuaciones, texto completo, deduplicación o volumen.