Saltar al contenido
Webscrapping con Python

Manipulación de datos y limpieza de datos con BeautifulSoup y Pandas

Introducción

Web scraping es una técnica de extracción de datos de sitios web a través de herramientas de automatización. BeautifulSoup es una librería de Python que ayuda a analizar documentos HTML y XML. Pandas es una librería de Python que se utiliza para el análisis y manipulación de datos.

En este curso, aprenderás cómo utilizar BeautifulSoup y Pandas para recopilar datos de sitios web y analizarlos para obtener información valiosa. Esto incluye la extracción de información específica de una página web, como precios de productos, reseñas de clientes y otros datos estructurados y no estructurados.

También aprenderás cómo limpiar y transformar los datos, eliminando información redundante y reordenando los datos para facilitar su análisis. Esto incluye la eliminación de caracteres no deseados, la eliminación de duplicados y la reformulación de datos para que puedan ser más fáciles de entender y analizar.

Al final del curso, tendrás una comprensión completa de cómo utilizar BeautifulSoup y Pandas para la manipulación y limpieza de datos. Esto te permitirá recopilar y analizar datos de manera más efectiva, lo que puede ayudarte en proyectos futuros y en la toma de decisiones informadas en tu trabajo.

Resumen

Manipulación de datos se refiere a la capacidad de modificar o transformar los datos obtenidos de una fuente, en este caso a través de web scraping con Python. La manipulación de datos es necesaria para obtener los datos que realmente nos interesan.

Por otro lado, la limpieza de datos se refiere a la eliminación de información que no es relevante para nuestros objetivos o a corregir errores en los datos. Para realizar la manipulación y limpieza de los datos obtenidos a través de web scraping con Python, se utilizan dos herramientas principales: BeautifulSoup y Pandas.

BeautifulSoup es una biblioteca utilizada para analizar documentos HTML y XML. Con BeautifulSoup podemos extraer información de las etiquetas HTML para obtener el contenido que nos interesa. De esta manera podemos manipular los datos para que cumplan con nuestros objetivos.

Por otro lado, Pandas es una biblioteca utilizada para la manipulación y análisis de datos. Con Pandas podemos organizar la información en estructuras de datos llamadas DataFrames, que nos permiten manipular y limpiar los datos de manera más eficiente. Podemos usar diferentes operaciones de Pandas para limpiar y manipular los datos obtenidos mediante web scraping con Python.

En resumen, la Manipulación y Limpieza de datos con BeautifulSoup y Pandas es esencial para transformar los datos obtenidos a través de web scraping con Python, en información relevante y de calidad que nos permita cumplir con nuestros objetivos.

Aplicación teórica

Un ejemplo práctico sería el siguiente: Supongamos que queremos extraer información sobre el clima de una ciudad a partir de una página web y que, una vez extraída, deseamos hacer una limpieza básica de los datos utilizando BeautifulSoup y Pandas.

Primero, utilizamos BeautifulSoup para extraer los datos de la página web:

import requests
from bs4 import BeautifulSoup

URL = 'https://www.tiempo.com/'
response = requests.get(URL)
soup = BeautifulSoup(response.content, 'html.parser')

clima = soup.find('div', class_='weather')
temperatura = clima.find_all('span', class_='temp')[0].text
estado = clima.find_all('div', class_='desc')[0].text

Una vez que tenemos los datos, utilizamos Pandas para convertirlos en un DataFrame y realizar una limpieza básica:

import pandas as pd

datos = {
    'temperatura': [temperatura],
    'estado': [estado]
}

df = pd.DataFrame(datos)

df['temperatura'] = df['temperatura'].str.replace('°', '')
df['temperatura'] = pd.to_numeric(df['temperatura'])
df['estado'] = df['estado'].str.strip()

De esta forma, hemos extracción de datos de una página web y hemos realizado una limpieza básica utilizando BeautifulSoup y Pandas.

Aplicación práctica

Un ejemplo práctico de cómo podemos usar BeautifulSoup y Pandas para hacer limpieza y manipulación de datos en una página web. En este caso, vamos a extraer información de un sitio web de reseñas de películas (www.imdb.com), en particular de las 100 mejores películas según la clasificación de los usuarios. Comenzaremos importando las librerías necesarias:

import requests
from bs4 import BeautifulSoup
import pandas as pd

Luego, hacemos una petición al sitio web para obtener el código HTML de la página:

url = 'https://www.imdb.com/chart/top'
response = requests.get(url)
html = response.content

Después, creamos un objeto Beautiful Soup que nos permite analizar y procesar el código HTML de la página:

soup = BeautifulSoup(html, 'html.parser')

A continuación, usamos Beautiful Soup para extraer los datos que nos interesan de la tabla que contiene la lista de las 100 mejores películas:

movies_table = soup.find('table', {'class': 'chart full-width'})
movies = movies_table.find_all('tr')[1:]

En este caso, estamos buscando la tabla que tiene la clase 'chart full-width' y obteniendo todas las filas de la tabla exceptuando la primera, que es simplemente la fila de encabezado.

Una vez que tenemos los datos en una lista de objetos BeautifulSoup, podemos iterar sobre ellos para obtener la información que deseamos:

titles = []
years = []
ratings = []
for movie in movies:
    title = movie.find('td', {'class': 'titleColumn'}).find('a').text.strip()
    year = movie.find('td', {'class': 'titleColumn'}).find('span').text.strip('()')
    rating = float(movie.find('td', {'class': 'imdbRating'}).text.strip())
    titles.append(title)
    years.append(year)
    ratings.append(rating)

En este caso, estamos extrayendo el título de la película, el año de lanzamiento y la calificación del usuario para cada una de las películas en la lista. Para limpiar los datos, estamos eliminando los espacios en blanco y los caracteres que no nos interesan.

Finalmente, podemos crear un objeto de Pandas DataFrame con los datos obtenidos y hacer cualquier manipulación y análisis adicional que deseemos:

imdb_df = pd.DataFrame({'title': titles, 'year': years, 'rating': ratings})
print(imdb_df.head())

Con esto, obtendremos una tabla de datos que podemos manipular y analizar como deseemos:

            title  year  rating
0  Cadena perpetua  1994     9.2
1      El Padrino  1972     9.1
2El Padrino: Parte II 1974     9.0
3  El caballero de la noche 2008     9.0
4   12 hombres en pugna  1957     8.9