es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Extraer datos de valores bursátiles de subpáginas de un sitio web sin cambio de dirección.

Basado en el tutorial alemán de Ingo Janßen escribí un raspador web para recolectar datos de la página web boerse.de.
Mi función debería devolver en un data de pandas los enlaces de todas las acciones SP500 de esa página:

import bs4 as bs
import pandas as pd
import requests
import pickle
import numpy as np
import re

# Carga la información básica de las acciones en un dataframe de pandas

def cargar_acciones_sp500():
    enlace_base = "https://www.boerse.de/realtime-kurse/SundP-500-Aktien/US78378X1072/"
    enlaces = [enlace_base + "?page=" + str(i) for i in range(1, 18)]
    data = {}

    for enlace in enlaces:
        response = requests.get(enlace, headers={'User-Agent': 'Mozilla/5.0'})
        soup = bs.BeautifulSoup(response.text, 'html.parser')
        tabla = soup.find('table', {'id': 'pushList'})
        cuerpo = tabla.find('tbody')
        acciones = cuerpo.find_all('tr')

        for accion in acciones:
            try:
                isin = accion['id']
                div = accion.find('div', {'class': 'tablesorter N'})
                enlace = div.find('a')
                data[isin] = {
                    'Nombre': enlace.text,
                    'URL': enlace['href']
                }
            except Exception as ex:
                template = "An exception of type {0} occurred. Arguments: {1!r}"
                message = template.format(type(ex).__name__, ex.args)
                print(message)

    df = pd.DataFrame(data)
    df = df.transpose()
    df.index.name = 'ISIN'

    return df

La página en sí misma está clasificada en 17 subpáginas. ¿Hay alguna modificación para recolectar los datos de las 17 subpáginas juntos?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para extraer datos de las 17 subpáginas, se puede modificar la función load_stocks_sp500() añadiendo un bucle para iterar sobre cada URL de subpágina y agregar los resultados a una lista. Aquí hay un ejemplo de cómo hacerlo:

    def load_stocks_sp500():
        pages = ['https://www.boerse.de/realtime-kurse/SundP-500-Aktien/US78378X1072']  # empezar con la primera página
        for i in range(2, 18):
            pages.append(f'https://www.boerse.de/realtime-kurse/SundP-500-Aktien/US78378X1072/{i}')  # agregar el resto de las páginas
    
        data = []
        for page in pages:
            response = requests.get(page)
            soup = bs.BeautifulSoup(response.text, 'html.parser')
            table = soup.find('table', {'id': 'pushList'})
            body = table.find('tbody')
    
            stocks = body.find_all('tr')
            for stock in stocks:
                try:
                    isin = stock['id']
                    div = stock.find('div', {'class': 'tablesorter N'})
                    link = div.find('a')
                    data.append({
                        'ISIN': isin,
                        'Nombre': link.text,
                        'URL': link['href']
                    })
                except Exception as ex:
                    template = "Ocurrió una excepción de tipo {0}. Argumentos: {1!r}"
                    message = template.format(type(ex).__name__, ex.args)
                    print(message)
    
        df = pd.DataFrame(data)
        df.set_index('ISIN', inplace=True)
    
        return df
    

    Los cambios clave son:

    • pages: se crea una lista de todas las 17 URLs de subpáginas
    • El bucle for: itera sobre cada URL de subpágina y extrae los datos como anteriormente, con los resultados agregados a la lista data
    • La lista resultante data se utiliza para crear el dataframe pandas final (df), con el índice establecido en el ISIN

    Esta función modificada debería devolver un dataframe pandas con todas las acciones SP500 de las 17 subpáginas del sitio web de boerse.de.

Comments are closed.