Última actualización: 15 de diciembre de 2023

3.7. 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.

Para instalarlo ejecute el siguiente comando:

$ pip3 install requests

Para usarla desde la consola interactiva de comando 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)

Eso da como resultado:

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

Ejemplo:

Se utilizará la función requests.get() en el sitio https://www.python.org/ 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, ligado al nombre sitio.

>>> sitio = requests.get("https://www.python.org/")

Los encabezados de la petición contenidos en el atributo sitio.headers.

>>> print(sitio.headers)

Eso da como resultado:

{
    'Connection': 'keep-alive',
    'Content-Length': '50872',
    'Server': 'nginx',
    'Content-Type': 'text/html; charset=utf-8',
    'X-Frame-Options': 'DENY',
    'Via': '1.1 vegur, 1.1 varnish, 1.1 varnish',
    'Accept-Ranges': 'bytes',
    'Date': 'Fri, 11 Nov 2022 05:44:23 GMT',
    'Age': '868',
    'X-Served-By': 'cache-iad-kiad7000025-IAD, cache-pdk17821-PDK',
    'X-Cache': 'HIT, HIT',
    'X-Cache-Hits': '424, 2',
    'X-Timer': 'S1668145464.920838,VS0,VE0',
    'Vary': 'Cookie',
    'Strict-Transport-Security': 'max-age=63072000; includeSubDomains'
}

El mensaje de estado resultante contenido en el atributo sitio.status_code.

>>> print(sitio.status_code)
>>> 200

El contenido de la respuesta contenido en el atributo sitio.content.

>>> print(sitio.content)

Eso da como resultado:

>>> b'<!DOCTYPE html>\n<html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es">\n  <head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />\n    <title>Cursos Pythonista \xe2\x80\x94 Pythonista</title>\n    <link rel="shortcut icon" type="image/x-icon" href="/++theme++barceloneta/barceloneta-favicon.ico" />\n    <link rel="apple-touch-icon" href="/++theme++barceloneta/barceloneta-apple-touch-icon.png" />\n    <link rel="apple-touch-icon-precomposed" sizes="144x144" href="/++theme++barceloneta/barceloneta-apple-touch-icon-144x144-precomposed.png" />\n    <link rel="apple-touch-icon-precomposed" sizes="114x114" href="/++theme++barceloneta/barceloneta-apple-touch-icon-114x114-precomposed.png" />\n    <link rel="apple-touch-icon-precomposed" sizes="72x72" href="/++theme++barceloneta/barceloneta-apple-touch-icon-72x72-precomposed.png" />\n    <link rel="apple-touch-icon-precomposed" sizes="57x57" href="/++theme++barceloneta/barceloneta-apple-touch-icon-57x57-precomposed.png" />\n    <link rel="apple-touch-icon-precomp <a href="http://plone.com" target="_blank" title="Este sitio ha sido construido usando el CMS/WCM de Fuentes Abiertos Plone.">Powered by Plone &amp; Python</a>\n    </div>\n  </section>\n\n\n  \n\n</div>\n\n\n\t</div>\n</div>\n\n<script>\n  (function(i,s,o,g,r,a,m){i[\'GoogleAnalyticsObject\']=r;i[r]=i[r]||function(){\n  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),\n  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)\n  })(window,document,\'script\',\'https://www.google-analytics.com/analytics.js\',\'ga\');\n\n  ga(\'create\', \'UA-100381738-1\', \'auto\');\n  ga(\'send\', \'pageview\');\n\n</script>\n    </div>\n    </footer></body>\n</html>'

Se cerrará la conexión mediante el método sitio.close().

>>> sitio.close()

Ejemplo:

Se utilizará la función requests.get() en el sitio https://www.python.org/ (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, ligado al nombre sitio.

  • El mensaje de estado resultante contenido en sitio.status_code.

  • El contenido del atributo sitio.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://python.net.ve/") as sitio:
    print(sitio.status_code)
    print(sitio.content)

Eso da como resultado:

404
b'{{"error_type": "NotFound"}}'

Ejemplo:

Se utilizará la función requests.get() para acceder a https://www.python.org/ (el cual hace un redireccionamiento a https://www.python.org/) 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, ligado al nombre sitio.

  • El mensaje de estado resultante, perteneciente a sitio.status_code.

  • Los encabezados de la petición pertenecientes a sitio.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://www.python.org.ve/") as sitio:
    print(sitio.status_code)
    print(sitio.headers)

Eso da como resultado:

301
{'Connection': 'keep-alive', 'Content-Length': '162', 'Server': 'GitHub.com', 'Content-Type': 'text/html', 'Location': 'https://python.org.ve/', 'X-GitHub-Request-Id': '0826:9F17:11E9180:17AE001:636E4811', 'Accept-Ranges': 'bytes', 'Date': 'Fri, 11 Nov 2022 13:05:33 GMT', 'Via': '1.1 varnish', 'Age': '139', 'X-Served-By': 'cache-bog2260021-BOG', 'X-Cache': 'HIT', 'X-Cache-Hits': '1', 'X-Timer': 'S1668171933.114927,VS0,VE1', 'Vary': 'Accept-Encoding', 'X-Fastly-Request-ID': '5a964704946146b01877b48fec066858a86a3afb'}

3.7.1. Ejemplos prácticos para el uso de HTTP

El sitio https://httpbin.org/ incluye ejemplos ilustrativos de los posibles usos del protocolo HTTP.

Ejemplo:

Se utilizará requests.get() para obtener un recurso que corresponde a una imagen.

>>> cerdo = requests.get("https://httpbin.org/image/png")
>>> print(cerdo.content)

Eso da como resultado:

>>> b"\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00d\x00\x00\x00d\x08\x02\x00\x00\x00\xff\x80\x02\x03\x00\x00\x1faIDATx\x9c\xdd}wXS\xd9\xd6\xfeJ#\xa1\x17\xc1 \x02\xa1\x08\xc1J\x19\x11E\x10\x1c\x11\x14\x10\xf8tl(\xea\xd8FGGT\xac\x9f\\\xeb\x8c\x0eV\xd4\xb1\xdca\xe4\n\xb6\x11\x1bEA\x14QA\x94&\x82\xa2B\x00EzoI \x10\x92\xf3\xfbc\x87\x10!\xc4$D\x7fw\xbe\xf7\xe1\xe199gg\xadu\xde\xb3\xf7>{\xaf\xbd\xd6\x0e\x0e\xc30\x00`\xb3\xd9\xc7\x8e\x1dKJJ\xca\xc9\xc9\xe9\xec\xec$\x93\xc9\x14\n\x85\xdc\x03UUU\x1a\x8dfjjjbbbjj\x8a\x0eTTT`\x10\xc00\xac\xbc\xbc\xbc\xb0\xb0\x90\xc1`0\x18\x8c\xf2\xf2r&\x93\xc9b\xb1\x98L&\x93\xc9\xe4\xf3\xf9\xea\"000\xb0\xec\x81\x89\x89\t\x81@\x18\x8c\xea\xf6\xf6\xf6\xd2\xd2\xd2\x8f\x1f?~\xfc\xf8\x11\x1d|\xfa\xf4\x89\xcdfw\x8a\x80\xc3\xe1\x90\xc9d;;;77\xb7\xa0\xa0 UUU\x81\xd1\xa9\xa9\xa9&&&2\xe9\xc3\xe3\xf1vvvAAAw\xef\xdemmm\xc5\xa4Fyy\xf9\x993g\xa6O\x9f\xae\xac\xac,\xdf\xad*))9;;\x1f;v\xac\xa4\xa4Dz\xbd\xad\xad\xadw\xef\xde\r\n\n\xb2\xb3\xb3\xc3\xe3\xf12i411IMM\xc50\x0c\xc7f\xb3\xad\xac\xac\xca\xcb\xcb\x01\xc0\xd6\xd4t2\x9d\xae\xa9\xa2\xc2\xe1r;\xb9\xdcN.\x17\x1d\xb4wu\x9574|\xac\xabk\xeb\xe8\xe8/\x8b@ \xd8\xd9\xd9yyy-_\xbe\xdc\xc8\xc8H\xac\xbe\xfc\xfc\xfc\xe8\xe8\xe8\x98\x98\x98\xec\xec\xec\xfeWU\xc9d\x9a\x9e\x9e\x86\xb2\xb2\x86\x8a\x8a:\x85\xa2\xa1\xa2\x82\x03`r8m\xed\xed\xe8\x7fYC\x83X\xd5c\xc6\x8c\xf1\xf3\xf3\xf3\xf5\xf5\x1d?~\xbcX\xbd\xe5\xe5\xe5\xe1\xe1\xe1\xf7\xee\xdd\xcb\xc9\xc9\xe1\xf1x\xfd\x0bh(+\x9b\x0e\x1dj\xa4\xab\xab\xa2\xa4D&\x91($\x12\x99DB\x07\xad\xed\xedi\x85\x85\xaf>~\x04\x00##\xa3\x82\x82\x02\xdc\xbe}\xfb\xf6\xec\xd9\x03\x00!\x8b\x16m\xf3\xf5\x1d\x90^\x00\x00hb\xb1J\xeb\xeb?\xd6\xd5\xbd)+{\xf2\xf6mzQQ'\x97+\xbc\x8a\xc7\xe3g\xce\x9c\xb9z\xf5j///\x02\x81\xc0\xe3\xf1\xd2\xd2\xd2bbbbbbJJJD\xe5\x18\xeb\xea\xce\xb0\xb1\x19cdd5|\xb8\xd5\xf0\xe1\x86::8\x1cN\xb2\xea\xea\xe6\xe6\x82\xaa\xaa\xc2\xaa\xaaw\x15\x15\x0f\xf2\xf2\n\xab\xaaD\xaf\x1a\x1a\x1a\xfa\xf8\xf8\xf8\xf9\xf9\xb9\xba\xba\x92H$\x1e\x8fw\xef\xde\xbd?\xff\xfc3!!\x81\xcf\xe7\x0b\x8b\x91I\xa4\x89\x16\x16\xae\xa3G\x8f566\x1d:\xd4DOOGMM\xb2\xde\xc311\xdb\xaf\\\x01\x80}\xfb\xf6\xe1\xa6L\x99\x92\x92\x922\x8eF\xcb=|\x18Y\\\xd1\xd8\xf8Wr\xf2\xd3w\xef\xf08\x1c\x1e\x87\xc3\xe3\xf1d\"\xd1\xd6\xd4t\x92\xa5\xa5\x83\x85\x856j\xbd\x00\x00\xc0\xe1r\x9f\x17\x16>~\xfb6177K\x84\x0e\x03\x03\x03{{\xfb\x97/_VTT\x88*\xb6\xa6\xd1|\xed\xed\xfd\xec\xedmMM%\x9b\xf8E\x14TV\xc6dgGgff\x14\x17\xa3n\x17AWW\xd7\xde\xde>77\xb7\xba\xbaZx\xd2\xde\xdc\xdc\xc3\xc6f\xea\xe8\xd1\x8et:\x85D\x02\x80f6;\x9d\xc1H/*z\xc1`d\x16\x17\xb7\xb6\xb7\x0b\x0b\x9bQ\xa9\xcb\xa7N\xdd0s\xa6\xba\xb22\x00`\x18f\xb3m\xdb\xebO\x9f\xa6L\x99\x82\xb3\xb0\xb0(**\n\x982%r\xfdz\x00\xc8\xfb\xf4i\xfc\x8e\x1d\xdd\xe2j,\x00\xe0p8\xba\x81\xc1\xb41c\xd6\xcd\x981r\xf8p\xd1Ko\xca\xca\xfeLJ\xba\x9c\x9a\xda\xc2f\x8b\x9e'\x12\x08\xceVV~\x13&\xf8\x8c\x1fo\xa2\xa77H\x8e\xfa\xa3\xa6\xa5%6;;:++9?_\xb4\x9a\x03\x80\x96\xaa\xeabg\xe7\xd5nnc\x8d\x8d\xd1\x19>\x86\xdd\xcb\xc99\x9d\x90\96(ZZZ\x18\x0c\x06\xfa\x99\xd1\xc2\xc2\xc2\x8a\x8a\n)\x7ff\xd4\xd2\xd2\xf2\xeb54\xc9\xf8\x7f\xba\xe7w\xc2\x98Sl\xa3\x00\x00\x00\x00IEND\xaeB`\x82"

Para desplegar una imagen se utilizará la función Image del módulo iPython.display.

Nota: El paquete IPython sólo está disponible si se tiene instalado iPython o Jupyter.

>>> from IPython.display import Image
>>> Image(cerdo.content)

Eso da como resultado:

Imagen generada

Se cerrará la conexión mediante el método cerdo.close().

>>> cerdo.close()

Ejemplo:

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.

>>> respuesta = requests.post("https://httpbin.org/post", json={"saludo": "Hola"})
>>> respuesta.json()

Eso da como resultado:

{
    '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.22.0'},
    'json': {'saludo': 'Hola'},
    'origin': '200.82.210.213, 200.82.210.213',
    'url': 'https://httpbin.org/post'
}

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. GMT-4 - Caracas, Venezuela.

La hora aquí es actualmente 7:35 PM GMT-4.

Mi objetivo es responder a todos los mensajes dentro de un día hábil.

Contrata mi increíble soporte profesional