Gestión de peticiones HTTP en Python con la librería requests

La librería requests es una herramienta esencial en Python para interactuar con servicios web. A diferencia de urllib, ofrece una itnerfaz mucho más intuitiva y simplificada, actuando como un envoltorio de alto nivel sobre urllib3. Es importante destacar que requests solo descarga el contenido estático; no ejecuta código JavaScript, por lo que para sitios dinámicos es necesario analizar las peticiones de red subyacentes.

Instalación y métodos básicos

Para comenzar a utilizarla, se instala mediante el gestor de paquetes de Python:

pip install requests

La librería soporta todos los verbos estándar de HTTP. A continuación se muestran ejemplos de su sintaxis básica:

import requests

# Ejemplos de diferentes métodos HTTP
url_base = 'http://httpbin.org'

get_req = requests.get(f'{url_base}/get')
post_req = requests.post(f'{url_base}/post', data={'id': 101})
put_req = requests.put(f'{url_base}/put', data={'actualizar': 'si'})
delete_req = requests.delete(f'{url_base}/delete')
head_req = requests.head(f'{url_base}/get')

Realización de peticiones GET

El método get() permite enviar parámetros de consulta de forma organizada mediante el argumento params, evitando la concatenación manual de cadenas en la URL.

import requests

# Configuración de cabeceras para simular un navegador real
cabeceras_navegador = {
   'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36'
}

parametros_busqueda = {
   'q': 'programación python',
   'page': 2
}

peticion = requests.get(
   'https://www.google.com/search',
   params=parametros_busqueda,
   headers=cabeceras_navegador
)

print(f"URL generada: {peticion.url}")
print(f"Estado de la respuesta: {peticion.status_code}")

Peticiones POST y manejo de sesiones

Las peticiones POST se utilizan normalmente para enviar datos sensibles o grandes volúmenes de información en el cuerpo del mensaje. Para mantener el estado (como cookies de inicio de sesión) entre múltiples peticiones, se recomienda usar requests.Session().

import requests
import re

# Uso de Session para persistir cookies automáticamente
with requests.Session() as cliente_web:
   # 1. Obtener el token CSRF de la página de login
   pagina_login = cliente_web.get('https://github.com/login')
   token_auth = re.search(r'name="authenticity_token" value="(.*?)"', pagina_login.text).group(1)

   # 2. Enviar credenciales
   datos_acceso = {
       'login': 'usuario_ejemplo',
       'password': 'password_seguro',
       'authenticity_token': token_auth,
       'commit': 'Sign in'
   }
   
   respuesta_login = cliente_web.post('https://github.com/session', data=datos_acceso)
   
   # 3. Acceder a un recurso protegido
   perfil = cliente_web.get('https://github.com/settings/emails')
   if respuesta_login.ok:
       print("Acceso concedido al perfil")

Procesamiento de la respuesta (Response)

El objeto devuelto por una petición contiene toda la información del servidor:

  • .text: Contenido de la respuesta decodificado como cadena (string).
  • .content: Conteniod binario (ideal para imágenes o archivos).
  • .json(): Método para deserializar directamente una respuesta en formato JSON.
  • .status_code: Código de estado HTTP.
  • .headers: Diccionario con las cabeceras de respuesta.
# Ejemplo: Descarga de una imagen binaria
url_imagen = "https://ejemplo.com/foto.jpg"
img_data = requests.get(url_imagen).content
with open('archivo_local.jpg', 'wb') as imagen:
   imagen.write(img_data)

# Ejemplo: Procesar JSON
respuesta_api = requests.get('https://api.github.com')
datos = respuesta_api.json()
print(datos.get('repository_url'))

Configuraciones avanzadas

En entornos corporativos o de producción, suelen ser necesarios ajustes de seguridad, proxies y tiempos de espera.

Validcaión SSL y Proxies

import requests
from requests.packages import urllib3

# Desactivar advertencias de certificados inseguros
urllib3.disable_warnings()

config_proxies = {
   'http': 'http://10.10.1.10:3128',
   'https': 'http://user:pass@10.10.1.10:1080',
}

# Realizar petición ignorando verificación SSL y usando proxy
try:
   resp = requests.get(
       'https://sitio-interno.local',
       proxies=config_proxies,
       verify=False,
       timeout=(3.05, 10) # (Conexión, Lectura)
   )
   resp.raise_for_status()
except requests.exceptions.Timeout:
   print("La petición ha excedido el tiempo de espera.")
except requests.exceptions.RequestException as error:
   print(f"Error en la petición: {error}")

Carga de archivos (Multipart-encoded)

Para subir archivos al servidor se utiliza el parámetro files:

url_upload = 'http://httpbin.org/post'
archivos = {'documento': open('reporte.pdf', 'rb')}

subida = requests.post(url_upload, files=archivos)
print(f"Resultado de la subida: {subida.status_code}")

Etiquetas: Python requests HTTP API web-scraping

Publicado el 6-12 22:42