Tony Wang5 min de lecturaCómo hacer scraping de datos deportivos de ESPN en 2026 (API y Python)
Tres formas de obtener datos deportivos de ESPN en 2026 — Python DIY, herramientas no-code, o una API estructurada — con la base legal.
La forma más rápida de conseguir datos deportivos de ESPN en 2026 es una API estructurada que devuelve scores, standings, rosters y stats de jugadores como JSON normalizado. La propia ESPN corre sobre una API interna de JSON que muchos proyectos open-source hacen reverse-engineering directamente — funciona, pero está sin documentar, no es oficial, y puede cambiar sin previo aviso. Esta guía cubre la ruta DIY, las herramientas no-code, y una API estructurada, además de la realidad legal de scrapear ESPN.
¿Por qué scrapear ESPN?
Los datos de ESPN — scores, standings, rosters, stats, noticias — alimentan un conjunto reconocible de productos:
- Herramientas de fantasy sports — rosters, stats de jugadores e informes de lesiones para decisiones de alineación y waiver-wire.
- Comparación de apuestas y cuotas — calendarios de partidos, scores y contexto de enfrentamientos junto a datos de cuotas.
- Agregación de noticias deportivas — juntar titulares y scores en un solo feed.
- Apps de fans y analítica — trackers de scores, widgets de standings, búsquedas de estadísticas históricas.
¿Es legal scrapear ESPN?
ESPN es una propiedad de Disney, y sus Terms of Use remiten a los Terms of Use de Disney, que prohíben explícitamente usar "un robot, spider, script u otro medio automatizado" para "acceder, monitorear, copiar o extraer" sus productos — incluyendo, por nombre, el web scraping y el data mining. La única excepción es la indexación pública de motores de búsqueda que respeta robots.txt. El robots.txt de ESPN bloquea directamente los user agents de AI-crawlers conocidos y prohíbe rutas de admin, login, y varias rutas parametrizadas/de archivo para todos los demás.
Ese es el trasfondo legal para scrapear páginas de espn.com directamente. Una gran parte del uso real de "ESPN API" apunta en cambio a los endpoints internos de JSON de ESPN (site.api.espn.com), que alimentan las propias apps de ESPN y están ampliamente documentados por terceros — pero cada fuente creíble es explícita en que se trata de una integración reverse-engineered, no oficial, no una API sancionada, sin términos propios publicados. Trátalo en consecuencia: está bien para proyectos personales y prototipado, pero no es algo sobre lo que construir un producto comercial sin tu propia revisión legal. Ver ¿Es legal el web scraping en 2026? para el marco general.
Opción 1: DIY en Python (y por qué se rompe)
La mayoría de los scrapers DIY de ESPN se saltan el HTML por completo y llaman a los endpoints de JSON sin documentar que usa el propio sitio de ESPN:
import requests
def get_scoreboard(sport="football", league="nfl"):
url = f"https://site.api.espn.com/apis/site/v2/sports/{sport}/{league}/scoreboard"
resp = requests.get(url, headers={"User-Agent": "Mozilla/5.0"})
resp.raise_for_status()
return resp.json()
Esto funciona — hasta que deja de funcionar. Los modos de fallo recurrentes:
- Sin documentación, sin garantía de estabilidad. Estos endpoints están reverse-engineered a partir del tráfico web/móvil del propio ESPN. Los campos se renombran, reestructuran o eliminan entre deploys sin ningún changelog.
- El schema varía según el deporte y la liga. Una respuesta de scoreboard de fútbol no tiene la misma forma que una de la NFL — código que funciona para
nflpuede romperse silenciosamente paraeng.1. - Bloqueo por User-Agent y rate-limit. Los clientes tipo
requestspor defecto se bloquean o limitan sin previo aviso; no hay un rate limit documentado sobre el cual diseñar. - Los datos en vivo necesitan disciplina de polling. Los scores se actualizan en tiempo real sin mecanismo push, así que tú eres responsable de la cadencia de polling y de la deduplicación.
- Scrapear HTML es peor. Recurrir a scrapear directamente las páginas de
espn.comchoca de lleno con la prohibición de los Terms of Use anterior, además de scoreboards en vivo renderizados con JS que necesitan un navegador headless.
Opción 2: Herramientas no-code
Los scrapers web genéricos pueden extraer un único scoreboard o una tabla de standings para un informe puntual. No aguantan nada continuo — sin scheduling entre deportes/ligas, y heredan por debajo la misma fragilidad de schema sin documentar que el enfoque DIY.
Opción 3: Una API estructurada de ESPN
Una API gestionada normaliza las diferencias entre deporte/liga y absorbe el schema drift, así que el mismo código funciona en la NFL, la NBA, la Premier League, y más:
curl -G "https://api.crawlora.net/api/v1/espn/scoreboard" \
-H "x-api-key: $CRAWLORA_API_KEY" \
--data-urlencode "sport=football" \
--data-urlencode "league=nfl"
import requests
resp = requests.get(
"https://api.crawlora.net/api/v1/espn/scoreboard",
headers={"x-api-key": "YOUR_API_KEY"},
params={"sport": "football", "league": "nfl"},
)
for game in resp.json()["data"]["games"]:
home, away = game["competitors"]
print(game["short_name"], game["status"]["detail"])
Ejemplo de respuesta (los campos son ilustrativos — revisa los docs para el schema completo):
{
"data": {
"sport": "football",
"league": "nfl",
"season": { "year": 2026, "type": 2, "name": "Regular Season" },
"count": 14,
"games": [
{
"id": "401547439",
"date": "2026-09-08T17:00Z",
"short_name": "KC @ BAL",
"status": { "state": "pre", "detail": "Sun 1:00 PM", "completed": false },
"venue": "M&T Bank Stadium",
"competitors": [
{ "team": { "id": "33", "abbreviation": "BAL", "display_name": "Baltimore Ravens" }, "home_away": "home", "score": null },
{ "team": { "id": "12", "abbreviation": "KC", "display_name": "Kansas City Chiefs" }, "home_away": "away", "score": null }
]
}
]
}
}
Rosters, atletas individuales, y standings siguen el mismo patrón de sport/league:
curl -G "https://api.crawlora.net/api/v1/espn/team-roster" \
-H "x-api-key: $CRAWLORA_API_KEY" \
--data-urlencode "sport=basketball" \
--data-urlencode "league=nba" \
--data-urlencode "team=lal"
resp = requests.get(
"https://api.crawlora.net/api/v1/espn/standings",
headers={"x-api-key": "YOUR_API_KEY"},
params={"sport": "baseball", "league": "mlb", "season": 2026},
)
for group in resp.json()["data"]["groups"]:
print(group["name"], [e["team"]["abbreviation"] for e in group["entries"]])
¿Qué enfoque deberías usar?
| DIY Python | Herramientas no-code | API estructurada | |
|---|---|---|---|
| Tiempo de setup | Minutos para llamarla, esfuerzo continuo para mantenerla funcionando | Minutos | Minutos |
| Mantenimiento | Alto — cambios de schema sin documentar y sin aviso | Ninguno (la misma fragilidad por debajo) | Ninguno — el proveedor lo mantiene |
| Normalización entre deportes | Lo construyes tú, por deporte/liga | Rara vez se ofrece | Ya está integrada |
| Ideal para | Prototipado, proyectos personales | Una exportación puntual rápida | Productos y pipelines continuos |
Qué puedes recopilar
- Scores y calendarios — partidos en vivo y próximos en fútbol americano, baloncesto, béisbol, hockey y fútbol
- Standings — tablas de división/conferencia por temporada
- Rosters y atletas — detalles de jugadores, posición, número de camiseta, experiencia
- Detalle de partido — box scores y, cuando está disponible, cuotas
- Noticias — titulares y enlaces a artículos por deporte/liga
Limitaciones y desafíos comunes
- Sin documentar es sin documentar. Cada fuente que cubre la API interna de ESPN dice lo mismo: sin SLA, sin changelog, sin garantía de que se vea igual el mes que viene.
- La cobertura varía según la liga. Los rankings y algunos endpoints de detalle solo cubren deportes/ligas específicos (por ejemplo, los polls de fútbol americano/baloncesto universitario).
- Sin términos comerciales oficiales. No hay un rate limit ni una licencia publicados para los endpoints reverse-engineered — construye tu solución teniendo eso en cuenta.
- La frescura de los scores en vivo es por polling, no push — planifica tu intervalo de refresco según cuán sensible al tiempo sea tu caso de uso.
Dónde encaja esto
Combina las estadísticas estructuradas de ESPN con SofaScore para una cobertura internacional de fútbol más amplia, o Google Trends para cruzar el interés de búsqueda en el día del partido con los resultados reales. Ve la referencia completa de la API de ESPN para cada endpoint disponible.
Fuentes
Empieza a recopilar
Prueba los endpoints de ESPN en el Playground, lee el schema completo en los docs de la API, y revisa los costos en créditos en la página de precios. Para guías relacionadas, ve cómo scrapear SofaScore para los mismos scores y standings en vivo con cobertura de fútbol global más profunda, cómo scrapear MLB para los calendarios y box scores de una sola liga en profundidad completa, cómo scrapear Google Trends y ¿Es legal el web scraping en 2026?.
Parte de nuestra serie de guías how-to-scrape — cada plataforma que cubrimos, en un solo índice.
Preguntas frecuentes
¿ESPN tiene una API pública oficial?
No. ESPN no publica una API pública para developers. Su sitio y sus apps corren sobre una API interna de JSON (site.api.espn.com) que los developers han hecho reverse-engineering y documentado ampliamente, pero es no oficial, sin documentar, y puede cambiar de forma sin previo aviso — no hay changelog ni SLA para developers externos.
¿Es legal scrapear ESPN?
Los Terms of Use de ESPN remiten a los Terms of Use de Disney, que prohíben explícitamente el acceso automatizado, el monitoreo y el scraping — incluso a través de los propios endpoints de JSON sin documentar de ESPN, que no tienen términos propios publicados. Trátalo como una violación de los Terms sobre el papel; revisa tu propia exposición legal antes de un uso comercial. No es asesoría legal.
¿Puedo scrapear ESPN sin que me bloqueen?
Los User-Agents por defecto y un volumen sostenido de requests contra los endpoints sin documentar de ESPN se limitan o bloquean sin documentación sobre la cual diseñar. Una API estructurada gestiona los headers, el rate limiting y la normalización de schema entre deportes y ligas detrás de una sola clave.
¿Qué deportes y ligas están cubiertos?
Fútbol americano (NFL, universitario), baloncesto (NBA, WNBA, universitario masculino y femenino), béisbol (MLB), hockey (NHL), y las principales ligas de fútbol (Premier League, La Liga, Serie A, Bundesliga, Ligue 1, MLS, Champions League) — cada uno se aborda con un parámetro de deporte y liga sobre el mismo conjunto de endpoints.
¿Qué datos de ESPN puedo recopilar?
Scoreboards y calendarios, standings por división/conferencia, detalle y rosters de equipos, perfiles de atletas individuales, resúmenes de partidos con box scores y cuotas cuando están disponibles, rankings de fútbol americano/baloncesto universitario, y titulares de noticias — todo por deporte y liga.
¿Qué tan actuales son los scores?
Tan actuales como el momento en que llamas al endpoint de scoreboard o de resumen de partido — no hay un feed push/websocket, así que la cobertura en vivo significa hacer polling en un intervalo que se ajuste a la velocidad con la que necesitas actualizaciones.
¿Puedo usar los datos de cuotas de ESPN para un producto de apuestas?
Las cuotas del resumen de partido son contexto de mercado informativo obtenido de los propios datos de ESPN, no un feed de cuotas con licencia — trátalo como color de investigación, y consigue tu propia revisión legal y de licenciamiento antes de construir un producto de apuestas sobre ello.