Logo de fravelz

Notas de Hacking

Fravelz

Request en Python


1) ¿Qué es requests? {#qué-es-requests}

  • requests es una biblioteca de Python de terceros para realizar solicitudes HTTP/HTTPS de forma sencilla y elegante.
  • No viene incluida en la librería estándar de Python, por lo que debe instalarse con pip install requests.
  • Permite hacer peticiones como GET, POST, PUT, DELETE, HEAD, PATCH, etc., y gestionar cabeceras, datos, autenticación, cookies, sesiones, entre otros.
  • Es muy usada para acceder a APIs web, hacer scraping ligero, o interaccionar con servicios HTTP.

2) Instalación y configuración básica {#instalación-y-configuración-básica}

pip install requests

Luego en tú script:

import requests

Asegúrate de que la versión de Python sea compatible (por ejemplo Python 3.8+ según su documentación).

Tip: Usa un entorno virtual (venv) para instalarla sin afectar dependencias globales.


3) Uso básico — Peticiones HTTP {#uso-básico-peticiones-http}

GET {#get}

import requests

response = requests.get("https://api.example.com/data")
print(response.status_code)        # código de estado HTTP
print(response.text)               # contenido como texto
print(response.json())             # si es JSON, lo transforma en dict/list

POST {#post}

Enviar datos:

payload = {"username": "usuario", "password": "secreto"}
response = requests.post("https://api.example.com/login", data=payload)

Enviar JSON:

response = requests.post("https://api.example.com/login", json=payload)

Otros métodos {#otros-métodos}

También puedes usar requests.put(), requests.delete(), requests.head(), requests.patch().


4) Elementos importantes de la respuesta (Response) {#elementos-importantes-de-la-respuesta-response}

Al hacer una petición, obtienes un objeto Response. Algunos atributos y métodos clave:

  • response.status_code → código de estado HTTP (200, 404, 500, etc.).
  • response.text → contenido decodificado como texto (string).
  • response.content → contenido en bytes.
  • response.json() → interpreta el contenido como JSON y devuelve dict o lista (sí aplica).
  • response.headers → diccionario con cabeceras HTTP de la respuesta.
  • response.elapsed → tiempo que tardó la petición.
  • response.raise_for_status() → lanza excepción requests.exceptions.HTTPError sí el código de estado indica error (>=400).

5) Parámetros útiles en la petición {#parámetros-útiles-en-la-petición}

Al llamar a requests.get() o requests.post() puedes pasar varios parámetros adicionales para mayor control:


6) Sesiones (requests.Session) {#sesiones-requests.session}

Una característica potente: puedes crear un objeto Session para persistir ciertas opciones (como cookies, cabeceras comunes, autenticación) entre múltiples peticiones. Mejora el rendimiento al reutilizar conexiones. Ejemplo:

import requests

s = requests.Session()
s.headers.update({"User-Agent": "MiApp/1.0"})
response1 = s.get("https://api.example.com/resource1")
response2 = s.get("https://api.example.com/resource2")

7) Autenticación, SSL y proxies {#autenticación-ssl-y-proxies}

  • Autenticación básica: requests.get(url, auth=(‘user’,‘pass’)).
  • Verificación SSL: por defecto verify=True. Sí el servidor tiene certificado inválido, se puede poner verify=False pero no recomendado en producción.
  • Puedes especificar proxies para HTTP/HTTPS usando el parámetro proxies.

8) Manejo de errores y excepciones {#manejo-de-errores-y-excepciones}

Es importante manejar posibles fallos (timeout, conexión rechazada, etc.). Ejemplo:

import requests

try:
response = requests.get("https://api.example.com", timeout=5)
response.raise_for_status()
except requests.exceptions.HTTPError as errh:
print("HTTP Error:", errh)
except requests.exceptions.ConnectionError as errc:
print("Error de conexión:", errc)
except requests.exceptions.Timeout as errt:
print("Timeout:", errt)
except requests.exceptions.RequestException as err:
print("Otro error:", err)

Este patrón aparece en tutoriales de requests.


9) Ejemplos completos {#ejemplos-completos}

a) Petición GET con parámetros {#a-petición-get-con-parámetros}

import requests

url = "https://httpbin.org/get"
params = {"q": "python", "page": 1}
response = requests.get(url, params=params)
print(response.url)       # muestra la URL final con query string
print(response.status_code)
print(response.json())

b) Petición POST con JSON {#b-petición-post-con-json}

import requests

url = "https://httpbin.org/post"
payload = {"username": "user", "password": "pass"}
response = requests.post(url, json=payload)
print(response.status_code)
print(response.json())

c) Uso de sesión con cookies {#c-uso-de-sesión-con-cookies}

import requests

s = requests.Session()
s.get("https://httpbin.org/cookies/set/sessioncookie/12345")
response = s.get("https://httpbin.org/cookies")
print(response.text)  # Verás que la cookie se mantiene

d) Descarga de archivo por streaming {#d-descarga-de-archivo-por-streaming}

import requests

url = "https://example.com/largefile.zip"
with requests.get(url, stream=True) as r:
r.raise_for_status()
with open("largefile.zip", "wb") as f:
for chunk in r.iter_content(chunk_size=8192):
f.write(chunk)

10) Buenas prácticas y consideraciones {#buenas-prácticas-y-consideraciones}

  • Siempre establece un timeout razonable para evitar que la petición quede colgada.
  • No deshabilites verify=True en producción a menos que sepas lo que haces (evita usar verify=False).
  • Para muchas peticiones al mismo host, utiliza Session para aprovechar persistencia de conexión.
  • Verifica el estado de la respuesta (status_code, raise_for_status()) antes de procesar los datos.
  • Cuando trabajes con APIs, respeta los límites de rate-limit, y maneja redirecciones, errores, retries.
  • Evita exponer en el código credenciales sin protección.
  • Sí haces scraping de páginas web, respeta los términos de uso del sitio, usa cabeceras User-Agent adecuadas y considera la ética/legales.

11) Resumen rápido {#resumen-rápido}

  • Librería simple, pero potente para hacer peticiones HTTP en Python.
  • Abstrae complejidad de urllib y hace que el código sea más legible.
  • Utilizada ampliamente para trabajar con APIs, servicios web, scraping ligero.
  • Soporta múltiples métodos HTTP, sesiones, autenticación, verificación SSL, proxies.
  • Debes instalarla aparte y aplicarla con buenas prácticas.