Obtener Datos: APIs y Web Scraping
Datos del Mundo RealHasta ahora usamos datos generados o datasets incluidos en librerias. En el mundo real, necesitas obtener datos de fuentes externas: APIs publicas, web scraping, bases de datos, archivos compartidos. Esta leccion te ensenia a obtener datos reales para tus proyectos.
APIs: La Forma Profesional
Una API (Application Programming Interface) te da acceso estructurado a datos de un servicio.
import requests
import pandas as pd
# Ejemplo 1: API del Banco Mundial (datos economicos)
url = 'https://api.worldbank.org/v2/country/ARG;BRA;MEX;COL;CHL/indicator/NY.GDP.MKTP.CD'
params = {
'format': 'json',
'per_page': 250,
'date': '2015:2024'
}
respuesta = requests.get(url, params=params)
print(f"Status: {respuesta.status_code}")
if respuesta.status_code == 200:
datos = respuesta.json()
registros = datos[1] # El segundo elemento tiene los datos
df_pib = pd.DataFrame([{
'pais': r['country']['value'],
'anio': int(r['date']),
'pib_usd': r['value']
} for r in registros if r['value'] is not None])
print(f"\nRegistros obtenidos: {len(df_pib)}")
print(df_pib.head(10))
# Pivot para comparar paises
pivot = df_pib.pivot(index='anio', columns='pais', values='pib_usd')
print("\nPIB por pais (ultimos 5 anios):")
print((pivot / 1e9).tail().round(1)) # En miles de millones
API de tipo de cambio
# API gratuita de tipos de cambio
url = 'https://api.exchangerate-api.com/v4/latest/USD'
respuesta = requests.get(url)
if respuesta.status_code == 200:
datos = respuesta.json()
monedas_latam = ['ARS', 'BRL', 'MXN', 'COP', 'CLP', 'PEN', 'UYU']
df_cambio = pd.DataFrame([
{'moneda': m, 'tipo_cambio': datos['rates'].get(m, None)}
for m in monedas_latam
])
print("Tipos de cambio vs USD:")
print(df_cambio)
API con autenticacion
# Muchas APIs requieren una API key
# Ejemplo con estructura tipica (no ejecutar sin key real)
"""
import os
api_key = os.environ.get('MI_API_KEY', 'tu-api-key-aqui')
headers = {
'Authorization': f'Bearer {api_key}',
'Content-Type': 'application/json'
}
respuesta = requests.get('https://api.ejemplo.com/datos', headers=headers)
"""
Web Scraping con Beautiful Soup
Cuando no hay API disponible, podes extraer datos de paginas web.
from bs4 import BeautifulSoup
import requests
import pandas as pd
# Ejemplo: Scraping de una tabla HTML
# (Wikipedia tiene muchas tablas utiles para practicar)
url = 'https://en.wikipedia.org/wiki/List_of_countries_by_GDP_(nominal)'
# Pandas puede leer tablas HTML directamente
tablas = pd.read_html(url)
print(f"Tablas encontradas: {len(tablas)}")
# La primera tabla suele ser la principal
df_gdp = tablas[0]
print(f"Columnas: {df_gdp.columns.tolist()[:5]}")
print(df_gdp.head())
Scraping manual con BeautifulSoup
# Para cuando pd.read_html no funciona
url = 'https://example.com/datos'
respuesta = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'})
soup = BeautifulSoup(respuesta.text, 'html.parser')
# Encontrar elementos
# titulos = soup.find_all('h2')
# tabla = soup.find('table', class_='datos')
# filas = tabla.find_all('tr')
# etc.
Etica del web scraping
- Revisa robots.txt del sitio (ejemplo: site.com/robots.txt)
- No sobrecargues el servidor (agrega delays entre requests)
- Revisa los terminos de servicio del sitio
- Prefiere APIs cuando esten disponibles
- Cachea los resultados para no hacer requests repetidos
import time
# Buena practica: esperar entre requests
# for url in lista_urls:
# respuesta = requests.get(url)
# time.sleep(1) # Esperar 1 segundo
Datasets Publicos para Proyectos
Estas son fuentes excelentes de datos reales para tu portfolio:
| Fuente | URL | Tipo de Datos |
|---|---|---|
| Kaggle | kaggle.com/datasets | Todo tipo, competencias |
| Google Dataset Search | datasetsearch.research.google.com | Buscador de datasets |
| Datos Argentina | datos.gob.ar | Datos publicos argentinos |
| Banco Mundial | data.worldbank.org | Economicos, sociales |
| UCI ML Repository | archive.ics.uci.edu | Datasets para ML |
| Our World in Data | github.com/owid | Datos globales actualizados |
| Seaborn/Sklearn | Integrados en Python | Datasets de practica |
# Descargar dataset de Kaggle (requiere kaggle CLI)
# pip install kaggle
# kaggle datasets download -d dataset-name
# Descargar de Our World in Data (directo)
url = 'https://raw.githubusercontent.com/owid/covid-19-data/master/public/data/owid-covid-data.csv'
df_covid = pd.read_csv(url)
print(f"Dataset COVID: {df_covid.shape}")
print(df_covid.columns.tolist()[:10])
Video Recomendado
Web Scraping con Python - Tutorial Practico
Ejercicio Practico
Crea un notebook 20_obtener_datos.ipynb:
- Consume la API del Banco Mundial para obtener datos de PIB de 5 paises latinoamericanos
- Obtiene tipos de cambio actuales de la API de exchangerate
- Usa pd.read_html para extraer una tabla de Wikipedia
- Combina datos de al menos 2 fuentes diferentes en un solo DataFrame
- Guarda el dataset resultante como CSV para usar en las proximas lecciones
💡 Concepto Clave
Revisemos los puntos más importantes de esta lección antes de continuar.
Resumen
- requests: Libreria para consumir APIs HTTP
- pd.read_html(): Extraer tablas HTML de paginas web
- BeautifulSoup: Scraping manual de paginas complejas
- APIs publicas: La forma mas confiable de obtener datos
- Etica: Respetar robots.txt, agregar delays, preferir APIs
- Siempre guarda los datos crudos antes de procesarlos
🧠 Pon a prueba tu conocimiento
¿Cuál es el aspecto más importante que aprendiste en esta lección?
- Comprendo el concepto principal y puedo explicarlo con mis palabras
- Entiendo cómo aplicarlo en mi situación específica
- Necesito repasar algunas partes antes de continuar
- Quiero ver más ejemplos prácticos del tema
✅ ¡Excelente! Continúa con la siguiente lección para profundizar más.