Blog
Solicitudes HTTP en Python con Requests

Instalar y usar la librería Requests
Explorar funciones y clases de la librería Requests
Hacer solicitudes GET y POST con Requests
Utilizar el contenido descargado por las solicitudes
Cuando estamos comenzando a trabajar en el mundo del Desarrollo Web o el Web Scraping, es decir, recorrer páginas de internet recolectando información, una tarea bastante común es realizar “requests” o solicitudes a un servidor web para que este nos entregue los archivos que queremos. Desde el nacimiento de Python, se ha utilizado la librería urllib
para realizar estas tareas, pero esta librería fue escrita en otro tiempo, para otra web y no está adaptada para las necesidades de la web actual. A nuestro rescate, fue creada la libreria requests
, una librería capaz de facilitar y abstraer el proceso de hacer solicitudes HTTP en Python en gran manera.
Librería Requests en Python
La librería requests
nos permite enviar solicitudes HTTP con Python sin necesidad de tanta labor manual, haciendo que la integración con los servicios web sea mucho más fácil. No es necesario agregar manualmente consultas a las URLs o de convertir información a formularios para realizar una solicitud POST. Todo esto es logrado gracias a la buena integración de urllib3
en Requests.Tal vez muchos de estos conceptos no signifiquen nada para ti pero pronto lo harán.
Instalar Requests en Python
Ya que es una librería de Python, podemos instalar Requests con nuestro administrador de paquetes pip
:
pip install requests
o con easy_install:
easy_install requests
También podemos descargar el código fuente desde GitHub ya que esta siempre disponible:
git clone git://github.com/kennethreitz/requests.git
Realizar solicitudes HTTP en Python
Bien, veamos como realizar una de las tareas más comunes cuando estamos trabajando con la librería request
: hacer una solicitud HTTP con el método GET. Cuando visitamos una página web o descargamo algún archivo o imagen desde nuestro navegador, lo que en realidad estamos haciendo es una petición GET al servidor web que contiene los archivos que necesitamos. En el caso de una página web, lo que sucede tras bastidores es que solicitamos un archivo HTML al servidor web donde está alojado para que nuestro navegador lo pueda rederizar y mostrarlo apropiadamente.
Para realizar una solicitud HTTP con Python, usamos la función requests.get()
de la librería. Veamos su sintaxis:
response = requests.get(url)
Cuando ejecutamos una solicitud GET el servidor nos devuelve una respuesta (response) que en Python esta representada como un objeto Response.
>>> import requests >>> response = requests.get('http://www.aprenderpython.net') >>> response <Response [200]>
Este objeto Response tiene el código 200, esto quiere decir que la solicitud fue exitosa y que nuestra variable response
contiene un objeto Response. Podemos obtener toda la información que necesitemos a partir de este objeto (contenido, estado del sitio web, encabezados). Si queremos, por ejemplo, ver el código HTML del archivo que hemos descargado para analizarlo podemos llamar al parámetro response.text
.
>>> import requests >>> r = requests.get('https:/www.aprenderpython.net') >>> r.text '<!DOCTYPE html><html class="no-js" lang="es-ES" prefix="og: http://ogp.me/ns#"><head itemscope itemtype="http://schema.org/WebSite"><meta charset="UTF-8"> <!-- Always force latest IE rendering engine (even in intranet) & Chrome Fram...
Pero el método GET no es el único tipo de solicitud HTTP que podemos realizar, también podemos usar la librería para hacer otro tipo de peticiones HTTP como: PUT, DELETE, HEAD y OPTIONS:
>>> r = requests.put("http://httpbin.org/put") >>> r = requests.delete("http://httpbin.org/delete") >>> r = requests.head("http://httpbin.org/get") >>> r = requests.options("http://httpbin.org/get")
Contenido de los objetos Response
Gracias a la librería requests
, podemos ver el contenido de nuestras solicitudes HTTP en Python de varias formas para por ejemplo, mostrar archivos multimedia extrayendo el contenido de una respuesta en binario. Por ejemplo, para crear una imagen a partir de datos binarios en una respuesta, podemos usar el siguiente código:
>>> from PIL import Image >>> from StringIO import StringIO >>> import requests >>> url = 'https://www.aprenderpython.net/wp-content/uploads/2017/06/aprenderpython-cursodesde0.png' >>> r = requests.get(url) >>> i = Image.open(StringIO(r.content))
De esta manera, nuestra imagen queda guardada en una variable para su posterior uso. Otras maneras en las que podemos ver el contenido de nuestros objetos Response es en crudo (usando el parámetro r.raw
) y para archivos como los .json, la librería posee una función especial r.json()
que decodifica los datos para mostrarlo en formato .json.
>>> import requests >>> r = requests.get('https://github.com/timeline.json') >>> r.json() [{u'repository': {u'open_issues': 0, u'url': 'https://github.com/...
Peticiones POST
Ya sabemos como hacer peticiones GET para obtener archivos de un servidor web. ¿Pero qué si queremos en vez de obtener datos, enviarlos? Para estas situaciones existen las peticiones POST que nos permiten enviarle una solicitud al servidor para que modifique o use los datos que le demos. Por ejemplo, cuando estamos llenando un formulario para registrarnos en algún sitio web o simplemente para iniciar sesión, todas estas acciones envian nuestros datos con métodos POST.
Para enviar información en forma de formulario, creamos una petición POST y le pasamos un diccionario al argumento data. Este diccionario será codificado automáticamente como formulario al momento de realizar la petición:
import requests params = {'firstname':'Ryan', 'lastname':'Mitchell'} response = requests.post('http://pythonscraping.com/pages/processing.php', data = params) print(r.text)
Este código es un ejemplo del libro de Web Scraping “Web Scraping with Python” que usa esta página web para este ejemplo.
El código HTML del formulario a llenar es el siguiente:
<form method="post" action="processing.php"> First name: <input type="text" name="firstname"><br> Last name: <input type="text" name="lastname"><br> <input type="submit" value="Submit"> </form>
Debemos saber el nombre de las entradas en las que queremos ingresar la información, luego creamos un diccionario que contenga estos datos y realizamos la petición. Nótese que debemos hacer la petición a la URL a la que apunta el formulario.
Usando el contenido de una solicitud HTTP
Con cada solicitud que le hagamos a un servidor web, este nos retornará información adicional al contenido de la página, como por ejemplo los headers. Los headers son una lista de atributos o preferencias que envia nuestra computadora cada vez que hacemos una solicitud a un servidor web. HTTP define docenas de headers la mayoría de los cuales no son tan usados. Los siguientes campos sin embargo son usados constantemente por la mayoría de los navegadores web cuando inician cualquier conexión:
- Host
- Connection
- Accept
- User-Agent
- Referrer
- Accept-Encoding
- Accept-Language
Podemos acceder a estos datos a través del parámetro headers
de nuestro objeto Response. Por ejemplo, podemos modificar el header de nuestra solicitud para que el servidor, en lugar de reconocer que nuestra conexión es a través de un script en Python, la tome como una conexión por un navegador web, modificando el User-Agent de nuestro header:
import requests session = requests.Session() headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5)' 'AppleWebKit 537.36 (KHTML, like Gecko) Chrome', 'Accept':'text/html,application/xhtml+xml,application/xml;' 'q=0.9,image/webp,*/*;q=0.8'} url = 'https://www.whatismybrowser.com/'\ 'developers/what-http-headers-is-my-browser-sending' req = session.get(url, headers=headers)
Crear un objeto BeautifulSoup con el HTML de nuestro Response
BeautifulSoup es una librería de Python que nos ayuda a darle formato y organizar código HTML para poder usarlo como un objeto Python que represente estructuras en XML.
import requests from bs4 import BeautifulSoup html = requests.get('http://www.aprenderpython.net') bs = BeautifulSoup(html.text), 'html.parser') print(bs.h1)
Resultado en consola:
<h1>Un título interesante</h1>
Programa de ejemplo
A continuación implementaremos un programa que crea un objeto Session con la librería requests
, configura las cookies para que la sesión no se cierre y guarda el texto del perfil al que ingresamos en una variable para su posterior uso.
import requests session = requests.session() params = {'username':'username', 'password':'password'} s = session.post('http://pythonscraping.com/pages/cookies/welcome.php', params) print('[*] Las cookies están configuradas a: ') print(s.cookies.get_dict()) print('[*] Ingresando a página de perfil...') s = session.get('http://pythonscraping.com/pages/cookies/profile.php') html = s.text
Primero creamos un objeto Session con la librería requests
, luego declaramos una variable que tendrá las credenciales para el login. Luego hacemos una solicitud HTTP con el método POST para enviar los datos con los que queremos ingresar, al servidor web. Cuando hacemos una solicitud HTTP a una URL que necesita autentificación, debemos enviar las credenciales de acceso cada vez que queramos ingresar al dominio que las necesite.Con los objetos Session de la librería requests, solo necesitamos enviarlos una vez y estos guardarán las credenciales en las cookies, justo como lo hace nuestro navegador web.
(aprendePython) ➜ python ../../../Practicas/webScrapingPython/scrapingWithPythonBook/chapter10/requests_scraping.py [*]Las cookies estan configuradas con: {'loggedin': '1', 'username': 'username'} [*]Ingresando a página de perfil... [*] Cookies guardadas
Es importante mencionar que podemos obtener archivos json con el modulo requests, ya sea que hagamos una solicitud get o post a una web o API que devuelva como respuesta un objeto json, podemos recibirlo con el modulo requests y luego con el modulo json codificarlo, pero esto es más avanzado para mostrarlo en un ejemplo. Pero si que era importante mencionarlo
Bien, hemos visto varias formas de realizar solicitudes HTTP en Python usando varias de sus librerías, esperamos que hayas podido expandir tus conocimientos en este tema.
➡ ¡Ahora sabes mucho más sobre las solicitudes HTTP, felicitaciones! Te invitamos a tomar nuestro
Curso de redes en Python:
[…] Curso de Redes en Python, 2º clase […]
Hola, muchas gracias por compartir lo que sabes, me gustó cómo está explicado todo bien claro, saludos y feliz año.