En el mundo del análisis de datos y la automatización, la capacidad de extraer información de la web es crucial. Dos técnicas populares para lograr esto son el Web Scraping y el uso de APIs REST. Este artículo te guiará a través del proceso de utilizar Python para realizar Web Scraping interactuando con APIs REST, permitiéndote automatizar la recopilación de datos de manera eficiente y estructurada.
Diferencias entre Web Scraping y APIs
Web Scraping implica extraer información directamente del código HTML de una página web. Esto se hace analizando el HTML y seleccionando los datos relevantes. Es útil cuando no hay una API disponible o cuando la API existente no proporciona los datos que necesitas.
Por otro lado, una API (Application Programming Interface) es una interfaz que permite a diferentes aplicaciones comunicarse entre sí. Las APIs REST (Representational State Transfer) son un tipo común de API que utiliza el protocolo HTTP para realizar solicitudes (GET, POST, PUT, DELETE) y obtener datos en formatos como JSON o XML. Usar una API es generalmente más eficiente y menos propenso a errores que el Web Scraping, ya que los datos están estructurados y diseñados para ser consumidos por aplicaciones.
La principal diferencia radica en la fuente de los datos y la forma en que se acceden a ellos. El Web Scraping extrae datos directamente del HTML de un sitio web, mientras que las APIs REST proporcionan datos estructurados a través de una interfaz definida.
Uso de requests y JSON en Python
Para interactuar con APIs REST en Python, utilizaremos la librería requests
, que facilita el envío de solicitudes HTTP. Primero, debes instalar la librería:
pip install requests
Luego, puedes realizar una solicitud GET a una API:
import requests
url = 'https://api.ejemplo.com/datos'
response = requests.get(url)
if response.status_code == 200:
data = response.json()
print(data)
else:
print(f'Error: {response.status_code}')
En este ejemplo, response.json()
convierte la respuesta de la API (que generalmente está en formato JSON) en un diccionario de Python, lo que facilita el acceso a los datos.
El formato JSON (JavaScript Object Notation) es un estándar para la transmisión de datos que se basa en pares clave-valor y listas. Python tiene un módulo incorporado, json
, que facilita la manipulación de datos JSON.
import json
data = {
'nombre': 'Ejemplo',
'valor': 123,
'lista': [1, 2, 3]
}
json_data = json.dumps(data)
print(json_data)
loaded_data = json.loads(json_data)
print(loaded_data['nombre'])
Autenticación y Tokens en APIs
Muchas APIs requieren autenticación para proteger sus datos. Esto a menudo implica el uso de tokens, que son cadenas alfanuméricas que identifican a un usuario o aplicación.
Una forma común de autenticación es a través de un token de portador (Bearer Token), que se incluye en el encabezado de la solicitud HTTP:
import requests
url = 'https://api.ejemplo.com/protegido'
headers = {
'Authorization': 'Bearer TU_TOKEN_AQUI'
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
data = response.json()
print(data)
else:
print(f'Error: {response.status_code}')
Otra forma es usar claves API, que se pasan como parámetros en la URL:
import requests
url = 'https://api.ejemplo.com/protegido?api_key=TU_CLAVE_AQUI'
response = requests.get(url)
if response.status_code == 200:
data = response.json()
print(data)
else:
print(f'Error: {response.status_code}')
Algunas APIs utilizan autenticación OAuth, que es un proceso más complejo que implica obtener un token de acceso a través de una serie de pasos de autorización. La librería requests-oauthlib
puede ayudar con esto.
Ejemplo de Extracción de Datos
Vamos a ilustrar la extracción de datos con un ejemplo práctico. Supongamos que queremos obtener información sobre libros de una API ficticia. La API requiere un token de portador para la autenticación.
import requests
API_URL = 'https://api.ejemplo.com/libros'
API_TOKEN = 'TOKEN_DE_EJEMPLO'
headers = {
'Authorization': f'Bearer {API_TOKEN}'
}
def obtener_libros():
response = requests.get(API_URL, headers=headers)
if response.status_code == 200:
return response.json()
else:
print(f'Error al obtener libros: {response.status_code}')
return None
libros = obtener_libros()
if libros:
for libro in libros:
print(f"Título: {libro['titulo']}, Autor: {libro['autor']}")
Este código se conecta a la API, autentica con el token, y luego imprime el título y el autor de cada libro obtenido.
Si la API ofreciera paginación, podríamos agregar un bucle para iterar a través de las diferentes páginas:
def obtener_libros_paginado(page=1):
url = f'{API_URL}?page={page}'
response = requests.get(url, headers=headers)
if response.status_code == 200:
return response.json()
else:
print(f'Error al obtener libros (página {page}): {response.status_code}')
return None
page_number = 1
while True:
libros = obtener_libros_paginado(page_number)
if not libros:
break
for libro in libros:
print(f"Título: {libro['titulo']}, Autor: {libro['autor']}")
page_number += 1
En resumen, utilizar Python para interactuar con APIs REST es una forma eficiente y estructurada de realizar Web Scraping. La combinación de las librerías requests
y json
facilita la extracción y manipulación de datos. La autenticación a través de tokens y claves API asegura que solo las aplicaciones autorizadas puedan acceder a los datos. Con este conocimiento, puedes automatizar la recopilación de datos de manera efectiva y construir aplicaciones más robustas.