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:
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.