Germán Mallo

0 %
Germán Mallo
Data Scientist
  • Residencia:
    España
  • City:
    Valencia
  • Age:
    20
Español
Inglés
Valenciano
Python
R
Photoshop
WordPress
Wondershare Filmora
SQL
  • Advanced Knowledge in Statistics
  • UPV Student
  • GIT knowledge

Guía de Requests y BeautifulSoup en Python.

06/05/2024

En esta guía comparto cómo aprendí a utilizar las bibliotecas Requests y BeautifulSoup en Python para realizar solicitudes HTTP y hacer web scrapping para analizar el contenido de una página web.

Introducción

Requests es una biblioteca de Python que permite realizar solicitudes HTTP de manera sencilla y eficiente. Por otro lado, BeautifulSoup es una biblioteca que facilita el análisis y extracción de datos de documentos HTML y XML.

Instalación

Para utilizar Requests y BeautifulSoup, primero debes instalarlas. Puedes hacerlo ejecutando los siguientes comandos en tu terminal:

```bash
pip install requests
pip install bs4
```

Librería Requests

Realizar una solicitud HTTP

Con el modulo Requests, usamos el método get() para obtener el contenido de una página web. Por ejemplo, para obtener el contenido de la página de Wikipedia en español, podemos ejecutar el siguiente código:

```python
import requests

response = requests.get('https://es.wikipedia.org/wiki/Wikipedia:Portada')
```

En este caso, obtendremos un objeto de tipo Response que contiene el contenido de la página web. Para acceder al contenido, podemos utilizar el atributo text:

```python
print(response.text)
```

Y así obtendremos el contenido de la página web en formato de texto plano.

Para obtener el código de estado de la respuesta HTTP, podemos utilizar el atributo status_code:

```python
print(response.status_code)
```
Un pequeño apunte: los códigos de estado de las respuestas HTTP indican si una solicitud HTTP se ha completado satisfactoriamente. Por ejemplo, el código de estado `200` indica que la solicitud se ha completado correctamente, mientras que el código de estado `404` indica que la página web no ha sido encontrada.

También podemos obtener los encabezados de la respuesta HTTP utilizando el atributo headers:

```python
print(response.headers)
```

Y así obtendremos un diccionario con los encabezados de la respuesta HTTP.

Para utilizar el contenido de la pagina en cuestión como una variable, podemos utilizar el método content:

```python
content = response.content
```

Este método, lo que hace exactamente es codificar el contenido de la página web en formato binario.

Una vez tengamos el contenido de la página web almacenado en una variable, podemos utilizar la librería BeautifulSoup para parsear el contenido y extraer la información que nos interese.

Librería BeautifulSoup

Parsear el contenido de una página web

Para utilizar BeautifulSoup, primero debemos importarla:

```python
from bs4 import BeautifulSoup
```

Una vez importada, podemos crear un objeto de tipo BeautifulSoup a partir del contenido de la página web:

```python
soup = BeautifulSoup(content, 'lxml')
```
PARÁMETRO CONTENT: contenido de la página web en formato binario.
PARÁMETRO 'lxml': especifica el analizador que se utilizará para parsear el contenido de la página web. En este caso, utilizaremos el analizador lxml, pero también podríamos utilizar el analizador html.parser

Ahora que tenemos el contenido de la página web parseado, podemos utilizar los métodos de BeautifulSoup para extraer la información que nos interese.

Métodos de BeautifulSoup

soup.title

Usaremos los métodos de BeautifulSoup para extraer la información que nos interese de la página web. Por ejemplo, para obtener el título de la página web, podemos utilizar el método title:

```python
print(soup.title)
```
El método title nos devuelve el título de la página web, incluyendo las etiquetas HTML.

soup.find() y soup.find_all()

Otro método muy útil de BeautifulSoup es find() y find_all(). Estos métodos nos permiten buscar elementos HTML en el contenido de la página web.

En el siguiente ejemplo, utilizaremos el método find_all() para obtener todos los enlaces de la página web:

links = soup.find_all("a") #links es una lista de enlaces
print('print(soup.find_all("a"))')
print(links)
print("\n")

Pequeño apunte: para identificar los enlaces en HTML se utiliza la etiqueta , es por eso por lo que utilizamos el parámetro “a” en el método find_all().

soup.prettify()

Para imprimir el contenido de la página web de una manera más legible, podemos utilizar el método prettify():

print(soup.prettify())

El método prettify() nos devuelve el contenido de la página web con una estructura de árbol, lo que hace que sea más fácil de leer.

Diferencias entre response.text, BeautifulSoup(response.text, 'lxml') y soup.prettify().

import requests
from bs4 import BeautifulSoup

response = requests.get('https://es.wikipedia.org/wiki/Wikipedia:Portada')
content = response.content
soup = BeautifulSoup(content, 'lxml')
prettify = soup.prettify()
  • RESPONSE: El método text nos devuelve el contenido de la página web en formato de texto plano.
  • SOUP: Cuando hacemos BeautifulSoup(response.text, ‘lxml’), lo que hacemos es crear un objeto de tipo BeautifulSoup a partir del contenido de la página web en formato de texto plano. Este objeto es (internamente) como una especie de árbol que contiene todos los elementos HTML de la página web estructurados a su manera.
  • PRETTIFY: El método prettify() nos devuelve el soup con una estructura de árbol. Básicamente hace que podamos entender mejor la estructura del objeto BeautifulSoup, identando el texto y añadiendo saltos de línea según la estructura del árbol.

Ejemplo práctico

Para continuar con el ejemplo y recapitular un poco lo que hemos visto hasta ahora, vamos a buscar todos los enlaces que contengan la cadena “acerca de” en la página principal de google:

import requests
from bs4 import BeautifulSoup

result = requests.get("https://www.google.com/")
print(result.status_code) # 200, es correcto

src = result.content # contenido de la página web en formato binario
soup = BeautifulSoup(src, 'lxml') # parseamos el contenido de la página web

links = soup.find_all("a") # buscamos todos los enlaces de la página web
for link in links: # por cada enlace en la lista de enlaces
    if "Acerca de" in link.text:
        print(link) # imprimimos el enlace
        print(\n) # imprimimos un salto de línea
        print(link.attrs['href']) # obtenemos el valor del  atributo href

Pequeño apunte: para obtener el valor de un atributo HTML, podemos utilizar el método attrs y especificar el nombre del atributo que queremos obtener. En este caso, queremos obtener el valor del atributo href, que contiene la URL del enlace.

Atributos de los elementos HTML

Los atributos de los elementos HTML son pares de valores que se utilizan para configurar el comportamiento de los elementos HTML. Por ejemplo, el atributo href se utiliza para especificar la URL de un enlace. A continuación veremos los atributos más comunes:

Primero, si queremos observar todos los atributos de un elemento HTML, podemos utilizar el método attrs:

link = soup.find("a")
print(link.attrs)

Esto nos mostrará un diccionario con todos los atributos del elemento HTML.

href

Este ya lo hemos visto antes, se utiliza para especificar la URL de un enlace.

<a href="https://www.google.com/">Google</a>

Para obtener el valor de cualquier atributo HTML en python, usaremos el método attrs y especificaremos el nombre del atributo que queremos obtener:

link = soup.find("a")
print(link.attrs['href']) # https://www.google.com/

id

Se utiliza para especificar un identificador único para un elemento HTML.

<p id="parrafo">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>

De la misma forma que anteriormente, con python obtendremos el valor del atributo id de la siguiente manera:

p = soup.find("p")
print(p.attrs['id']) # parrafo

src

Se utiliza para especificar la URL de una imagen.

<img src="https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png">
img = soup.find("img")
print(img.attrs['src']) # https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png
Posted in Guías, Programación, Python