GitHub Trending Scraper - Repos, Stars & Developers avatar

GitHub Trending Scraper - Repos, Stars & Developers

Pricing

from $15.75 / 1,000 repository scrapeds

Go to Apify Store
GitHub Trending Scraper - Repos, Stars & Developers

GitHub Trending Scraper - Repos, Stars & Developers

Scrape GitHub trending repositories, stars, forks, languages, and developer profiles. Track open source trends daily/weekly/monthly.

Pricing

from $15.75 / 1,000 repository scrapeds

Rating

5.0

(4)

Developer

viralanalyzer

viralanalyzer

Maintained by Community

Actor stats

0

Bookmarked

49

Total users

11

Monthly active users

5 days ago

Last modified

Share

🔥 GitHub Trending Scraper — Repos, Stars & Languages

🔗 View on Apify Store | 🇺🇸 English | 🇧🇷 Português

Scrape GitHub trending repositories with full metadata — stars, forks, descriptions, programming language, and daily/weekly/monthly star growth. Filter by programming language or spoken language. Pure HTML scraping with got-scraping + cheerio, no API key needed.

✨ Features

  • 📈 3 time periods — Daily, weekly, and monthly trending repos
  • 🌐 Language filters — Filter by programming language (Python, JavaScript, Rust, etc.)
  • 🗣️ Spoken language filter — Filter by spoken language code (en, pt, es, zh, etc.)
  • Star metrics — Total stars + stars gained in the selected period
  • 🍴 Fork count — Total forks per repository
  • 🏆 Ranking — Position in GitHub's trending list
  • 🛡️ Anti-placeholder guardrails — Every result validated as real data
  • Fast & lightweight — Pure HTTP with got-scraping + cheerio

📥 Input

ParameterTypeRequiredDefaultDescription
sinceStringNodailyTrending period: daily, weekly, or monthly
languagesArrayNo[]Programming languages to filter (e.g., python, javascript, rust). Empty = all
spokenLanguageStringNo""Spoken language code (e.g., en, pt, es, zh). Empty = all

Input Example

{
"since": "weekly",
"languages": ["python", "rust", "typescript"],
"spokenLanguage": "en"
}

📤 Output

FieldTypeDescription
rankIntegerPosition in the trending list
ownerStringRepository owner (user or org)
repoStringRepository name
fullNameStringFull name (owner/repo)
descriptionStringRepository description
languageStringPrimary programming language
totalStarsIntegerTotal star count
totalForksIntegerTotal fork count
starsTodayIntegerStars gained in the selected period
repoUrlStringGitHub repository URL
sinceStringTime period (daily, weekly, monthly)
filterLanguageStringLanguage filter applied (if any)
platformStringAlways github
scrapedAtStringTimestamp of data extraction (ISO 8601)

Output Example

{
"rank": 1,
"owner": "microsoft",
"repo": "autogen",
"fullName": "microsoft/autogen",
"description": "A programming framework for agentic AI",
"language": "Python",
"totalStars": 41283,
"totalForks": 5847,
"starsToday": 1253,
"repoUrl": "https://github.com/microsoft/autogen",
"since": "weekly",
"filterLanguage": "python",
"platform": "github",
"scrapedAt": "2026-03-06T14:22:05.371Z"
}

📋 Use Cases

  • 📈 Tech trend detection — Identify emerging technologies and frameworks before they go mainstream
  • 🔍 Competitive intelligence — Monitor competitors' open-source projects and their traction
  • 🎯 Developer marketing — Find popular repos in your stack to target for integrations
  • 💰 Investment research — Track which open-source projects are gaining momentum
  • 👥 Hiring intelligence — Discover trending languages and tools developers are adopting
  • ✍️ Content creation — Write about the hottest repos and technologies each week

✅ Capabilities & Limits

Stated up front, so you do not pay a run to find out.

Built here: each language in languages is its own HTTP request. A language that fails every retry - bad slug, 404, rate-limit page - is logged and skipped, and the run finishes on the rest. A partial dataset looks exactly like a complete one in the output; only the run log names what was dropped. When every language ends with zero repos, the run status tells you which cause it was - see the table below.

Input / featureSupportedNotes
sinceTrending period to scrape.
languagesFilter by language (e.g., python, javascript, rust). Leave empty for all languages.
spokenLanguageFilter by spoken language (e.g., en, pt, es, zh). Leave empty for all.

🚦 What a run with zero repos does

The ending is decided by what GitHub put on the wire: the HTTP status of github.com/trending, and how many article.Box-row repo containers a 200 body carried. Page copy is never read to guess a reason.

What GitHub didRun statusDatasetCharged
Blocked every request (HTTP 403, HTTP 429, timeout) — no page ever arrivedSUCCEEDED1 diagnostic row with _blockReasonNo PPE
Served the page with repo containers, and the parser extracted noneFAILED, exit code 1emptyNo PPE
Served the page with no repo container, and you had set languages / spokenLanguageFAILED, exit code 1, message names your filteremptyNo PPE
Served the unfiltered page with no repo containerFAILED, exit code 1 — the container class changedemptyNo PPE
Answered HTTP 404 (language slug does not exist) or 5xxFAILED, exit code 1, message names the slugemptyNo PPE

A blocked run is the only zero-repo ending that finishes SUCCEEDED, because a 403/429/timeout on the wire is the one cause GitHub confirms by itself. Everything else fails. The trending page exposes no marker that says "this list is legitimately empty", so treating an empty page as good news would mean guessing — and a stale selector would then be sold to you as "nothing was trending in Rust today".

A blocked run leaves this row in the dataset:

{
"setup_status": "DIAGNOSTIC_GUIDE",
"_dataQuality": "diagnostic",
"_blockReason": "HTTP 429 (rate limit)",
"message": "[DIAGNÓSTICO] Zero repos (since=daily) — GitHub blocked every request to the trending page (HTTP 429 (rate limit)).",
"potential_causes": [
"GitHub returned HTTP 429 (rate limit) on every attempt, so no trending page ever reached the parser",
"HTTP 429 rate-limit on the Apify datacenter exit IP",
"The exit IP is temporarily throttled by GitHub"
],
"remediations": [
"Retry in a few minutes — GitHub rate limits on /trending recover quickly",
"Scrape fewer languages per run (each language is its own request)",
"Run through a residential proxy if the datacenter IP keeps getting 429"
],
"since": "daily",
"languagesRequested": ["rust"],
"spokenLanguage": null,
"containersSeen": 0,
"reposParsed": 0,
"sawHttp200": false,
"dataSource": "github.com/trending (HTML)",
"scrapedAt": "2026-08-27T14:22:05.371Z"
}

Filter on _dataQuality != "diagnostic" and diagnostic rows never reach your pipeline.

❓ FAQ

Q: How many repos are returned per run? A: GitHub's trending page shows approximately 25 repos per language/period combination. If you specify multiple languages, each language is scraped separately, so you get up to 25 repos per language.

Q: What does "starsToday" mean for weekly and monthly periods? A: Despite the field name, starsToday reflects the stars gained in the selected period. For "weekly" it shows stars gained this week, for "monthly" it shows stars gained this month.

Q: Can I scrape trending repos for multiple languages at once? A: Yes. Add up to 10 languages in the languages array. The actor will fetch the trending page for each language separately, with a 2-second delay between requests to avoid rate limiting.

Q: Does this actor use the GitHub API? A: No. It scrapes the GitHub trending HTML page directly using got-scraping + cheerio. No API key or GitHub token is needed. This means it is not subject to GitHub API rate limits.

Q: What happens if GitHub changes their HTML structure? A: The run fails with exit code 1 and a message that names what broke — either "the page carried N article.Box-row containers and the parser extracted none", or "the unfiltered trending page carried no container at all". Both are drift, both fail, neither charges PPE.

Q: And if my language filter simply has nothing trending? A: That also fails with exit code 1, and the message names the filter you set: languages=[...] plus spokenLanguage when present. GitHub gives no observable "this list is empty" marker, so the actor refuses to bill a start on a guess. Clear the filter, or widen since, and run again.

Q: When does a zero-repo run end SUCCEEDED? A: Only when GitHub blocked every request — 403, 429 or a timeout observed on the wire. You get one diagnostic row carrying _blockReason, and no PPE charge.

💰 Pricing

This actor uses Pay Per Event (PPE) pricing:

MetricCost
Per repository scraped$0.03

📝 Changelog

v1.0 (Current)

  • ✅ Scrape trending repos for daily, weekly, and monthly periods
  • ✅ Filter by programming language (up to 10 languages per run)
  • ✅ Filter by spoken language code
  • ✅ Full metadata: stars, forks, description, language, ranking
  • ✅ Stars gained in selected period (starsToday)
  • ✅ Anti-placeholder guardrails
  • ✅ Retry logic with rate limit handling
  • ✅ PPE billing via Actor.charge()
  • ✅ Zero-repo runs classified from the HTTP status and the article.Box-row count: a confirmed block ends SUCCEEDED with a diagnostic row, while selector drift, a 404 slug and user-emptied filters fail with exit code 1

🔥 GitHub Trending Scraper — Repositórios, Stars & Linguagens

🇺🇸 English | 🇧🇷 Português

Extraia repositórios em alta no GitHub com metadados completos — stars, forks, descrições, linguagem de programação e crescimento diário/semanal/mensal de stars. Filtre por linguagem de programação ou idioma falado. Scraping HTML puro com got-scraping + cheerio, sem API key.

✨ Funcionalidades

  • 📈 3 períodos — Trending diário, semanal e mensal
  • 🌐 Filtro por linguagem — Filtre por linguagem de programação (Python, JavaScript, Rust, etc.)
  • 🗣️ Filtro por idioma — Filtre por código de idioma falado (en, pt, es, zh, etc.)
  • Métricas de stars — Total de stars + stars ganhas no período selecionado
  • 🍴 Contagem de forks — Total de forks por repositório
  • 🏆 Ranking — Posição na lista de trending do GitHub
  • 🛡️ Guardrails anti-placeholder — Todo resultado validado como dado real
  • Rápido e leve — HTTP puro com got-scraping + cheerio

📥 Entrada

ParâmetroTipoObrigatórioPadrãoDescrição
sinceStringNãodailyPeríodo de trending: daily, weekly ou monthly
languagesArrayNão[]Linguagens de programação para filtrar (ex.: python, javascript, rust). Vazio = todas
spokenLanguageStringNão""Código do idioma falado (ex.: en, pt, es, zh). Vazio = todos

Exemplo de Entrada

{
"since": "weekly",
"languages": ["python", "rust", "typescript"],
"spokenLanguage": "en"
}

📤 Saída

CampoTipoDescrição
rankIntegerPosição na lista de trending
ownerStringDono do repositório (usuário ou organização)
repoStringNome do repositório
fullNameStringNome completo (owner/repo)
descriptionStringDescrição do repositório
languageStringLinguagem de programação principal
totalStarsIntegerTotal de stars
totalForksIntegerTotal de forks
starsTodayIntegerStars ganhas no período selecionado
repoUrlStringURL do repositório no GitHub
sinceStringPeríodo (daily, weekly, monthly)
filterLanguageStringFiltro de linguagem aplicado (se houver)
platformStringSempre github
scrapedAtStringTimestamp da extração dos dados (ISO 8601)

Exemplo de Saída

{
"rank": 1,
"owner": "microsoft",
"repo": "autogen",
"fullName": "microsoft/autogen",
"description": "A programming framework for agentic AI",
"language": "Python",
"totalStars": 41283,
"totalForks": 5847,
"starsToday": 1253,
"repoUrl": "https://github.com/microsoft/autogen",
"since": "weekly",
"filterLanguage": "python",
"platform": "github",
"scrapedAt": "2026-03-06T14:22:05.371Z"
}

📋 Casos de Uso

  • 📈 Detecção de tendências tech — Identifique tecnologias e frameworks emergentes antes de se tornarem mainstream
  • 🔍 Inteligência competitiva — Monitore projetos open-source de concorrentes e sua tração
  • 🎯 Marketing para desenvolvedores — Encontre repos populares no seu stack para integrações
  • 💰 Pesquisa de investimento — Acompanhe quais projetos open-source estão ganhando momentum
  • 👥 Inteligência de contratação — Descubra linguagens e ferramentas em alta entre desenvolvedores
  • ✍️ Criação de conteúdo — Escreva sobre os repos e tecnologias mais quentes da semana

🚦 O que acontece quando a execução não encontra nenhum repositório

O desfecho vem do que o GitHub colocou na resposta: o status HTTP de github.com/trending e quantos contêineres article.Box-row um corpo 200 trouxe. O texto da página nunca é lido para adivinhar motivo.

O que o GitHub fezStatus da execuçãoDatasetCobrança
Bloqueou todas as requisições (HTTP 403, HTTP 429, timeout) — nenhuma página chegouSUCCEEDED1 linha de diagnóstico com _blockReasonSem PPE
Serviu a página com contêineres de repo e o parser não extraiu nenhumFAILED, exit code 1vazioSem PPE
Serviu a página sem contêiner nenhum, e você tinha definido languages / spokenLanguageFAILED, exit code 1, a mensagem cita o seu filtrovazioSem PPE
Serviu a página sem filtro e sem contêiner nenhumFAILED, exit code 1 — a classe do contêiner mudouvazioSem PPE
Respondeu HTTP 404 (slug de linguagem inexistente) ou 5xxFAILED, exit code 1, a mensagem cita o slugvazioSem PPE

Execução bloqueada é o único desfecho com zero repos que termina SUCCEEDED, porque 403/429/timeout na resposta é a única causa que o GitHub confirma sozinho. Todo o resto falha. A página de trending não expõe marcador que diga "esta lista está legitimamente vazia", então tratar página vazia como boa notícia seria adivinhação — e um seletor desatualizado passaria a ser vendido para você como "nada esteve em alta em Rust hoje".

Uma execução bloqueada deixa esta linha no dataset:

{
"setup_status": "DIAGNOSTIC_GUIDE",
"_dataQuality": "diagnostic",
"_blockReason": "HTTP 429 (rate limit)",
"message": "[DIAGNÓSTICO] Zero repos (since=daily) — GitHub blocked every request to the trending page (HTTP 429 (rate limit)).",
"potential_causes": [
"GitHub returned HTTP 429 (rate limit) on every attempt, so no trending page ever reached the parser",
"HTTP 429 rate-limit on the Apify datacenter exit IP",
"The exit IP is temporarily throttled by GitHub"
],
"remediations": [
"Retry in a few minutes — GitHub rate limits on /trending recover quickly",
"Scrape fewer languages per run (each language is its own request)",
"Run through a residential proxy if the datacenter IP keeps getting 429"
],
"since": "daily",
"languagesRequested": ["rust"],
"spokenLanguage": null,
"containersSeen": 0,
"reposParsed": 0,
"sawHttp200": false,
"dataSource": "github.com/trending (HTML)",
"scrapedAt": "2026-08-27T14:22:05.371Z"
}

Filtre por _dataQuality != "diagnostic" e nenhuma linha de diagnóstico entra no seu pipeline.

❓ Perguntas Frequentes

P: Quantos repos são retornados por execução? R: A página de trending do GitHub exibe aproximadamente 25 repos por combinação de linguagem/período. Se você especificar múltiplas linguagens, cada uma é extraída separadamente, então você obtém até 25 repos por linguagem.

P: O que "starsToday" significa para períodos semanais e mensais? R: Apesar do nome do campo, starsToday reflete as stars ganhas no período selecionado. Para "weekly" mostra stars ganhas na semana, para "monthly" mostra stars ganhas no mês.

P: Posso extrair repos em alta para múltiplas linguagens de uma vez? R: Sim. Adicione até 10 linguagens no array languages. O actor buscará a página de trending para cada linguagem separadamente, com um atraso de 2 segundos entre requisições para evitar rate limiting.

P: Este actor usa a API do GitHub? R: Não. Ele faz scraping da página HTML de trending do GitHub diretamente usando got-scraping + cheerio. Nenhuma API key ou token do GitHub é necessário. Isso significa que ele não está sujeito aos limites de rate da API do GitHub.

P: O que acontece se o GitHub mudar a estrutura HTML? R: A execução falha com exit code 1 e uma mensagem que nomeia o que quebrou — ou "a página trouxe N contêineres article.Box-row e o parser não extraiu nenhum", ou "a página sem filtro não trouxe contêiner algum". Os dois casos são drift, os dois falham, nenhum cobra PPE.

P: E se o meu filtro de linguagem simplesmente não tiver nada em alta? R: Também falha com exit code 1, e a mensagem nomeia o filtro que você definiu: languages=[...] mais spokenLanguage quando houver. O GitHub não dá marcador observável de "esta lista está vazia", então o actor se recusa a cobrar o start em cima de um palpite. Limpe o filtro, ou amplie o since, e rode de novo.

P: Quando uma execução com zero repos termina SUCCEEDED? R: Só quando o GitHub bloqueou todas as requisições — 403, 429 ou timeout observados na resposta. Você recebe uma linha de diagnóstico com _blockReason e nenhuma cobrança PPE.

💰 Preços

Este actor usa precificação Pay Per Event (PPE):

MétricaCusto
Por repositório extraído$0.03

🔗 Actors Relacionados

📝 Changelog

v1.0 (Atual)

  • ✅ Scraping de repos em alta para períodos diário, semanal e mensal
  • ✅ Filtro por linguagem de programação (até 10 linguagens por execução)
  • ✅ Filtro por código de idioma falado
  • ✅ Metadados completos: stars, forks, descrição, linguagem, ranking
  • ✅ Stars ganhas no período selecionado (starsToday)
  • ✅ Guardrails anti-placeholder
  • ✅ Lógica de retry com tratamento de rate limit
  • ✅ Cobrança PPE via Actor.charge()
  • ✅ Execução com zero repos classificada pelo status HTTP e pela contagem de article.Box-row: bloqueio confirmado termina SUCCEEDED com linha de diagnóstico, enquanto drift de seletor, slug 404 e filtro do usuário falham com exit code 1