BeautifulSoup e SelectorGadget#

O primeiro passo é a instalação da biblioteca BeautifulSoup caso ainda não o tenham feito

pip install beautifulsoup4

A seguir temos de colocar o SelectorGadget nos favoritos indo ao site: https://selectorgadget.com/ e arrastando-o para a barra de favoritos.

Para colocar o SelectorGadget nos favoritos devemos arrastar o respectivo link para a barra de tarefas:

Vídeo

Podem ver qualquer vídeo em formato grande clicando com o botão direito do rato e abrindo numa nova aba.

Primeiro Script de webscraping#

Vamos fazer o download das rentabilidades de 2022 do S&P 500 que estão na macrotrends.

Para isso temos de clicar no SelectorGadget e seleccionar a tabela para obtermos o CSS selector.

Este é o código “geral”:

from bs4 import BeautifulSoup
import requests

url = "URL_OF_THE_WEBPAGE"
page = requests.get(url)
soup = BeautifulSoup(page.content, "html.parser")
elements = soup.select("GENERATED_CSS_SELECTOR")
elements

O url da página com os retornos do S&P 500 que vamos usar é: “https://www.macrotrends.net/2526/sp-500-historical-annual-returns”. Vamos agora ver qual é o CSS Selector com o SelectorGadget.

Como podemos ver o CSS Selector é: .tr:nth-child(1) td:nth-child(6). Cliquem inicialmente no valor que querem. Depois podem ter que ir clicando nas zonas amarelas que não querem, tal como fiz no vídeo, de forma a ir focando cada vez mais no valor pretendido.

Vamos incluí-lo no código:

from bs4 import BeautifulSoup
import requests

url = "https://www.macrotrends.net/2526/sp-500-historical-annual-returns"
page = requests.get(url)
soup = BeautifulSoup(page.content, "html.parser")

# Using SelectorGadget to find the CSS selector for the data table
elements = soup.select_one("tr:nth-child(1) td:nth-child(6)")

# Extract the text from the HTML element
value = elements.text

# Delete the comma in preparation to turn the data into a number
value = value.replace(',', '')
value_float = float(value.replace(',', ''))
value_float
4376.86

Esta estratégia é boa para iremos buscar valores individuais.

Podemos contudo fazer o download de uma tabela inteira que teremos de transformar em dataframe.

import pandas as pd

url = "https://www.macrotrends.net/2526/sp-500-historical-annual-returns"
page = requests.get(url)
soup = BeautifulSoup(page.content, "html.parser")

# Using SelectorGadget to find the CSS selector for the data table
elements = soup.select_one("#style-1")

# Extract the text from the HTML element
elements

# Convert the HTML table to a pandas DataFrame
tables = pd.read_html(str(elements))
df = tables[0]
df
S&P 500 Index - Historical Annual Data
Year Average Closing Price Year Open Year High Year Low Year Close Annual % Change
0 2023 4097.82 3824.14 4425.84 3808.10 4376.86 14.00%
1 2022 4097.49 4796.56 4796.56 3577.03 3839.50 -19.44%
2 2021 4273.41 3700.65 4793.06 3700.65 4766.18 26.89%
3 2020 3217.86 3257.85 3756.07 2237.40 3756.07 16.26%
4 2019 2913.36 2510.03 3240.02 2447.89 3230.78 28.88%
... ... ... ... ... ... ... ...
91 1932 6.92 7.82 9.31 4.40 6.89 -15.15%
92 1931 13.66 15.85 18.17 7.72 8.12 -47.07%
93 1930 21.00 21.18 25.92 14.44 15.34 -28.48%
94 1929 26.19 24.81 31.86 17.66 21.45 -11.91%
95 1928 19.94 17.76 24.35 16.95 24.35 37.88%

96 rows × 7 columns

Vamos, no capítulo seguinte, fazer o download da tabela usando webscraping com pandas directamente.