Web scraping con Beautiful Soup y Python

En este post mostraré un ejemplo de uso del web scraping con Beautiful Soup y Python
¿Pero qué es el web scraping?
El web scraping es una técnica utilizada para extraer datos de sitios web de forma automatizada. Consiste en escribir un programa o utilizar herramientas específicas para recorrer el contenido de una página web y extraer la información.
¿Qué voy a "escrapear"? En este ejemplo voy a hacer web scraping en la página Promiedos, una página que tiene muchísima información sobre el fútbol de ligas de todo el mundo e incluso presenta resultados en tiempo real. En particular se hará web scraping sobre el historial de todos los equipos que han jugado en la primera división Argentina.

Vamos al código de Python!


#Importamos las bibliotecas necesarias
from bs4 import BeautifulSoup
import requests
import pandas as pd
import sys


#Realizamos la request
url_historiales = 'https://www.promiedos.com.ar/historiales'
req =requests.get(url_historiales)

En un diccionario voy a almacenar el nombre y la url del historial de cada club, con el fin de luego ir "escrapeando" uno por uno.

#Obtengo la url de cada equipos
clubs = {}
status_code = req.status_code
if status_code == 200:
    #Creo un objeto 'BeautifulSoup'
    html = BeautifulSoup(req.text, 'html.parser')
    clubs_all_divs = html.find_all('div', id = 'clubhist')

Se hace scraping discriminando por era profesional, amateurismo y profesional + amateurismo.

for club in clubs_all_divs:
    clubs[club.text] = 'https://www.promiedos.com.ar/' + str(club.a['href'])
    # clubs[club.text] = 'https://www.promiedos.com.ar/' + str(club.a['href']+'&era=amateur')
    # clubs[club.text] = 'https://www.promiedos.com.ar/' + str(club.a['href']+'&era=profesional')

En el siguiente bloque de código se "escrapea" cada equipo uno por uno y se almacenan los datos en una lista, que luego será convertida en un dataframe de pandas.

#Obtengo el historial de cada equipos
# Crear una lista vacía para almacenar los datos
data = []
df = pd.DataFrame(columns=['club_1', 'club_2', 'dif', 'pj', 'pg', 'pe', 'pp'])
for club, url in clubs.items():
        sys.stdout.write(f"Screapeando a {club}                                               \r")
        sys.stdout.flush()
        club_req = requests.get(str(url))


        if club_req.status_code == 200:
            club_html = BeautifulSoup(club_req.text, 'html.parser')
            club_historial = club_html.find('table', id = 'historial')
            club_all_tr = club_historial.find_all('tr')
            for tr in club_all_tr[1:]:
                td = tr.findAll('td')
                club_1 = club
                club_2 = td[0].text[3:]
                dif = (td[1].text)
                pj = (td[2].text)
                pg = (td[3].text)
                pe = (td[4].text)
                pp = (td[5].text)
                data.append({'club_1': club_1,
                            'club_2': club_2,
                            'dif': dif, #Diferencia entre el club 1 y club 2
                            'pj': pj,   #Partidos jugados
                            'pg': pg,   #Partidos ganados por el club 1 al club 2
                            'pe': pe,   #Partidos empatados
                            'pp': pp})  #Partidos perdidos por el club 1 contra el club 2

               
        else:
            print(club_req.status_code)


Y por último se convierte la lista "data" en un dataframe da pandas, para luego guardarlo como .csv.

df = pd.DataFrame(data)
df.to_csv('primera_profesional.csv', index = False)


Para "escrapear" cada página hay que tener en cuenta como está estructurada, en este caso en particular se accede a la tabla "historial" y luego a cada una de sus filas que utilizan etiquetas del tipo <td>. 


Y cada una de las filas es guardada luego en el dataframe.


En una próxima entrada del blog se hará un análisis exploratorio de datos sobre los datos obtenidos, donde averiguaremos estadísticas de la primera división del fútbol argentino.

Para acceder al código y a los datos pueden visitar mi GitHub

Muchas gracias por leer! Si te gustó compartilo!























Comentarios

Entradas populares de este blog

Airbnb - Análisis exploratorio de datos

Pronóstico de una serie de tiempo con Skforecast