Tony Wang5 min de lecturaCómo hacer scraping de repos, users y trending de GitHub en 2026 (API y Python)
Haz scraping de GitHub en 2026 — repos, users, stars, contributors y trending — con Python DIY, API oficial limitada o una API estructurada.
La forma más rápida de hacer scraping de GitHub en 2026 es llamar a una API estructurada que devuelve JSON normalizado — repositories, users, organizations, contributors, stargazers, desgloses por lenguaje, releases y trending — en lugar de quemar la cuota horaria de la API oficial o parsear las páginas renderizadas del lado del cliente de github.com. GitHub es poco habitual en esta serie: tiene una API oficial genuinamente capaz, así que la pregunta real es cuándo los límites de tasa hacen que el scraping sea la mejor opción. Esta guía cubre los tres enfoques, qué devuelve cada uno, dónde se rompe cada uno y los aspectos legales básicos.
¿Por qué hacer scraping de GitHub?
Los datos públicos de GitHub impulsan toda una categoría de trabajo de desarrolladores, reclutamiento e investigación de mercado:
- Sourcing de desarrolladores y reclutamiento — encuentra y ordena users por lenguaje, ubicación e historial de contribuciones.
- Seguimiento de dependencias open-source y competidores — vigila stars, forks, releases y la rotación de contributors en los proyectos de los que dependes o con los que compites.
- Investigación de tendencias tecnológicas y mercado — sigue repos y lenguajes en tendencia para ver hacia dónde se mueve el ecosistema.
- Developer relations y outreach — construye listas dirigidas de maintainers y stargazers de proyectos relevantes.
- Pipelines de AI / LLM — alimenta metadatos de repos, READMEs y notas de release en flujos de retrieval y análisis.
¿Es legal hacer scraping de GitHub?
Opción 1: DIY en Python (y por qué se rompe)
La mayoría de los enfoques DIY empiezan con la API REST oficial vía requests (o PyGithub):
import requests
h = {"Authorization": "Bearer YOUR_GH_TOKEN", "Accept": "application/vnd.github+json"}
repo = requests.get("https://api.github.com/repos/torvalds/linux", headers=h).json()
contributors = requests.get("https://api.github.com/repos/torvalds/linux/contributors",
headers=h, params={"per_page": 100}).json()
Funciona para extracciones pequeñas, luego choca con paredes:
- La cuota de límite de tasa. Las requests sin autenticar están limitadas a 60/hora por IP; un token eleva el core a 5.000/hora. Analizar 1.000 repos con ~5 llamadas cada uno (detail, contributors, languages, releases, stargazers) agota la cuota horaria completa en un solo escaneo.
- La búsqueda es más estricta y tiene tope. La Search API funciona a ~30 requests/minuto y devuelve como máximo 1.000 resultados por query — así que no puedes paginar más allá de los primeros 1.000 resultados, sin importar cuántos existan.
- Límites de tasa secundarios. Las requests en ráfaga o concurrentes activan límites de detección de abuso con
403s yRetry-After, así que necesitas backoff y concurrencia cuidadosa. - El parsing de HTML es peor. Recurrir a
requests+BeautifulSoupen github.com choca con el renderizado del lado del cliente y una deriva de layout frecuente, y aun así activa las mismas defensas anti-bot.
Opción 2: Herramientas sin código
Los extractores visuales y los "actors" de GitHub del marketplace exportan CSV/JSON y sirven para extracciones puntuales, pero resultan incómodos en un pipeline dentro del producto con campos predecibles, y heredan los mismos topes de límite de tasa y paginación.
Opción 3: Una API estructurada de GitHub
Para flujos de trabajo repetibles, una API de GitHub estructurada devuelve JSON normalizado sin malabarismo de tokens ni backoff que gestionar. Busca y luego enriquece:
curl "https://api.crawlora.net/api/v1/github/search/repositories?q=web+scraping&sort=stars" \
-H "x-api-key: $CRAWLORA_API_KEY"
En Python — los repos se direccionan por owner/repo, los users por login:
import requests
h = {"x-api-key": "YOUR_API_KEY"}
base = "https://api.crawlora.net/api/v1"
# 1) Search repositories (paginated: page / per_page)
hits = requests.get(f"{base}/github/search/repositories", headers=h,
params={"q": "web scraping", "sort": "stars", "per_page": 50}).json()["data"]
# 2) Full detail for one repo
repo = requests.get(f"{base}/github/repo/torvalds/linux", headers=h).json()["data"]
La búsqueda devuelve un conteo total más items paginados (los campos son ilustrativos — revisa los docs):
{
"code": 200,
"msg": "OK",
"data": {
"total_count": 18742,
"items": [
{ "full_name": "torvalds/linux", "owner": "torvalds", "language": "C", "stars": 180000, "forks": 53000, "topics": ["kernel", "linux"], "license": "GPL-2.0" }
]
}
}
La misma key llega a contributors, stargazers, languages, releases, users y trending:
contributors = requests.get(f"{base}/github/repo/torvalds/linux/contributors", headers=h,
params={"per_page": 100}).json()["data"] # login, contributions
langs = requests.get(f"{base}/github/repo/torvalds/linux/languages", headers=h).json()["data"] # bytes per language
user = requests.get(f"{base}/github/user/torvalds", headers=h).json()["data"] # name, company, followers
trending = requests.get(f"{base}/github/trending", headers=h,
params={"language": "python", "since": "daily"}).json()["data"] # stars_today
Pasa page/per_page para recorrer contributors y stargazers, language/since para trending, guarda una fila por repo o user, y vuelve a extraer con periodicidad para seguir stars, releases y rotación de contributors a lo largo del tiempo.
Qué puedes recopilar
- Repositories — name, full_name, owner, description, language, topics, stars, forks, watchers, open_issues, license, default_branch, pushed_at.
- Grafo del repo — contributors (login, contributions), stargazers, forks, desglose por bytes de lenguaje, y releases (tag_name, name, published_at, author).
- Búsqueda — repositories y users, cada uno con total_count e items paginados.
- Users y orgs — perfil (login, name, company, location, blog, followers, public_repos, social_accounts), los repos públicos de un user o una org, y los eventos públicos recientes y repos fijados (pinned) de un user.
- Trending — repositorios en tendencia (con stars_today) y desarrolladores en tendencia, por lenguaje y ventana de tiempo.
Todo son datos públicos de GitHub — cíñete a campos públicos y factuales.
Limitaciones y desafíos comunes
- Los límites de tasa de la API oficial son el verdadero obstáculo. 60/hora sin autenticar, 5.000/hora con un token, y búsqueda a ~30/minuto con tope de 1.000 resultados — una API estructurada absorbe la limitación y la gestión de tokens detrás de una sola key.
- La búsqueda tiene tope de 1.000 resultados. Ningún endpoint pagina más allá de los primeros 1.000 resultados de una query; acota la query (por lenguaje, stars o fecha) para fragmentar conjuntos de resultados grandes.
- Algunas listas están truncadas. GitHub limita las listas de contributors y similares, así que los repos muy grandes no devolverán a todos los contributors — planifica en torno a ese tope.
- Los perfiles contienen datos personales. Nombres, empresas, ubicaciones y cuentas sociales vinculadas son datos personales bajo GDPR/CCPA — recopila campos públicos y factuales con una base legal.
Dónde se usa esto
- Sourcing de desarrolladores — ordena users por lenguaje, ubicación e historial de contribuciones para reclutamiento o dev-rel.
- Enriquecimiento de empresas y tecnología — mapea los repos, lenguajes y ritmo de releases de una org. Consulta el caso de uso company data enrichment.
- Seguimiento de tendencias OSS — vigila repos y lenguajes en tendencia para detectar hacia dónde se mueve el ecosistema.
Fuentes
Empieza a recopilar
Pruébalo primero, gratis: ejecuta cualquier URL pública en el Free Web Scraper, o comprueba si un sitio bloquea bots con el Anti-Bot Checker — sin registro.
Prueba los endpoints en el Playground, revisa el esquema en los API docs y consulta los pricing. Los repos son solo parte de la historia — how to scrape Product Hunt cubre dónde se lanzan y se descubren esos proyectos open-source, y how to scrape job postings cubre la demanda de contratación de desarrolladores justo al lado del código mismo. Consulta también how to choose a web scraping API e is web scraping legal.
Parte de nuestra serie de guías how-to-scrape — todas las plataformas que cubrimos, en un solo índice.
Preguntas frecuentes
¿Puedo hacer scraping de GitHub sin que me bloqueen?
Los repos y perfiles públicos se pueden scrapear, pero la API oficial de GitHub limita mucho la tasa — 60 requests/hora sin autenticar, 5.000/hora con un token —, la búsqueda tiene tope de 1.000 resultados, y las requests en ráfaga activan límites secundarios con 403s. Una API estructurada absorbe la limitación, el backoff y la gestión de tokens detrás de una sola key. Recopila solo campos públicos y factuales.
¿GitHub tiene una API oficial?
Sí — una API REST y GraphQL capaz. Pero tiene límite de tasa (60/hora sin autenticar, 5.000/hora con un token), y la Search API funciona a unas 30 requests/minuto y devuelve como máximo 1.000 resultados por query, así que escanear miles de repos o users agota la cuota rápido. Ahí es cuando una API de scraping estructurada es la mejor opción.
¿Cómo se direccionan los repos y users de GitHub?
Los repositories por owner/repo (por ejemplo torvalds/linux), los users por login y las organizations por name. La búsqueda devuelve items coincidentes con un total_count, y cada endpoint de detalle — contributors, stargazers, languages, releases — recibe esos identificadores.
¿Qué datos de GitHub puedo recopilar?
Datos públicos: metadatos de repos (stars, forks, language, topics, license, pushed_at), contributors, stargazers, un desglose por bytes de lenguaje, releases, perfiles de users y orgs, los repos públicos de un user o una org, eventos públicos recientes, repos fijados (pinned), y repositorios y desarrolladores en tendencia.
¿Puedo paginar por todos los stargazers y contributors?
Sí — pasa page y per_page para recorrer stargazers y contributors. Ten en cuenta que GitHub limita algunas listas (los repos muy grandes no devuelven a todos los contributors) y que la búsqueda tiene tope de 1.000 resultados por query, así que fragmenta conjuntos de resultados grandes por lenguaje, stars o fecha.
¿Los datos de perfil de GitHub son datos personales?
Los datos públicos de repos y stars son factuales, pero el nombre, la empresa, la ubicación, el email y las cuentas sociales vinculadas de un user son datos personales bajo GDPR/CCPA. Recopila campos públicos y factuales con una base legal, y no hagas scraping de perfiles para spam o reventa.
¿Con qué frecuencia puedo actualizar los datos de GitHub?
Vuelve a ejecutarlo con periodicidad. Los stars, forks, trending, releases y conteos de contributors cambian constantemente, así que extrae los endpoints que sigues (repo, trending, releases) con un ritmo fijo y guarda una fila por snapshot para construir una serie temporal.