#1 Introducción | Requests en Python (3.11)

Publicado el 10/04/2023 12:04:00 en Programación General.
Author: [x][x] 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...

Comments:


[x]
[x][x] n4ch0m4n (5 m) : 55656 Muy bueno m2, seguí así pa!


[x]
[x][x] MuldeR (5 m) : 55657 Potente la lib! Muy bueno el artículo, me encantó el maqueteado... Usaste el theme default nomás? Esos subtítulos que son, h3? Por ejemplo el de "Autenticación digest (Digest Authentication)". Por otro lado decir que ya estoy deseando ver los primeros scripts que subas, considerando la calidad de tus posts. Estaría bueno que todo esto lo puedas orientar al hacking ;)

Seguí así! Por mi, decir que vas 2 y faltan 3 lmao

Abrazo