3.4. Librería requests¶
La librería requests permite hacer peticiones mediante funciones que emulan los métodos del protocolo HTTP, regresando un objeto que contiene los mensajes y datos de la respuesta del servidor a modo de atributos.
requests presenta funcionalidades avanzadas como autenticación, conexiones seguras,
manejo de “cookies”, etc.
3.4.1. Instalación¶
Para instalarlo de crear y activar un entorno virtual, ejecutando el siguiente comando:
virtualenv --python /usr/bin/python3 venv && source ./venv/bin/activate
Para instalarlo ejecute el siguiente comando:
pip3 install requests
Puede probar si la instalación se realizo correctamente, ejecutando el siguiente comando correspondiente a tu sistema operativo:
python3 -c "import requests ; print(requests.__version__)"
Si muestra el numero de la versión instalada de requests, tiene
correctamente instalada la paquete. Con esto, ya tiene todo listo para continuar.
3.4.2. Uso¶
Para usarla desde la consola interactiva de Python, ejecute el siguiente comando:
>>> import requests
Puede consultar la ayuda del método GET de la librería, ejecute el siguiente comando:
>>> help(requests.get)
Si ejecuto el comando anterior, este da como resultado lo siguiente:
Help on function get in module requests.api:
get(url, params=None, **kwargs)
Sends a GET request.
:param url: URL for the new :class:`Request` object.
:param params: (optional) Dictionary, list of tuples or bytes to send in the query string for the :class:`Request`.
:param \*\*kwargs: Optional arguments that ``request`` takes.
:return: :class:`Response <Response>` object
:rtype: requests.Response
Puede consultar la ayuda del método POST de la librería, ejecute el siguiente comando:
>>> help(requests.post)
Si ejecuto el comando anterior, este da como resultado lo siguiente:
Help on function post in module requests.api:
post(url, data=None, json=None, **kwargs)
Sends a POST request.
:param url: URL for the new :class:`Request` object.
:param data: (optional) Dictionary, list of tuples, bytes, or file-like
object to send in the body of the :class:`Request`.
:param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`.
:param \*\*kwargs: Optional arguments that ``request`` takes.
:return: :class:`Response <Response>` object
:rtype: requests.Response
3.4.3. Ejemplos prácticos¶
El sitio https://httpbin.org/ incluye ejemplos ilustrativos de los posibles usos del protocolo HTTP.
3.4.3.1. request GET con response 200¶
Se utilizará la función requests.get() en el sitio https://httpbin.org/headers
para abrir una conexión enviando una petición utilizando el método GET. Se desplegarán
los siguientes datos guardados en el objeto resultante, asignado al nombre website_request.
>>> website_request = requests.get("https://httpbin.org/headers")
Los encabezados de la petición contenidos en el atributo website_request.headers.
>>> print(website_request.headers)
Si ejecuto el comando anterior, este da como resultado lo siguiente:
{
'Date': 'Sun, 16 Feb 2025 14:44:55 GMT',
'Content-Type': 'application/json',
'Content-Length': '225',
'Connection': 'keep-alive',
'Server': 'gunicorn/19.9.0',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Credentials': 'true'
}
El mensaje de estado resultante contenido en el atributo website_request.status_code.
>>> print(f"Código HTTP Response: {website_request.status_code}")
Si ejecuto el comando anterior, este da como resultado lo siguiente:
Código HTTP Response: 200
El contenido de la respuesta contenido en el atributo website_request.content.
>>> print(website_request.content)
Si ejecuto el comando anterior, este da como resultado lo siguiente:
b'{\n "headers": {\n "Accept": "*/*", \n "Accept-Encoding": "gzip, deflate", \n "Host": "httpbin.org", \n "User-Agent": "python-requests/2.32.2", \n "X-Amzn-Trace-Id": "Root=1-67b1f9e7-36514b17484bc9ac228fd167"\n }\n}\n'
Se cerrará la conexión mediante el método website_request.close().
>>> website_request.close()
De esta forma obtuvo el contenido del Headers del Response.
3.4.3.2. request GET recurso imágenes con response 200¶
Se utilizará requests.get() para obtener un recurso que corresponde a una imagen.
>>> pig_image_request = requests.get("https://httpbin.org/image/png")
Puede mostrar el contenido del request con lo siguiente:
>>> print(pig_image_request.content)
Para desplegar una imagen se utilizará la función Image del módulo iPython.display.
>>> from IPython.display import Image
Nota
El paquete IPython está instalado también.
>>> Image(pig_image_request.content)
Si ejecuto el comando anterior, este da como resultado lo siguiente:
Se cerrará la conexión mediante el método pig_image_request.close().
>>> pig_image_request.close()
De esta forma obtuvo el contenido de una imagen y la visualizo la imagen del Response.
3.4.3.3. request GET con response 404¶
Se utilizará la función requests.get() en el sitio https://httpbin.org/get/1 (el cual no
existe) para abrir una conexión enviando una petición que incluye al método GET. Se
desplegarán los siguientes datos guardados en el objeto resultante, asignado al nombre resource_request.
El mensaje de estado resultante contenido en
resource_request.status_code.El contenido del atributo
resource_request.content. En este caso, un mensaje de error.
En este caso se utilizará la declaración with para cerrar la conexión ta pronto se ejecute
el bloque de código inscrito.
with requests.get("https://httpbin.org/get/1") as resource_request:
print(f"Código HTTP Response: {resource_request.status_code}")
print(resource_request.content)
Si ejecuto el comando anterior, este da como resultado lo siguiente:
Código HTTP Response: 404
b'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">\n<title>404 Not Found</title>\n<h1>Not Found</h1>\n<p>The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.</p>\n'
De esta forma obtuvo un código HTTP del Response, con el valor 404 y el valor del contenido del Response.
3.4.3.4. request GET con response 302¶
Se utilizará la función requests.get() para acceder a https://httpbin.org/redirect/5
(el cual hace un redireccionamiento a https://httpbin.org/redirect/4) para abrir una
conexión enviando una petición con el método GET. Se desplegarán los siguientes datos guardados
en el objeto resultante, asignado al nombre request_redirect.
El mensaje de estado resultante, perteneciente a
request_redirect.status_code.Los encabezados de la petición pertenecientes a
request_redirect.headers.
En este caso se utilizará la declaración with para cerrar la conexión ta pronto se
ejecute el bloque de código inscrito.
with requests.head("https://httpbin.org/redirect/5") as request_redirect:
print(f"Código HTTP Response: {request_redirect.status_code}")
print(request_redirect.headers)
Si ejecuto el comando anterior, este da como resultado lo siguiente:
Código HTTP Response: 302
{
'Date': 'Sun, 16 Feb 2025 14:55:27 GMT',
'Content-Type': 'text/html; charset=utf-8',
'Content-Length': '247',
'Connection': 'keep-alive',
'Server': 'gunicorn/19.9.0',
'Location': '/relative-redirect/4',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Credentials': 'true'
}
De esta forma obtuvo un código HTTP del Response, con el valor 302 y los Headers en formato json.
3.4.3.5. request POST con response 200¶
Se utilizará requests.post() para enviar datos en formato JSON
utilizando el método POST a https://httpbin.org. El servidor enviará
de regreso el contenido de la petición.
>>> import requests
>>>
>>> url = "https://httpbin.org/post"
>>> data = {"saludo": "Hola"}
>>>
>>> response = requests.post(url, json=data)
>>> print(f"Código HTTP Response: {response.status_code}")
>>> print(response.json())
Si ejecuto el comando anterior, este da como resultado lo siguiente:
Código HTTP Response: 200
{
'args': {},
'data': '{"saludo": "Hola"}',
'files': {},
'form': {},
'headers': {
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate',
'Content-Length': '18',
'Content-Type': 'application/json',
'Host': 'httpbin.org',
'User-Agent': 'python-requests/2.32.2',
'X-Amzn-Trace-Id': 'Root=1-67b150b3-28bbeb2d4beea271757039a4'
},
'json': {'saludo': 'Hola'},
'origin': '81.61.15.74',
'url': 'https://httpbin.org/post'
}
De esta forma obtuvo un código HTTP del Response, con el valor 200 y el Response en formato json.
3.4.4. Manejo de errores y excepciones¶
Al realizar solicitudes HTTP con requests, es importante manejar errores y excepciones. Por ejemplo desde la consola interactiva de Python, ejecute el siguiente comando:
>>> import requests
>>>
>>> url = "https://httpbin.org/post"
>>> data = {"saludo": "Hola"}
>>>
>>> try:
... response = requests.post(url, json=data)
... response.raise_for_status()
... print(f"Código HTTP Response: {response.status_code}")
... print(response.json())
... except requests.exceptions.RequestException as e:
... print(f"Error en la solicitud: {e}")
...
Si ejecuto el comando anterior, este da como resultado lo siguiente:
Código HTTP Response: 200
{
'args': {}, 'data': '{"saludo": "Hola"}',
'files': {},
'form': {},
'headers': {
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate',
'Content-Length': '18',
'Content-Type': 'application/json',
'Host': 'httpbin.org',
'User-Agent': 'python-requests/2.32.2',
'X-Amzn-Trace-Id': 'Root=1-67b21619-720c122a355c14eb3ebf11c6'
},
'json': {'saludo': 'Hola'},
'origin': '81.61.15.74',
'url': 'https://httpbin.org/post'
}
De esta forma obtuvo un código HTTP del Response, con el valor 200 y el Response en formato json.
Ver también
Consulte la sección de lecturas suplementarias del entrenamiento para ampliar su conocimiento en esta temática.
¿Cómo puedo ayudar?
¡Mi soporte está aquí para ayudar!
Mi horario de oficina es de lunes a sábado, de 9 AM a 5 PM. UTM - Madrid, España.
La hora aquí es actualmente 7:35 PM UTM.
Mi objetivo es responder a todos los mensajes dentro de un día hábil.
