Cómo empezar a utilizar la biblioteca Requests en Python

Introducción
En muchas aplicaciones web, es normal conectarse a varios servicios de terceros mediante API. Cuando utilizas estas API, puedes obtener acceso a datos como información meteorológica, resultados deportivos, listas de películas, tweets, resultados de motores de búsqueda e imágenes. También puedes usar API para agregar funcionalidad a tu aplicación. Algunos ejemplos de estas son pagos, programación, correos electrónicos, traducciones, mapas y transferencias de archivos. Si tuvieras que crear cualquiera de estas funciones por tu cuenta, te llevaría mucho tiempo, pero con las API, puedes conectarte a una de ellas y acceder a sus funciones y datos en tan solo unos minutos.
En este artículo, aprenderá sobre la biblioteca de solicitudes de Python , que le permite enviar solicitudes HTTP en Python.
Advertencia: La segunda mitad de este tutorial se basó en claves API gratuitas para Yandex.Translate. En este momento, ya no se emiten de forma gratuita. El resto de este tutorial se presenta tal cual con fines educativos.
Y como usar una API implica enviar solicitudes HTTP y recibir respuestas, Requests te permite usar API en Python. Aquí demostraremos el uso de una API de traducción de idiomas para que puedas ver un ejemplo de cómo funciona.
Prerrequisitos
Para completar este tutorial, necesitarás:
- Este proyecto requerirá que Python esté instalado en un entorno local .
Comprensión de las solicitudes HTTP
Las solicitudes HTTP son la manera en que funciona la web. Cada vez que navegas a una página web, tu navegador realiza varias solicitudes al servidor de la página web. El servidor responde con todos los datos necesarios para mostrar la página y tu navegador la muestra para que puedas verla.
El proceso genérico es el siguiente:
- Un cliente (como un navegador o un script de Python que utiliza solicitudes) enviará algunos datos a una URL.
- Luego, el servidor ubicado en la URL leerá los datos, decidirá qué hacer con ellos y devolverá una respuesta al cliente.
- Finalmente, el cliente puede decidir qué hacer con los datos en la respuesta.
Parte de los datos que el cliente envía en una solicitud es el método de solicitud. Algunos métodos de solicitud comunes son GET, POST y PUT. Las solicitudes GET normalmente solo sirven para leer datos sin realizar ningún cambio, mientras que las solicitudes POST y PUT generalmente sirven para modificar datos en el servidor. Por ejemplo, la API de Stripe te permite usar solicitudes POST para crear un nuevo cargo para que un usuario pueda comprar algo desde tu aplicación.
Nota: Este artículo cubrirá las solicitudes GET porque no modificaremos ningún dato en un servidor.
Al enviar una solicitud desde un script de Python o dentro de una aplicación web, usted, el desarrollador, decide qué se envía en cada solicitud y qué hacer con la respuesta. Por lo tanto, analicemos esto enviando primero una solicitud a DigitalOcean.com y luego utilizando una API de traducción de idiomas.
Paso 1: Instalación de solicitudes de Python
Es una buena idea crear primero un entorno virtual si aún no tienes uno.
Luego, deberás instalar la biblioteca. Instalemos las solicitudes mediante pip
.
- pip install requests
En este punto, su proyecto está listo para usar Solicitudes.
Paso 2: Realizar su primera solicitud
Para comenzar, utilicemos Solicitudes para solicitar el sitio de DigitalOcean.
Crea un archivo llamado script.py
y agrégale el siguiente código. En este artículo, no tendremos mucho código con el que trabajar, por lo que cuando algo cambie, puedes simplemente actualizar el código existente en lugar de agregar nuevas líneas.
script.py
import requestsres = requests.get('https://www.digitalocean.com/')print(res)
Por lo tanto, todo lo que hace este código es enviar una solicitud GET a DigitalOcean. Este es el mismo tipo de solicitud que envió su navegador para ver esta página, pero la única diferencia es que las solicitudes no pueden representar el HTML, por lo que solo obtendrá el HTML sin procesar y la otra información de respuesta.
Estás utilizando la .get()
función aquí, pero Solicitudes te permite utilizar otras funciones como .post()
y .put()
para enviar esas solicitudes también.
Puedes ejecutarlo ejecutando el script.py
archivo.
- python script.py
Y esto es lo que obtendrás a cambio:
OutputResponse [200]
A continuación, investiguemos qué significa un código de estado 200.
Paso 3: Comprensión de los códigos de estado
Lo primero que puedes hacer es comprobar el código de estado. Los códigos HTTP van del 1XX al 5XX. Los códigos de estado más comunes que probablemente hayas visto son 200, 404 y 500.
A continuación se muestra una descripción general rápida de lo que significa cada código de estado:
- 1XX – Información
- 2XX – Éxito
- 3XX – Redirección
- 4XX – Error del cliente (cometió un error)
- 5XX – Error del servidor (cometieron un error)
Generalmente, lo que buscas cuando realizas tus propias solicitudes son códigos de estado en el rango 200.
Las solicitudes reconocen que los códigos de estado 4XX y 5XX son errores, por lo que si se devuelven esos códigos de estado, el objeto de respuesta de la solicitud se evalúa como False
.
Puedes comprobar si una solicitud se ha respondido correctamente comprobando la veracidad de la respuesta. Por ejemplo:
script.py
if res: print('Response OK')else: print('Response Failed')
Y esto es lo que obtendrás a cambio:
OutputResponse [200]Response OK
El mensaje "Response Failed"
solo aparecerá si aparece un código de estado 400 o 500. Intente cambiar la URL por alguna que no tenga sentido para ver que la respuesta falla con un código 404.
Puedes echar un vistazo al código de estado directamente agregando:
script.py
print(res.status_code)
Esto le mostrará el código de estado directamente para que pueda verificar el número usted mismo.
OutputResponse [404]Response Failed404
Aquí se muestra la respuesta, el mensaje del script y el código de estado de la respuesta.
Paso 4: Comprender los encabezados
Otra cosa que puedes obtener de la respuesta son los encabezados. Puedes echarles un vistazo usando el diccionario de encabezados en el objeto de respuesta.
script.py
print(res.headers)
Esto produce el siguiente resultado:
Output{'Date': 'date', 'Content-Type': 'text/html', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Set-Cookie': '__cfduid=id; expires=date; path=/; domain=.digitalocean.com; HttpOnly; SameSite=Lax', 'Last-Modified': 'date', 'Vary': 'Accept-Encoding', 'ETag': 'etag', 'Expires': 'date', 'Cache-Control': 'max-age=time, public', 'Content-Encoding': 'gzip', 'CF-Cache-Status': 'DYNAMIC', 'cf-request-id': 'id', 'Expect-CT': 'max-age=time, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', 'Server': 'cloudflare', 'CF-RAY': 'ray'}
Los encabezados se envían junto con la solicitud y se devuelven en la respuesta. Los encabezados se utilizan para que tanto el cliente como el servidor sepan cómo interpretar los datos que se envían y reciben en la respuesta.
Puedes ver los distintos encabezados que se devuelven. Muchas veces no necesitarás usar la información del encabezado directamente, pero está ahí si la necesitas.
El tipo de contenido suele ser el que necesitas porque revela el formato de los datos (HTML, JSON, PDF, texto, etc.). Pero el tipo de contenido normalmente lo manejan las solicitudes para que puedas acceder a los datos que se devuelven.
Paso 5: Comprender el texto de respuesta
Y, por último, si echas un vistazo a res.text
(esto funciona para datos textuales, como la página HTML que estás viendo actualmente), podrás ver todo el HTML necesario para crear la página de inicio de DigitalOcean. No se mostrará, pero verás que parece pertenecer a DigitalOcean.
script.py
print(res.text)
Esto produce el siguiente resultado:
Output!DOCTYPE htmlhtmlheadmeta charSet="utf-8"/meta http-equiv="x-ua-compatible" content="ie=edge"/meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"/[...]title data-react-helmet="true"DigitalOcean – The developer cloud/titlemeta data-react-helmet="true" name="description" content="Helping millions of developers easily build, test, manage, and scale applications of any size – faster than ever before."/[...]
Si guardara esto en un archivo y lo abriera, vería algo parecido al sitio de DigitalOcean. En una situación real, se realizan varias solicitudes para que una sola página web cargue elementos como imágenes, scripts y hojas de estilo, por lo que si guarda solo el HTML en un archivo, no se parecerá en nada a cómo se ve el sitio de DigitalOcean en su navegador porque solo se realizó una única solicitud para obtener los datos HTML.
Paso 6: Uso de la API de traducción
Ahora pasemos a algo más interesante. Usarás la API de Yandex Translate para realizar una solicitud de traducción de un texto a otro idioma.
Para utilizar la API, primero debes registrarte. Después de registrarte, ve a la API de Translate y crea una clave de API. Una vez que tengas la clave de API, agrégala a tu archivo como una constante. Aquí está el enlace donde puedes hacer todas esas cosas: https://tech.yandex.com/translate/
script.py
API_KEY = 'your yandex api key'
La razón por la que necesitas una clave API es para que Yandex pueda autenticarte cada vez que quieras usar su API. La clave API es una forma liviana de autenticación porque se agrega al final de la URL de la solicitud cuando se envía.
Para saber qué URL debes enviar para utilizar la API, puedes consultar la documentación de Yandex .
Si miras allí, verás toda la información necesaria para usar su API de traducción para traducir texto.
https://translate.yandex.net/api/v1.5/tr.json/translate ? key=API key text=text to translate lang=translation direction [format=text format] [options=translation options] [callback=name of the callback function]
Cuando vea una URL con símbolos ( ), signos de interrogación (
?
) y signos de igual ( =
), puede estar seguro de que la URL es para solicitudes GET. Esos símbolos especifican los parámetros que acompañan a la URL.
Normalmente, los elementos entre corchetes ( []
) serán opcionales. En este caso, format
, options
, y callback
son opcionales. Y key
, text
, y lang
son obligatorios para la solicitud.
Agreguemos un código para enviar a esa URL. Puede reemplazar la primera solicitud que creó con esto:
script.py
url = 'https://translate.yandex.net/api/v1.5/tr.json/translate'res = requests.get(url)
Hay dos formas de agregar los parámetros. Puedes agregarlos directamente al final de la URL o puedes hacer que Requests lo haga por ti. Para lograr esto último, puedes crear un diccionario para nuestros parámetros. Los tres elementos que necesitas son la clave, el texto y el idioma. Vamos a crear el diccionario usando la clave API, 'Hello'
para el texto y 'en-es'
como idioma, lo que significa que quieres traducir del inglés al español.
Si necesitas conocer otros códigos de idioma, puedes consultar esta lista de códigos ISO 639-1 . Concéntrate en la columna 639-1.
Puede crear un diccionario de parámetros utilizando la dict()
función y pasando las claves y los valores que desee en su diccionario.
script.py
params = dict(key=API_KEY, text='Hello', lang='en-es')
Ahora tomamos el diccionario de parámetros y lo pasamos a la .get()
función.
script.py
res = requests.get(url, params=params)
Cuando pasa los parámetros de esta manera, Requests seguirá adelante y agregará los parámetros a la URL por usted.
Ahora, agreguemos una print
declaración para el texto de respuesta y veamos lo que se devuelve en la respuesta.
script.py
print(res.text)
Esto produce el siguiente resultado:
Output{"code': 200, "lang": "en-es", "text": ["Hola"]}
Verá tres cosas: el código de estado, que es exactamente el mismo código de estado de la respuesta, el idioma que especificó y el texto traducido dentro de la lista. Así que debería ver el texto traducido 'Hola'
.
Inténtalo nuevamente con en-fr
el código de idioma y deberías verlo 'Bonjour'
en la respuesta ahora.
script.py
params = dict(key=API_KEY, text='Hello', lang='en-fr')
Esto produce el siguiente resultado:
Output{"code": 200, "lang": "en-fr", "text": ["Bonjour"]}
Echemos un vistazo a los encabezados de esta respuesta particular.
script.py
print(res.headers)
Esto produce el siguiente resultado:
Output{'Server': 'nginx/1.6.2', 'Date': 'Sat, 20 Apr 2019 08:57:01 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length": '46', 'Connection': 'keep-alive', 'Keep-Alive': 'timeout=120', 'X-Content-Type-Options': 'nosniff', 'Cache-Control': 'no-store'}
Los encabezados deberían ser diferentes porque te estás comunicando con un servidor diferente, pero en este caso el tipo de contenido es application/json
en lugar de text/html
. Esto significa que los datos se pueden interpretar como JSON.
Cuando application/json
es el tipo de contenido de la respuesta, puede hacer que Solicitudes convierta la respuesta en un diccionario y una lista para que pueda acceder a los datos más fácilmente.
Para que los datos se analicen como JSON, utilice el .json()
método en el objeto de respuesta.
Si lo imprime, verá que los datos parecen iguales, pero el formato es ligeramente diferente.
script.py
json = res.json()print(json)
Esto produce el siguiente resultado:
Output{'code': 200, 'lang': 'en-fr', 'text': ['Bonjour']}
La razón por la que es diferente es que ya no se trata de texto simple res.text
, sino de una versión impresa de un diccionario.
Digamos que quieres acceder al texto. Como ahora es un diccionario, puedes usar la text
clave.
script.py
print(json['text'])
Esto produce el siguiente resultado:
Output['Bonjour']
Y ahora solo ves los datos de esa clave. En este caso, estás viendo una lista de un elemento, por lo que si quisieras obtener ese texto directamente en la lista, podrías acceder a él por el índice.
script.py
print(json['text'][0])
Esto produce el siguiente resultado:
OutputBonjour
Y ahora lo único que ves es la palabra traducida.
Si cambias algunos parámetros, obtendrás resultados diferentes. Cambiemos el texto que se traducirá de Hello
a Goodbye
, cambiemos el idioma de destino nuevamente a español y enviemos la solicitud nuevamente.
script.py
params = dict(key=API_KEY, text='Goodbye', lang='en-es')
Esto produce el siguiente resultado:
OutputAdiós
Intente traducir texto más largo en diferentes idiomas y vea qué respuestas le brinda la API.
Paso 7: Manejo de casos de error de la API de traducción
Por último, veremos un caso de error. No todo funciona siempre, por lo que es necesario saber cuándo sucede.
Intente cambiar su clave API eliminando un carácter. Al hacerlo, su clave API ya no será válida. Luego, intente enviar una solicitud.
Si observas el código de estado, esto es lo que obtienes:
script.py
print(res.status_code)
Esto produce el siguiente resultado:
Output403
Cuando uses la API, querrás verificar si las cosas funcionan correctamente o no para poder manejar los casos de error según las necesidades de tu aplicación.
Conclusión
En este artículo, aprendió sobre la biblioteca de solicitudes de Python, que le permite enviar solicitudes HTTP en Python.
Esto es lo que aprendiste:
- Cómo funcionan las solicitudes HTTP
- Los distintos códigos de estado posibles en una respuesta
- Cómo enviar solicitudes y recibir respuestas utilizando la biblioteca de solicitudes de Python
- Cómo utilizar una API de traducción de idiomas para traducir texto
- Cómo convertir
application/json
respuestas de contenido en diccionarios
Si desea obtener más información sobre Python, consulte nuestra página de temas de React para ver ejercicios y proyectos de programación.
Deja una respuesta