mendelson/corridas

★ 0Forks 0PythonGitHub ↗Compare

README

Corridas — Calendário Global de Corridas de Rua

Agregador multilíngue (pt/en/es/de/fr) de corridas de rua em todo o mundo. Cobre eventos brasileiros (todas as regiões), latino-americanos, norte-americanos, britânicos, europeus continentais (Alemanha, França, Itália, Espanha, Holanda etc.), asiáticos (Tóquio) e oceânicos (Sydney), incluindo todas as World Marathon Majors. Eventos encontrados em múltiplas fontes são consolidados em um único registro. Atualizado automaticamente a cada 6 horas via GitHub Actions.

App: mendelson.github.io/corridas · Stack: Python (httpx + BeautifulSoup4 + Playwright) · JSON · HTML/CSS/JS puro · GitHub Pages

📍 Mapa do site e rotas: docs/site-map.md — domínio, caminhos públicos e assets de run.mmendelson.com.

Identidade visual

Este site é um dos três irmãos (mmendelson.com, apps.mmendelson.com, run.mmendelson.com) com identidade visual padronizada — mesmas fontes e mesmo padrão de chrome/rodapé. O hub tem sua cor própria (dourado); apps e run compartilham o mesmo código de cores. O plano completo e as decisões estão em website/BRAND_STANDARDIZATION.md (repositório do hub).

  • Fontes: IBM Plex Serif (título do app), IBM Plex Sans (corpo), IBM Plex Mono (chrome/números), via Google Fonts.
  • Cores: mesma paleta do apps.mmendelson.com — destaque azul #3b82f6, fundo #111, superfícies #1a1a1a/#242424, borda #333, texto #eee, secundário #9a9a9a. Tokens em web/style.css (:root). O mascote-tênis (web/gallery/shoe-wear.js) mantém as cores próprias do desenho — é arte, não token.
  • Chrome de família: o seletor Home/Apps/Run vive dentro do próprio header do app (sem brand bar separado — o header já carrega o mascote + título), e o rodapé tem o bloco compartilhado (redes sociais + seletor + copyright © M. Mendelson). Navegação entre os três sites é sempre na mesma aba. Todos os filtros/menus próprios do site foram mantidos.
  • Botão de refresh removido (2026-07): os dados mudam no máximo 4×/dia via pipeline; o botão só re-baixava o mesmo JSON. Trade-off aceito: quem deixar a aba aberta por muitas horas precisa recarregar a página.
  • Favicon animado: web/shoe-favicon.svg — o mascote com as marcas de uso oscilando lentamente (limpo → usado → limpo, 7 s, CSS alternate). Gerado por scripts/gen-shoe-favicon.js a partir de web/gallery/shoe-wear.js (fonte única do desenho); não editar à mão — rode node scripts/gen-shoe-favicon.js após qualquer mudança no mascote. Safari não anima favicons SVG e mostra o primeiro quadro (tênis limpo); favicon.ico/logomendi-favicon.png seguem como fallback raster.

Fontes ativas

Fontes brasileiras — calendários gerais

Fonte Em uso URL de busca Método Testado em Status Últ. sucesso
Ticket Sports ✅ ticketsports.app/api/events/list JSON API 2026-10-01 15:58 ✅ 2026-10-01 15:58 · 699 ev
Circuito das Estações ✅ hotsites.nortemkt.com/api/events/circuito-das-estacoes JSON API dedicada 2026-10-01 16:01 ✅ 2026-10-01 16:01 · 28 ev
Central da Corrida ✅ centraldacorrida.com.br/calendario Supabase edge-function API 2026-10-01 16:00 ✅ 2026-10-01 16:00 · 45 ev
TF Sports ✅ painel-website.tfsports.com.br/api + tfsports.com.br Strapi v4 API + token do bundle Next.js 2026-10-01 16:00 ✅ 2026-10-01 16:00 · 82 ev
Yescom ✅ yescom.com.br HTML (homepage + páginas de evento) 2026-10-01 16:08 ⚠️ (1/3) 2026-09-30 15:31 · 4 ev
Atletis ✅ atletis.com.br/events/coordinates GeoJSON + JSON-LD por evento 2026-10-01 16:08 ⚠️ (1/3) 2026-09-30 15:41 · 52 ev
Brasil Corrida ✅ brasilcorrida.com.br/api/src/Site JSON API 2026-10-01 16:02 ✅ 2026-10-01 16:02 · 11 ev
Iguana Sports ✅ iguanasports.com.br/blogs/calendario-corridas-de-rua HTML (blog de calendário) 2026-10-01 16:03 ✅ 2026-10-01 16:03 · 3 ev
Ativo ✅ ativo.com/eventos.json JSON API 2026-10-01 16:08 ⚠️ (1/3) 2026-09-30 15:32 · 4 ev
MKS Esportes ✅ mksesportes.com.br (sitemap + HTML) HTML 2026-10-01 16:16 ⚠️ (1/3) 2026-09-30 15:40 · 2 ev
Corridas Brasil ✅ corridasbrasil.com.br/calendario/ HTML 2026-10-01 16:08 ⚠️ (1/3) 2026-09-30 15:46 · 2481 ev
Minhas Inscrições ✅ minhasinscricoes.com.br/pt-br/calendario?url=corrida-de-rua HTML 2026-10-01 16:03 ✅ 2026-10-01 16:03 · 193 ev
Runner Brasil ✅ runnerbrasil.com.br HTML 2026-10-01 15:58 ✅ 2026-10-01 15:58 · 22 ev
Largada Esportiva ✅ largadaesportiva.com.br Playwright (intercepção de JSON) + HTML 2026-10-01 16:03 ✅ 2026-10-01 16:03 · 0 ev
Portal das Corridas ✅ portaldascorridas.com.br/event-pages-sitemap.xml Wix sitemap + páginas individuais (JSON-LD) 2026-10-01 16:03 ✅ 2026-10-01 16:03 · 21 ev

Fontes brasileiras — específicas Brasília-DF

Fonte Em uso URL de busca Método Testado em Status Últ. sucesso
Conta Passos ✅ contapassos.com.br RSC payload da home (Next.js) 2026-10-01 16:00 ✅ 2026-10-01 16:00 · 3 ev
Correr Brasília ✅ correrbrasilia.com.br/calendario/ HTML 2026-10-01 15:58 ✅ 2026-10-01 15:58 · 45 ev
Bora Correr ✅ coelhodeprograma.com.br/boracorrer HTML (tabela #tabDados) 2026-10-01 15:57 ✅ 2026-10-01 15:57 · 28 ev
Brasil que Corre ✅ brasilquecorre.com/distritofederal HTML (cs-text-widget) 2026-08-07 09:55 ❌ 0 eventos 2026-07-10 11:46 · 4 ev
SESC DF ✅ sescdf.com.br/corridas HTML 2026-08-07 18:44 ❌ 0 eventos 2026-08-02 10:30 · 1 ev

Fontes brasileiras — eventos específicos

Fonte Em uso URL de busca Testado em Status Últ. sucesso
Maratona do Rio ✅ maratonadorio.com.br 2026-10-01 16:02 ✅ 2026-10-01 16:02 · 1 ev
Maratona de Porto Alegre ✅ maratonadeportoalegre.com.br 2026-10-01 16:02 ✅ 2026-10-01 16:02 · 1 ev
SP City Marathon ✅ iguanasports.com.br/products/sp-city-marathon-{ano} 2026-10-01 15:57 ✅ 2026-10-01 15:57 · 0 ev
São Silvestre ✅ saosilvestre.com.br 2026-10-01 16:01 ✅ 2026-10-01 16:01 · 1 ev
Volta do Lago ✅ largadaesportiva.com.br/api/Events 2026-10-01 15:54 ✅ 2026-10-01 15:54 · 0 ev

Fontes mexicanas

Fonte Em uso URL de busca Observação Testado em Status Últ. sucesso
Asdeporte ✅ asdeporte.com/eventos Next.js; extrai pageProps.recomended do __NEXT_DATA__; ~30 eventos/run 2026-10-01 15:55 ✅ 2026-10-01 15:55 · 7 ev

Fontes internacionais — plataformas agregadoras

Fonte Em uso URL de busca Observação Testado em Status Últ. sucesso
HalfMarathons.net ✅ halfmarathons.net/wp-json/wp/v2/races WordPress REST API paginada (EUA); distâncias em milhas como string 2026-08-07 17:49 ❌ 0 eventos 2026-07-29 11:19 · 1675 ev
RunSignup ✅ runsignup.com/Rest/races REST API paginada (EUA/global); distâncias em milhas preservadas como string 2026-10-01 16:08 ⚠️ (1/3) 2026-09-30 15:35 · 884 ev
World Athletics ✅ worldathletics.org/competitions/world-athletics-label-road-races HTML público; __NEXT_DATA__; provas com Label IAAF (Platinum/Gold/Silver/Bronze) 2026-07-11 13:40 ✅ 2026-07-11 13:40 · 100 ev
Race Roster ✅ search.raceroster.com/search REST API pública; paginada por termo de busca; distâncias parseadas de strings como 42km/3mi 2026-10-01 15:58 ✅ 2026-10-01 15:58 · 353 ev
Finishers ✅ *.typesense.net/multi_search (coleção races) Typesense público (chave search-only do bundle JS); raceDiscipline:=road global; horário enriquecido da página /event/{slug} com cache persistente 2026-10-01 16:04 ✅ 2026-10-01 16:04 · 4660 ev

Grandes corridas internacionais

Scrapers de evento único dedicados, em scraper/sources/evento_unico/ (a São Silvestre usa o mesmo scaffold mas está listada acima, nas fontes brasileiras). Cada um retorna 1–2 edições futuras; quando todas as datas conhecidas já passaram, o scraper aguarda o anúncio da próxima edição.

Os 7 marcados com ⭐ são os Abbott World Marathon Majors (as "Six Majors" + Sydney). Os demais são grandes provas internacionais de destaque mas não pertencem ao grupo WMM.

Evento ⭐ WMM Em uso URL oficial Testado em Status Últ. sucesso
Tokyo Marathon ⭐ ✅ marathon.tokyo/en 2026-10-01 15:54 ✅ 2026-10-01 15:54 · 1 ev
Boston Marathon ⭐ ✅ baa.org/races/boston-marathon 2026-10-01 15:57 ✅ 2026-10-01 15:57 · 1 ev
TCS London Marathon ⭐ ✅ tcslondonmarathon.com 2026-10-01 15:56 ✅ 2026-10-01 15:56 · 1 ev
BMW Berlin Marathon ⭐ ✅ bmw-berlin-marathon.com/en 2026-10-01 15:58 ✅ 2026-10-01 15:58 · 0 ev
Bank of America Chicago Marathon ⭐ ✅ chicagomarathon.com 2026-10-01 15:56 ✅ 2026-10-01 15:56 · 1 ev
TCS New York City Marathon ⭐ ✅ nyrr.org/races/tcsnycmarathon 2026-10-01 16:15 ⚠️ (1/3) 2026-09-30 15:31 · 1 ev
TCS Sydney Marathon ⭐ ✅ tcssydneymarathon.com 2026-10-01 15:55 ✅ 2026-10-01 15:55 · 0 ev
Schneider Electric Paris Marathon ✅ schneiderelectricparismarathon.com/en 2026-10-01 15:54 ✅ 2026-10-01 15:54 · 1 ev
Brighton Marathon ✅ londonmarathonevents.co.uk/brighton-marathon-weekend 2026-10-01 15:56 ✅ 2026-10-01 15:56 · 1 ev
Volkswagen Prague Marathon ✅ runczech.com/en/races/volkswagen-prague-marathon 2026-10-01 15:55 ✅ 2026-10-01 15:55 · 0 ev
Copenhagen Marathon ✅ copenhagenmarathon.dk/en 2026-10-01 15:55 ✅ 2026-10-01 15:55 · 1 ev
Edinburgh Marathon Festival ✅ edinburghmarathon.com 2026-10-01 16:08 ⚠️ (1/3) 2026-09-30 15:34 · 1 ev
Stockholm Marathon ✅ stockholmmarathon.se/eng 2026-10-01 15:55 ✅ 2026-10-01 15:55 · 0 ev
Manchester Marathon ✅ manchestermarathon.co.uk 2026-10-01 16:00 ✅ 2026-10-01 16:00 · 2 ev
Great North Run ✅ greatrun.org/events/great-north-run 2026-10-01 15:55 ✅ 2026-10-01 15:55 · 0 ev
Cardiff Half Marathon ✅ cardiffhalfmarathon.co.uk 2026-10-01 15:59 ✅ 2026-10-01 15:59 · 1 ev
Manchester Half Marathon ✅ manchesterhalfmarathon.com 2026-10-01 15:55 ✅ 2026-10-01 15:55 · 2 ev
TCS Amsterdam Marathon ✅ tcsamsterdammarathon.nl/en 2026-10-01 15:58 ✅ 2026-10-01 15:58 · 1 ev
Venice Marathon ✅ venicemarathon.it/en 2026-10-01 15:57 ✅ 2026-10-01 15:57 · 1 ev
Dublin City Marathon ✅ irishlifedublinmarathon.ie 2026-10-01 16:16 ⚠️ (1/3) 2026-09-30 15:31 · 1 ev
Athens Classic Marathon ✅ athensauthenticmarathon.gr/en 2026-10-01 15:55 ✅ 2026-10-01 15:55 · 1 ev
Valencia Trinidad Alfonso Marathon ✅ valenciaciudaddelrunning.com/en/marathon 2026-10-01 15:57 ✅ 2026-10-01 15:57 · 1 ev
Comrades Marathon ✅ comrades.com/race-information 2026-10-01 15:59 ✅ 2026-10-01 15:59 · 0 ev

Estratégia de acesso

Cada requisição HTTP é feita diretamente via httpx (http_client.py), com headers de browser realista — sem camada de proxy externo. (Scrapestack e Apify foram removidos em 2026-06: as chaves de trial expiraram e todo fallback por eles retornava 429/403, só adicionando latência sem nunca obter sucesso.)

Quando a requisição direta recebe um status de WAF (403/406/429), o get() lança exceção e o scraper da fonte cai para Playwright headless com configurações básicas anti-detecção (desativa navigator.webdriver, simula window.chrome). Isso funciona para alguns WAFs, mas não para Cloudflare em modo estrito.

Os scrapers de grandes corridas internacionais (evento_unico/) têm fallback adicional: quando o HTTP falha, retornam o evento com a data conhecida (known_date) em vez de retornar zero resultados.

Buscas de fotos (fotos.py) usam get_direct(), que não lança exceção em status de WAF — para essas buscas opcionais de imagem.


Fontes desativadas

Fonte Em uso URL Motivo Testado em Status Últ. sucesso
Sympla ❌ sympla.com.br/busca?q=corrida URL de busca retorna HTTP 404; Playwright redireciona para página de login. 2026-05-11 15:57 ❌ —

Fontes testadas e inviáveis

Fonte URL Motivo Testado em Status Últ. sucesso
Corridas BR corridasbr.com.br/df/calendario.asp NÃO REATIVAR. Agregador de baixa qualidade — informações frequentemente erradas, sem links de inscrição reais (apenas redireciona para outras fontes). Mesmo se voltasse a responder com 200, os dados são pouco confiáveis. Permanentemente removido. 2026-05-22 19:17 ❌ —
Ahotu ahotu.com Cloudflare Managed Challenge bloqueia IPs de datacenter. Reconfirmado no CI (GitHub Actions): httpx direto retorna 403 com a página "Just a moment…" (challenges.cloudflare.com) em todos os caminhos de conteúdo (/calendar/running, /sitemap/events.xml.gz, /api/); o Playwright do projeto renderiza o interstício ("Um momento…") mas não resolve o desafio (0 links de evento, sem __NEXT_DATA__). Só robots.txt e o sitemap.xml índice passam, e não carregam dados de evento. Conteúdo da Ahotu já é coberto indiretamente por worldsmarathons (mesmo grupo, sem WAF). 2026-07-03 ❌ —
FMAA fmaa.apps-mexico.com/wp-json/tribe/events/v1/events (1) WAF: 403 em todos os domínios FMAA (fmaa.apps-mexico.com, fmaa.mx); domínios secundários (fmaa.com.mx, fmaa.planin.mx) fora do ar. (2) Escopo incompatível: federação de atletismo competitivo (campeonatos nacionais sub-18/sub-20, pista, cross country), não corridas de participação em massa. Corridas mexicanas de público geral cobertas pelo Asdeporte. 2026-05-21 20:50 ❌ —
GoDream godream.com.br/corrida-de-rua WAF confirmado: 403 direto + Scrapestack 429 + Apify 403 + Playwright ERR_TUNNEL_CONNECTION_FAILED. 2026-05-11 15:57 ❌ —
Let's Do This letsdothis.com WAF confirmado: 403 direto + Scrapestack 500 + Apify 403 em todas as tentativas. 2026-05-15 ❌ —
Road Runners roadrunners.run WAF confirmado: 403 direto + Scrapestack 429 + Apify 403 em todos os 27 estados. — — —
Running in the USA runningintheusa.com Cloudflare WAF: 403 direto + Scrapestack 429 + Playwright bloqueado. 2026-05-11 ❌ —
MarathonGuide marathonguide.com Retorna HTTP 200, mas busca é client-side (Elasticsearch via JS). Scraping HTML inviável sem execução completa de JS. 2026-05-11 ❌ —
RRCA rrca.org/resources/races 404/403 em todos os endpoints testados. 2026-05-11 ❌ —

Estrutura do repositório

corridas/
├── .github/workflows/
│   ├── scrape.yml           # CI: roda a cada 4h, commita JSON atualizado
│   ├── test-sources.yml     # CI/manual: testa cada fonte como job independente (matrix com dropdown)
│   └── debug-scraper.yml    # Workflow manual para diagnóstico de fonte individual (com artefato de log)
├── scraper/
│   ├── main.py              # Orquestrador: executa scrapers, merge, persistência
│   ├── models.py            # Dataclasses: Corrida, Distancia, FonteInfo, etc.
│   ├── merger.py            # Deduplicação e merge entre fontes
│   ├── utils.py             # Normalização de datas, strings, slugify, cidade→estado
│   ├── http_client.py       # GET direto (httpx); WAF → exceção → Playwright
│   ├── playwright_client.py # Playwright headless com evasão básica de bot-detection
│   ├── fotos.py             # Busca de fotos em plataformas (desativada temporariamente)
│   └── sources/
│       ├── *.py             # Scrapers brasileiros e internacionais
│       └── evento_unico/          # Scrapers de grandes corridas internacionais
├── data/
│   ├── corridas.json        # Base acumulativa (versionada no repo)
│   └── last-scraper.log     # Log da última execução do CI
└── web/
    ├── index.html           # Redirect para /pt ou /en conforme idioma do browser
    ├── pt/ en/ es/ de/ fr/  # Páginas por idioma
    ├── app.js               # Lógica do app (filtros, cards, i18n)
    ├── style.css
    └── manifest.json        # PWA

Contributors

mendelsongithub-actions[bot]claude

Issues