Agora que temos o nosso ambiente configurado e um conhecimento básico sobre tabelas HTML, podemos começar a construir um scraper web para extrair dados de uma tabela HTML. Nesta secção, vamos percorrer os passos para construir um scraper simples capaz de extrair dados de uma tabela e armazená-los num formato estruturado.
O primeiro passo é utilizar a biblioteca requests para enviar um pedido HTTP à página web que contém a tabela HTML que pretendemos extrair.
Pode instalá-la usando o pip, como qualquer outro pacote Python:
$ pip install requests
Esta biblioteca permite-nos recuperar o conteúdo HTML de uma página web como uma string:
import requests
url = 'https://www.w3schools.com/html/html_tables.asp'
html = requests.get(url).text
Em seguida, utilizaremos a biblioteca BeautifulSoup para analisar o conteúdo HTML e extrair os dados da tabela. A BeautifulSoup fornece uma variedade de métodos e atributos que facilitam a navegação e a extração de dados de um documento HTML. Aqui está um exemplo de como utilizá-la para localizar o elemento da tabela e extrair os dados das células:
soup = BeautifulSoup(html, 'html.parser')
# Find the table element
table = soup.find('table')
# Extract the data from the cells
data = []
for row in table.find_all('tr'):
cols = row.find_all('td')
# Extracting the table headers
if len(cols) == 0:
cols = row.find_all('th')
cols = [ele.text.strip() for ele in cols]
data.append([ele for ele in cols if ele]) # Get rid of empty values
print(data)
A matriz de dados 2D está agora preenchida com os valores das linhas e colunas da tabela. Para que seja mais legível para nós, podemos passar o conteúdo para um Dataframe do Pandas muito facilmente agora:
import pandas as pd
# Getting the headers from the data array
# It is important to remove them from the data array afterwards in order to be parsed correctly by Pandas
headers = data.pop(0)
df = pd.DataFrame(data, columns=headers)
print(df)
Depois de extrair os dados da tabela, pode utilizá-los para diversos fins, tais como análise de dados, aprendizagem automática ou armazenamento numa base de dados. Também pode modificar o código para extrair várias tabelas da mesma página web ou de várias páginas web.
Tenha em mente que nem todos os sites na Internet são tão fáceis de extrair dados. Muitos deles implementaram medidas de proteção de alto nível destinadas a impedir a extração, como CAPTCHA e bloqueio de endereços IP, mas, felizmente, existem serviços de terceiros, como o WebScrapingAPI, que oferecem rotação de IP e contorno de CAPTCHA, permitindo-lhe extrair esses alvos.
Espero que esta secção tenha fornecido uma visão geral útil do processo de extração de dados de uma tabela HTML utilizando Python. Na próxima secção, discutiremos algumas das formas de melhorar este processo e as melhores práticas de web scraping.