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.

Ads Blocker Image Powered by Code Help Pro

Por favor, permite que se muestren anuncios en nuestro sitio web

Querido lector,

Esperamos que estés disfrutando de nuestro contenido. Entendemos la importancia de la experiencia sin interrupciones, pero también queremos asegurarnos de que podamos seguir brindándote contenido de alta calidad de forma gratuita. Desactivar tu bloqueador de anuncios en nuestro sitio nos ayuda enormemente a lograrlo.

¡Gracias por tu comprensión y apoyo!