Solicitudes HTTP en Python, con la Biblioteca Request (Python HTTP for Humans)

En este tutorial voy a explicar paso a paso como utilizar la biblioteca Requests de Python, que nos permite realizar de forma sencilla solicitudes HTTP.

El Protocolo HTTP

Sabemos que HTTP (Hypertext Transfer Protocol) es un protocolo para la transmisión de datos en la Web. Por lo que cuando visitamos una página web, nuestro navegador está realizando una serie de solicitudes HTTP a servidor que tiene alojada la página.

La librería de Python Requests nos facilita la escritura de programas que necesitan enviar y recibir información a través de HTTP. Esto significa que en vez de tener que aprender al detalle como funciona el protocolo HTTP, podemos realizar este tipo de conexiones usando objetos de Python, a través de los cuales podemos enviar/recibir mensajes usando los métodos y atributos  proporcionados por estos objetos.

Instalación

Para instalar requests, utilizamos pip, el sistema de gestión de paquetes de Python.

Una vez instalado, podemos importarlo desde el intérprete de comandos de Python, para comprobar que se ha instalado correctamente.

Métodos HTTP

Los métodos más utilizados por el protocolo HTTP son GET y POST y otros menos utilizados son PUT, HEAD, DELETE, PATCH y OPTIONS.

El método GET es utilizado para solicitar datos y se compone de pares de valores (name y value) los cuales son enviados a través de la dirección URL (Uniform Resource Locator).

Lo más importante que debemos saber sobre el método GET es que no debemos usarlo cuando tratamos con información relevante. Para enviar datos a un servidor de forma segura utilizaremos el método POST. El método POST nos permite enviar datos sensibles y no serán guardados ni en la caché, historial, favoritos, etc …

Modo de Uso

Para empezar a familiarizarnos con Requests vamos a utilizar el método get() y recibimos el contenido de este mismo blog. La URL le indica a la librería Requests el protocolo y la dirección que queremos consultar. Como resultado obtenemos un objeto.

¿Qué es Response?

Response es un objeto con el resultado de nuestra solicitud y el valor que le sigue es el código de estado de dicha solicitud. En este caso 200 indica que la solicitud ha sido completada con éxito.

Podemos acceder al código de estado de una solicitud a través del atributo status_code.

Contenido de una Solicitud

Podemos acceder al contenido de una solicitud a través del atributo content. Veamos los primeros 100 caracteres de la solicitud.

El texto HTML (Hypertext Markup Language) puede ser complicado de leer, pero tu navegador sabe cómo interpretarlo. No hemos tenido que escribir nada de código para encontrar el servidor, realizar la conexión, construir el mensaje HTTP, esperar y decodificar la respuesta.

En el «hipotético caso» de que necesitemos acceder al contenido en bruto (raw) de una solicitud, tenemos que usar el argumento stream=True en la solicitud.

Pero, ¿Qué significa todo esto?, Cuando comprobamos el atributo Content-Encoding en las cabeceras de la solicitud, nos indica que la respuesta ha sido comprimida en formato Gzip, por lo que el contenido ha necesitado ser descomprimido mucho antes de que nosotros pudiéramos leerlo en formato HTML. Por suerte esto es algo que realiza la librería Requests por nosotros.

Para comprobar la codificación de dichos datos utilizamos el atributo encoding.

Las Cabeceras

Las cabeceras también pueden aportarnos información útil y para leer su contenido utilizamos el atributo headers.

Parámetros

Para enviar parámetros a través de la URL, necesitamos hacer uso del argumento params en el método get().

Siempre que necesitamos enviar datos sensibles y que necesitan ser codificados utilizamos POST con el argumento data y sus parámetros en el método post().

Pero, ¿Dónde ha ido toda la información relacionada con estos parámetros?. Serán parte del body o cuerpo del mensaje HTTP. Para ello tenemos que consultar el atributo body.

Si lo que queremos es enviar un fichero, utilizamos el argumento files.

Es muy común enviar y recibir datos en formato JSON y el módulo Request puede realizar la conversión por nosotros usando el parámetro json.

TimeOuts

Podemos detener una solicitud indicando el tiempo exacto en milisegundos, para ello usamos el argumento timeout en el método que estemos utilizando.

Documentación

Más documentación de la librería Requests siguiendo este enlace.

En el caso de tener problemas a la hora de acceder al contenido de una URL, ya sea por disponer de Anti-Bots u otro tipo de protección de Cloudflare podemos usar el módulo de Python Cloudflare-scrape, cuyo funcionamiento se complementa con el módulo Request. Más información en este mismo Blog siguiendo este enlace.

Deja una respuesta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.