Saltar a contenido

The Importance of Libraries

Ahora que sabemos lo importantes que pueden ser las bibliotecas para nuestro desarrollo y cómo gestionarlas, hablemos de dos de las más populares que usaremos en nuestro proyecto, comenzando con la biblioteca requests.


The Requests Package

La biblioteca requests es una biblioteca HTTP elegante y sencilla para Python. De acuerdo con la documentación:

Requests te permite enviar solicitudes HTTP/1.1 de manera extremadamente fácil. No hay necesidad de agregar manualmente cadenas de consulta a tus URLs o de codificar en formato POST tus datos. Keep-alive y HTTP connection pooling son 100% automáticos, gracias a urllib3.

Vamos a instalar requests tal como hemos aprendido.

Installing requests

python3 -m pip install requests

Collecting requests
  Downloading requests-2.25.1-py2.py3-none-any.whl (61 kB)
     |████████████████████████████████| 61 kB 3.8 MB/s
Collecting chardet<5,>=3.0.2
  Downloading chardet-4.0.0-py2.py3-none-any.whl (178 kB)
     |████████████████████████████████| 178 kB 6.8 MB/s
Collecting certifi>=2017.4.17
...SNIP...
Successfully installed certifi-2020.12.5 chardet-4.0.0 idna-2.10 requests-2.25.1 urllib3-1.26.3

Una vez instalado, podemos importar la biblioteca en nuestro código escribiendo import requests y usarla de inmediato.

Las dos cosas más útiles que debemos saber sobre la biblioteca requests son cómo realizar solicitudes HTTP y, en segundo lugar, que tiene una clase Session, la cual es útil cuando necesitamos mantener un cierto contexto durante nuestra actividad web. Por ejemplo, si necesitamos realizar un seguimiento de un conjunto de cookies, podríamos usar un objeto Session. Para obtener uno de estos, import requests y creamos un objeto de la clase Session como sess = requests.Session(). Alternativamente, podemos usar el módulo requests (la biblioteca en sí) para realizar solicitudes HTTP. Sin embargo, esto no mantendrá su estado automáticamente.

Consideremos el siguiente código:

Example of Requests

import requests

resp = requests.get('http://httpbin.org/ip')
print(resp.content.decode())

# Prints:
# {
#   "origin": "X.X.X.X"
# }

Este es un ejemplo simple de cómo realizar una solicitud GET para obtener nuestra dirección IP pública. Dado que la variable resp.content es un byte-string, una cadena de bytes que puede o no ser imprimible, debemos llamar a decode() en el objeto. Decodificar el byte-string con la función decode() sin parámetros le indica a Python que interprete los bytes como caracteres UTF-8. UTF-8 es la codificación predeterminada utilizada cuando no se especifica otra codificación. Sin embargo, se pueden usar otras codificaciones y establecerse como argumentos del parámetro en la función decode(), por ejemplo, decode(encoding='UTF-16'). Volviendo al objeto resp, este contiene información útil como el status_code, el código de estado HTTP numérico de la solicitud que hicimos, y las cookies. Usaremos esta biblioteca más adelante, pero por ahora, continuemos con un poco más de teoría.


The BeautifulSoup Package

Otro paquete útil es la biblioteca BeautifulSoup (más bien beautifulsoup4). Esta biblioteca facilita mucho el trabajo con HTML en Python. Antes, aprendimos cómo consultar un sitio web y obtener una respuesta, que podría ser el HTML sin procesar. Examinar este HTML puede ser tedioso si tenemos que buscar a través de la salida textual manualmente. BeautifulSoup convierte el HTML en objetos de Python que son mucho más fáciles de manejar y nos permite analizar el contenido de manera programática. Vamos a instalar BeautifulSoup.

Installing BeautifulSoup

python3 -m pip install beautifulsoup4

Collecting beautifulsoup4
  Downloading beautifulsoup4-4.9.3-py3-none-any.whl (115 kB)
     |████████████████████████████████| 115 kB ...
Collecting soupsieve>1.2
  Downloading soupsieve-2.2-py3-none-any.whl (33 kB)
Installing collected packages: soupsieve, beautifulsoup4
Successfully installed beautifulsoup4-4.9.3 soupsieve-2.2

Una vez instalado, veamos algunos ejemplos rápidos de cómo usar BeautifulSoup. Para una guía más detallada, visita la documentación. Por ahora, considera el siguiente código:

HTML - Ugly Format

<html>
<head><title>Birbs are pretty</title></head>
<body><p class="birb-food"><b>Birbs and their foods</b></p>
<p class="food">Birbs love:<a class="seed" href="http://seeds" id="seed">seed</a>
   and 
   <a class="fruit" href="http://fruit" id="fruit">fruit</a></p>
 </body></html>

Este HTML se ve un poco desordenado. Supondremos que este HTML está almacenado en una variable html_doc. Luego lo cargaremos en BeautifulSoup e imprimiremos en un formato ordenado, como sigue:

Example of BeautifulSoup

from bs4 import BeautifulSoup

html_doc = """ html code goes here """
soup = BeautifulSoup(html_doc, 'html.parser')
print(soup.prettify())

lo que luego imprime:

HTML - Pretty Format

<html>
 <head>
  <title>
   Birbs are pretty
  </title>
 </head>
 <body>
  <p class="birb-food">
   <b>
    Birbs and their foods
   </b>
  </p>
  <p class="food">
   Birbs love:
   <a class="seed" href="http://seeds" id="seed">
    seed
   </a>
   and
   <a class="fruit" href="http://fruit" id="fruit">
    fruit
   </a>
  </p>
 </body>
</html>

La declaración de importación de BeautifulSoup es digna de notar. Debido a que la clase BeautifulSoup se encuentra dentro del módulo bs4, generalmente la importaremos de esta manera. Lo que sucede en el código es que la clase se importa desde el módulo y luego creamos un nuevo objeto BeautifulSoup y configuramos el analizador de la clase en el analizador HTML de BeautifulSoup. Necesitamos establecer este analizador al cargar HTML.

No nos detengamos demasiado en ejemplos imaginarios y, en su lugar, pasemos directamente a la implementación real de nuestro producto final: el extractor de palabras.