Publicado el 10/04/2023 12:04:00 en Programación General.
Author: M20191 | Total de votos: 5 Vote
En este post desarrollaremos de manera didáctica y clara algunos conceptos básicos-intermedios de la librería requests en Python.
Introducción a requests
'Requests es una biblioteca HTTP elegante y simple para Python, creada para seres humanos.'
Sin mucho más que agregar empecemos con lo bueno...
¿Para qué sirve?
La librería request en Python nos facilita el manejo de peticiones HTTP en base a lo que fue urllib3.
En pocas palabras, esta librería nos permite extraer datos, subirlos, modificarlos, eliminarlos, etc, todo a nivel del protocolo HTTP de manera mucho más fácil.
Instalar requests
Siempre recomiendo instalar los paquetes en un ambiente virtual, de esta manera nos aseguramos de que estén aislados del resto, facilitándonos la vida en muchos aspectos.
# Creamos entorno virtual python -m venv .env cd ./env cd ./Script activate # Luego retrocedemos a la carpeta raíz del proyecto (cd .. & cd ..) # Instalamos con pip pip install requests # o también python -m pip install requests
Métodos básicos de la librería
* GET | requests.get()
* POST | requests.post()
* PUT | requests.put()
* DELETE | requests.delete()
* HEAD | requests.head()
* OPTIONS | requests.options()
Antes de ver el tema de solicitudes es sumamente necesario que entiendas o al menos sepas que son los códigos de estado HTTP
Códigos HTTP (Protocolo de transferencia de hipertexto)
Los códigos de estado HTTP son la parte más fundamental del protocolo HTTP, que se utilizan en la web. Estos códigos son un conjunto de números que indican el resultado de una solicitud HTTP, y se dividen en cinco clases:
* 1xx (informativos)
* 2xx (éxito)
* 3xx (redirecciones)
* 4xx (errores del cliente)
* 5xx (errores del servidor).
Solicitudes básicas con requests
# Ejemplo 1 import requests resp = requests.get('https://google.com') print(resp.status_code) # 200
Explicación:
* requests.get va a devolver un objeto, que contendrá la respuesta del servidor a la una solicitud HTTP
* Luego imprimimos el atributo "status_code" del objeto devuelto. (intenta hacer un dir(resp) a ver que te tira :) )
# Ejemplo 2 import requests import json resp = requests.get('https://random-data-api.com/api/v2/users') print(resp.json()['id']) # print(resp.json().get('id')) #12345
Explicación:
* requests.get va a devolver un objeto, que contendrá la respuesta del servidor a la una solicitud HTTP
* A la respuesta le vamos a dar un formato (dict) para que python la interprete correctamente para posteriormente obtener el value de 'id'
Manejo de errores
import requests try: response = requests.get('http://url.invalid') response.raise_for_status() except requests.exceptions.RequestException as e: # Hubo una excepción ambigua que ocurrió mientras se procesaba su solicitud print('Error:', e) - - - - - - - import requests response = requests.get('http://httpbin.org/status/404') if response.status_code == requests.codes.not_found: # El código de estado es igual a 404 print('La página no fue encontrada') - - - - - - - import requests response = requests.get('http://github.com') # El atributo .url puede diferirse con la url seteada por alguna re-dirección posible. print(response.url) # https://github.com - - - - - - - import requests try: response = requests.get('http://httpbin.org/delay/10', timeout=5) response.raise_for_status() except requests.exceptions.Timeout as e: # La petición caducó. print('El servidor tardó demasiado en responder')
No es el objetivo del post darte un ejemplo de todas las peticiones, si no más bien darte una introducción enriquecedora de requests.
Si quieres ver manejos de errores más a fondo puedes leer: https://requests.readthedocs.io/en/latest/api/#exceptions
Encabezados y parámetros
Las cabeceras (headers) HTTP son piezas de información que contienen metadatos, tales como información de autenticación de seguridad, el agente de usuario utilizado y metadatos de control de la memoria caché.
Estas cabeceras son definidas en la aplicación HTTP, pero también pueden ser personalizadas/modificadas/alteradas si se necesita.
Encabezados (Headers)
Para utilizar Headers HTTP desde request debemos crear un diccionario y establecer en el metodo get() un atributo que contenga el diccionario:
import requests headers = {'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.4 Mobile/15E148 Safari/604.1'} resp = requests.get('https://myhttpheader.com/', headers=headers) print(resp.headers) # {...:...}
Parámetros (Payloads)
Quizás en algún momento nos toque tener que manejar solicitudes y sitios en los cuales debamos establecer parámetros, requests tiene la solución.
Los parámetros tienen el siguiente aspecto https://httpbin.org/get?key1=value1&key2=value2 y se logran de la siguiente manera:
payload = {'key1': 'value1', 'key2': 'value2'} resp = requests.get('https://httpbin.org/get', params=payload) print(resp.url) # https://httpbin.org/get?key2=value2&key1=value1
Cookies
Quizás en algún momento nos toque tener que manejar solicitudes y sitios en los cuales debamos establecer cookies, requests tiene la solución.
Obtener cookies de un sitio.
response = requests.get('https://github.com') response.cookies.keys() # ['_octo', 'logged_in', '_gh_sess'] response.cookies.get('logged_in') #'no'
Establecer cookies en un requests.
import requests # crear un diccionario de cookies cookies = {'nombre_cookie': 'valor_cookie'} # realizar una solicitud GET con cookies response = requests.get('https://ejemplo.com', cookies=cookies) # imprimir la respuesta print(response.text) # obtenemos las cookies seteadas response.cookies.keys()
Autenticación en requests
Quizás en algún momento nos toque tener que manejar solicitudes y sitios en los cuales debamos establecer un usuario y contraseña, requests tiene la solución.
Tipos de autenticación
* Autenticación básica (HTTP Basic Authentication)
* Autenticación con token de acceso (Access Token Authentication)
* Autenticación digest (Digest Authentication)
Autenticación básica (HTTP Basic Authentication)
En este tipo de autenticación se enviá un nombre de usuario y contraseña a través de HTTP.
import requests # definir las credenciales de autenticación username = 'usuario' password = 'contraseña' # crear una solicitud con autenticación básica response = requests.get('https://api.ejemplo.com', auth=(username, password)) # imprimir la respuesta print(response.text)
Autenticación con token de acceso (Access Token Authentication)
Este tipo de autenticación se suele usar frecuentemente en el consumos a APIs para enviar un otken de acceso en lugar de una contraseña.
Se puede establecer un token de acceso en la cabecera 'Authorization' utilizando el esquema 'Bearer'.
import requests # definir el token de acceso token = 'token_de_acceso' # crear una solicitud con autenticación con token de acceso headers = {'Authorization': 'Bearer ' + token} response = requests.get('https://api.ejemplo.com', headers=headers) # imprimir la respuesta print(response.text)
Autenticación digest (Digest Authentication)
Igual a la primera solo que utiliza un método llamado HTTPDigestAuth para el manejo de claves seguras a nivel de red.
import requests # definir las credenciales de autenticación username = 'usuario' password = 'contraseña' # crear una solicitud con autenticación digest response = requests.get('https://api.ejemplo.com', auth=requests.auth.HTTPDigestAuth(username, password)) # imprimir la respuesta print(response.text)
Casos de usos
* Descargar contenido de una página web
import requests response = requests.get('https://www.ejemplo.com') print(response.content) with open('descarga.txt','wb') as descarga: descarga.write(response.content)
* Enviar datos de un formulario
import requests payload = {'nombre': 'Juan', 'apellido': 'Pérez'} response = requests.post('https://www.ejemplo.com/formulario', data=payload) print(response.text)
* Realizar una solicitud con encabezados personalizados
import requests headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} response = requests.get('https://www.ejemplo.com', headers=headers) print(response.text)
* Autenticación básica HTTP
import requests url = 'https://www.ejemplo.com/restringido' username = 'usuario' password = 'contraseña' response = requests.get(url, auth=(username, password)) print(response.text)
* Realizar una solicitud con parámetros de consulta
import requests params = {'parametro1': 'valor1', 'parametro2': 'valor2'} response = requests.get('https://www.ejemplo.com', params=params) print(response.url)
Y infinitos casos más...