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}")