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.
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 emweb/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, CSSalternate). Gerado porscripts/gen-shoe-favicon.jsa partir deweb/gallery/shoe-wear.js(fonte única do desenho); não editar à mão — rodenode scripts/gen-shoe-favicon.jsapós qualquer mudança no mascote. Safari não anima favicons SVG e mostra o primeiro quadro (tênis limpo);favicon.ico/logomendi-favicon.pngseguem como fallback raster.
| 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 | 2026-09-30 15:31 · 4 ev | |
| Atletis | ✅ | atletis.com.br/events/coordinates |
GeoJSON + JSON-LD por evento | 2026-10-01 16:08 | 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 | 2026-09-30 15:32 · 4 ev | |
| MKS Esportes | ✅ | mksesportes.com.br (sitemap + HTML) |
HTML | 2026-10-01 16:16 | 2026-09-30 15:40 · 2 ev | |
| Corridas Brasil | ✅ | corridasbrasil.com.br/calendario/ |
HTML | 2026-10-01 16:08 | 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 |
| 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 |
| 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 |
| 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 |
| 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 | 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 |
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 | 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 | 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 | 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 |
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.
| 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 | ❌ | — |
| 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 | ❌ | — |
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