Advertisement
  1. Code
  2. Python

Usando el Módulo de Peticiones en Python

Scroll to top
Read Time: 8 min

Spanish (Español) translation by Rafael Chavarría (you can also view the original English article)

Peticiones es un módulo de Python que puedes usar para enviar todo tipo de peticiones HTTP. Es una librería muy fácil de usar con muchas características variando desde pasar parámetros en URLs a enviar encabezados personalizados y Verificación SSL. En este tutorial, aprenderás cómo usar esta librería para enviar peticiones HTTP simples en Python.

Puedes usar Peticiones con Python versión 2.6–2.7 y 3.3–3.6. Antes de seguir adelante, deberías saber que Peticiones es un módulo externo, así que tendrás que instalarlo primero antes de probar los ejemplos en este tutorial. Puedes instalarlo ejecutando el siguiente comando en la terminal:

1
pip install requests

Una vez que tienes instalado el módulo, puedes verificar si ha sido instalado exitósamente importándolo usando este comando:

1
import requests

Si la instalación ha sido exitosa, no verás ningún mensaje de error.

Haciendo una Petición GET

Es muy sencillo enviar una petición HTTP usando Peticiones. Puedes comenzar importando el módulo y después hacer la petición. Aquí está un ejemplo:

1
import requests
2
req = requests.get('https://tutsplus.com/')

Toda la información sobre nuestra petición está ahora almacenada en un objeto Response llamado req. Por ejemplo, puedes obtener la codificación de la página web usando la propiedad req.encoding. También puedes obtener el código de estado de la petición usando la propiedad req.status_code.

1
req.encoding     # returns 'utf-8'

2
req.status_code  # returns 200

También puedes acceder a las cookies que el servidor envió de vuelta usando req.cookies. De manera similar, puedes obtener los encabezados de respuesta usando req.headers. La propiedad req.headers devuelve un diccionario no sensible a mayúsculas de encabezados de respuesta. Esto significa que req.headers['Content-Length']req.headers['content-length'] y req.headers['CONTENT-LENGTH'] todos devolverán el valor del encabezado de respuesta 'Content-Lenght'.

Puedes revisar si la respuesta es una redirección HTTP bien formada que podría haber sido procesada automáticamente usando la propiedad req.is_redirect. Este devolverá True o False basado en la respuesta. Puedes también obtener el tiempo transcurrido entre enviar la petición y recibir una respuesta usando la propiedad req.elapsed.

La URL que inicialmente pasaste a a función get() puede ser diferente que la URL final de la respuesta para una variedad de razones, incluyendo redirecciones. Para ver la URL de respuesta final, puedes usar la propiedad req.url.

1
import requests
2
req = requests.get('http://www.tutsplus.com/')
3
4
req.encoding      # returns 'utf-8'

5
req.status_code   # returns 200

6
req.elapsed       # returns datetime.timedelta(0, 1, 666890)

7
req.url           # returns 'https://tutsplus.com/'

8
9
req.history      
10
# returns [<Response [301]>, <Response [301]>]

11
12
req.headers['Content-Type']
13
# returns 'text/html; charset=utf-8'

Teniendo toda esta información sobre la página web que estás accediendo es bueno, pero probablemente quieres acceder al contenido. Si el contenido que estás accediendo es texto, puedes usar la propiedad req.text para accederlo. El contenido es entonces analizado como unicode. Puedes pasar la codificación con la cuál decodificar el texto usando la propiedad req.enconding.

En el caso de respuestas que no son texto, puedes accederlas en forma binaria usando req.content. El módulo automáticamente decodificará  codificaciones de transferencia gzip y deflate. Esto puede ser útil cuando estás lidiando con archivos de medios. De manera similar, puedes acceder al contenido codificado en json para la respuesta, si esta existe, usando req.json().

También puedes obtener la respuesta cruda del servidor usando req.raw. Ten en mente que tendrás que pasar stream=True en la petición para obtener la respuesta cruda.

Algunos archivos que descargas del internet usando el módulo Peticiones podrían tener un gran tamaño. En tales casos, no será sabio cargar toda la respuesta o archivo en la memoria a la vez. Puedes descargar un archivo en piezas o pedazos usando el método iter_content(chunk_size = 1, decode_unicode=False).

Este método itera sobre la información de respuesta en chunk_size número de bytes a la vez. Cuando stream=True ha sido establecido en la petición, este método evitará leer todo el archivo en memoria a la vez para respuestas grandes. El parámetro chunk_size puede ser un entero o None. Cuando se establece a un valor entero, chunk_size determina el número de bytes que deberían ser leídos en la memoria.

Cuando chunk_size es establecido a None y stream es establecido a True, la información será leída mientras llega en cualquier tamaño de pedazos que sea recibido. Cuando chunk_size se establece a None y stream es False, toda la información será devuelta como un solo pedazo.

Descarguemos esta imagen de un bosque en Pixabay usando el módulo Petición. Aquí está la imagen:

Forest Image Downloaded Using Python Requests Module Forest Image Downloaded Using Python Requests Module Forest Image Downloaded Using Python Requests Module

Este es el código que necesitas:

1
import requests
2
req = requests.get('path/to/forest.jpg', stream=True)
3
req.raise_for_status()
4
with open('Forest.jpg', 'wb') as fd:
5
    for chunk in req.iter_content(chunk_size=50000):
6
        print('Received a Chunk')
7
        fd.write(chunk)

El 'path/to/forest.jpg' es la URL de la imagen; puedes poner la URL de cualquier otra imagen aquí para descargar algo más. La imagen dada es de 185kb en tamaño, y has establecido chunk_size a 50,000 bytes. Esto significa que el mensaje "Received a Chunk" debería ser impreso cuatro veces en la terminal. El tamaño del último pedazo será solo de 39350 bytes porque la parte del archivo que resta por ser recibido después de las tres primeras iteraciones es 39350 bytes.

Las peticiones también te permiten pasar parámetros en una URL. Esto puede ser útil cuando estás buscando una página web para algunos resultados como una imagen o tutorial específicos. Puedes proporcionar estas cadenas de consulta como un diccionario de cadenas usando la palabra clave params en la petición GET. Aquí hay un ejemplo:

1
import requests
2
3
query = {'q': 'Forest', 'order': 'popular', 'min_width': '800', 'min_height': '600'}
4
req = requests.get('https://pixabay.com/en/photos/', params=query)
5
6
req.url
7
# returns 'https://pixabay.com/en/photos/?order=popular&min_height=600&q=Forest&min_width=800'

Haciendo una Petición POST

Hacer una petición POST es tan fácil como hacer peticiones GET. Solo usas las función post() en vez de get(). Esto puede ser útil cuando estás enviando formularios automáticamente. Por ejemplo, el siguiente código descargará toda la página de Wikipedia sobre Nanotecnología y la guardará a tu PC.

1
import requests
2
req = requests.post('https://en.wikipedia.org/w/index.php', data = {'search':'Nanotechnology'})
3
req.raise_for_status()
4
with open('Nanotechnology.html', 'wb') as fd:
5
    for chunk in req.iter_content(chunk_size=50000):
6
        fd.write(chunk)

Enviando Cookies y Headers

Como mencioné previamente, puedes acceder a las cookies y encabezados que el servidor te envía de vuelta usando req.cookies y req.headers. Las peticiones también te permiten enviar to propias cookies personalizadas y encabezados con una petición. Esto puede ser útil cuando quieres, digamos, establecer un agente de usuario personalizado para tu petición.

Para agregar encabezados HTTP a una petición, puedes simplemente pasarlos en un dict al parámetro headers. De manera similar, también puedes enviar tus propias cookies a un servidor usando un dict pasado al parámetro cookies.

1
import requests
2
3
url = 'http://some-domain.com/set/cookies/headers'
4
5
headers = {'user-agent': 'your-own-user-agent/0.0.1'}
6
cookies = {'visit-month': 'February'}
7
8
req = requests.get(url, headers=headers, cookies=cookies)

Las cookies también pueden ser pasadas en un Cookie Jar. Estas proporcionan una interfaz más completa para permitirte usar esas cookies sobre múltiples rutas. Aquí hay un ejemplo:

1
import requests
2
3
jar = requests.cookies.RequestsCookieJar()
4
jar.set('first_cookie', 'first', domain='httpbin.org', path='/cookies')
5
jar.set('second_cookie', 'second', domain='httpbin.org', path='/extra')
6
jar.set('third_cookie', 'third', domain='httpbin.org', path='/cookies')
7
8
url = 'http://httpbin.org/cookies'
9
req = requests.get(url, cookies=jar)
10
11
req.text
12
13
# returns '{ "cookies": { "first_cookie": "first", "third_cookie": "third" }}'

Objetos de Sesión

Algunas veces es útil preservar ciertos parámetros a lo largo de múltiples peticiones. El objeto Session hace exactamente eso. Por ejemplo, persistirá datos de cookies a lo largo de todas las peticiones hechas usando la misma sesión. El objeto Session usa agrupación de conexiones de urllib3. Esto significa que la conexión TCP subyacente será rechazada para todas la peticiones hechas al mismo anfitrión. Esto puede aumentar significativamente el rendimiento. También puedes usar métodos del Objeto Peticiones con el objeto Sesión.

Aquí hay un ejemplo de múltiples peticiones enviadas con y sin usar sesiones:

1
import requests
2
3
reqOne = requests.get('https://tutsplus.com/')
4
reqOne.cookies['_tuts_session']
5
#returns 'cc118d94a84f0ea37c64f14dd868a175'

6
7
reqTwo = requests.get('https://code.tutsplus.com/tutorials')
8
reqTwo.cookies['_tuts_session']
9
#returns '3775e1f1d7f3448e25881dfc35b8a69a'

10
11
ssnOne = requests.Session()
12
ssnOne.get('https://tutsplus.com/')
13
ssnOne.cookies['_tuts_session']
14
#returns '4c3dd2f41d2362108fbb191448eab3b4'

15
16
reqThree = ssnOne.get('https://code.tutsplus.com/tutorials')
17
reqThree.cookies['_tuts_session']
18
#returns '4c3dd2f41d2362108fbb191448eab3b4'

Como puedes ver, la cookie de sesión tiene un valor diferente en la primera y segunda petición, pero tiene el mismo valor cuando usamos el objeto Session. Estarás obteniendo un valor diferente cuando pruebas este código, pero en tu caso también, la cookie para las peticiones hechas usando el objeto session tendrán el mismo valor.

Las sesiones también son útiles cuando quieres enviar la misma información a lo largo de todas las peticiones. Por ejemplo, si decides enviar una cookie o un encabezado de agente de usuario con todas las peticiones a un dominio dado, puedes usar objetos Session. Aquí hay un ejemplo:

1
import requests
2
3
ssn = requests.Session()
4
ssn.cookies.update({'visit-month': 'February'})
5
6
reqOne = ssn.get('http://httpbin.org/cookies')
7
print(reqOne.text)
8
# prints information about "visit-month" cookie

9
10
reqTwo = ssn.get('http://httpbin.org/cookies', cookies={'visit-year': '2017'})
11
print(reqTwo.text)
12
# prints information about "visit-month" and "visit-year" cookie

13
14
reqThree = ssn.get('http://httpbin.org/cookies')
15
print(reqThree.text)
16
# prints information about "visit-month" cookie

Como puedes ver, la cookie de sesión "visit-month" es enviada con las tres peticiones. Sin embargo, la cookie "visit-year" es enviada solo durante la segunda petición. No hay mención de la cookie "visit-year" en la tercera petición tampoco. Esto confirma el hecho de que las cookies y otro conjunto de datos en peticiones individuales no serán enviadas con otras peticiones de sesión.

Conclusión

Los conceptos discutidos en este tutorial deberían ayudarte a hacer peticiones básicas a un servidor pasando encabezados específicos, cookies, o cadenas de consulta. Esto será muy útil cuando estés intentando escarbando por alguna información de las páginas web. Ahora, deberías también poder descargar automáticamente archivos de música y fondos de pantalla desde diferentes sitios web una vez que hayas descifrado un patrón en las URLs.

No dudes en ver que tenemos disponible a la venta y para estudiar en el marketplace, y no dudes en hacer cualquier pregunta y proporcionar tu valiosa retroalimentación usando la sección de abajo.

Si tienes alguna pregunta sobre este tutorial, por favor déjame saberlo en los comentarios.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.