Voltar ao blogue
Guias
Andrei OgiolanLast updated on Mar 31, 20266 min read

Descubra como extrair dados de tabelas JavaScript com Python

Descubra como extrair dados de tabelas JavaScript com Python

Introdução

O web scraping é uma ferramenta poderosa que permite extrair dados de sites e utilizá-los para diversos fins. Pode ser utilizado para recolher dados para análise de negócios, acompanhar alterações em sites ou criar as suas próprias aplicações web. Neste artigo, iremos centrar-nos em como extrair tabelas JavaScript utilizando Python.

O que são tabelas JavaScript?

As tabelas JavaScript são uma forma comum de apresentar dados tabulares na web e podem ser encontradas numa vasta gama de sites. O scraping destas tabelas pode ser um desafio, porque os dados estão frequentemente incorporados no código-fonte da página como um objeto JavaScript, em vez de numa tabela HTML padrão. No entanto, com as ferramentas e técnicas certas, é possível extrair estes dados utilizando Python.

Começaremos por configurar as ferramentas necessárias e instalar as bibliotecas exigidas. Em seguida, percorreremos o processo de utilização do Python e de um web driver para carregar a página web e extrair os dados da tabela. Por fim, discutiremos algumas formas de melhorar a eficiência e a fiabilidade do processo de extração, e por que razão pode ser melhor utilizar um scraper profissional para tarefas mais complexas.

Configuração

Antes de começarmos a extrair tabelas JavaScript com Python, há dois pré-requisitos que precisamos de tratar:

  • Python: Este tutorial pressupõe que tem o Python instalado no seu computador. Se não tiver o Python instalado, pode descarregá-lo do site oficial e seguir as instruções para o seu sistema operativo.
  • Um web driver: Para carregar e interagir com páginas web usando Python, precisaremos de usar um web driver. Existem várias opções disponíveis, tais como o ChromeDriver, o FirefoxDriver e o SafariDriver. Para este tutorial, iremos usar o ChromeDriver.

Depois de instalar o Python e um driver web, terá de instalar as seguintes bibliotecas:

  • Selenium: O Selenium é uma biblioteca que permite controlar um navegador web através do Python. Iremos utilizá-la para carregar e interagir com a página web que contém a tabela. No que diz respeito a tabelas JavaScript, é importante utilizar uma biblioteca como o Selenium em vez de Python requests, porque pode esperar até que um elemento gerado por JavaScript apareça na página, caso este não esteja presente quando a página web for carregada.
  • Pandas: O Pandas é uma biblioteca que fornece estruturas de dados fáceis de usar e ferramentas de análise de dados para o Python. Iremos utilizá-la para armazenar e manipular os dados que extraímos da tabela.

Para instalar estas bibliotecas, abra um terminal ou prompt de comando e utilize o comando pip para as instalar:

$ pip install selenium pandas

E pronto! Já está pronto para começar a extrair tabelas JavaScript com Python. Na próxima secção, vamos percorrer o processo passo a passo.

Vamos começar a extrair

Agora que temos todas as ferramentas necessárias instaladas, é hora de começar a extrair tabelas JavaScript com Python. O processo envolve os seguintes passos

  • Carregue a página web que contém a tabela utilizando o Selenium e um web driver.
  • Extraia os dados da tabela utilizando o Selenium e o Python.
  • Armazenar e manipular os dados utilizando o Pandas.

Vamos percorrer cada uma destas etapas com mais detalhe:

Passo 1: Carregar a página web

A primeira coisa que precisamos de fazer é carregar a página web que contém a tabela que queremos extrair. Podemos fazer isso usando o Selenium e um web driver.

Primeiro, vamos importar as bibliotecas necessárias:

from selenium import webdriver

from selenium.webdriver.chrome.service import Service

from selenium.webdriver.common.by import By

import time

Em seguida, vamos criar uma instância do web driver e usá-la para carregar a página web:

# Replace "path/to/chromedriver" with the path to your ChromeDriver executable

driver = webdriver.Chrome(service=Service('path/to/chromedriver'))

# Load the webpage

driver.get('https://html.com/tags/table/')

É importante notar que a página web deve estar totalmente carregada antes de extrair os dados da tabela. Poderá ser necessário utilizar a função driver.implicitly_wait() para aguardar o carregamento da página, ou utilizar a função driver.find_element(By.*, ‘’) para aguardar que um elemento específico da página seja carregado.

Passo 2: Extrair os dados

Assim que a página web estiver carregada, podemos usar o Selenium para extrair os dados da tabela. Existem várias formas de o fazer, mas um método consiste em usar a função driver.find_elements(By.CSS_SELECTOR, ‘td’) para localizar as células na tabela e extrair o texto de cada célula.

Aqui está um exemplo de como extrair os dados de uma tabela simples com duas colunas:

# Find all of the rows in the table

rows = driver.find_elements(By.CSS_SELECTOR, 'table tr')

# For each row, find the cells and extract the text

for row in rows:

    try:

        cells = row.find_elements(By.CSS_SELECTOR, 'td') or row.find_elements(By.CSS_SELECTOR, 'th')

    except:

        continue

    for cel in cells:

        print(cel.text, end= " ")

    print()

driver.quit()

Lembre-se de que poderá ser necessário utilizar um seletor CSS diferente, dependendo da estrutura da tabela e dos elementos que ela contém. Pode utilizar as ferramentas de desenvolvimento do seu navegador para inspecionar a página e encontrar o seletor adequado.

Passo 3: Armazenar e manipular os dados

Depois de extrair os dados da tabela, pode armazená-los num dataframe do Pandas e manipulá-los conforme necessário. Aqui está um exemplo de como fazer isso:

from selenium import webdriver

from selenium.webdriver.chrome.service import Service

from selenium.webdriver.common.by import By

import time

import pandas as pd

df = pd.DataFrame()

driver = webdriver.Chrome(service=Service('/path/to/chromedriver'))

# Use the webdriver to load a webpage

driver.get('https://html.com/tags/table/')

# When scraping JavaScript generated content it is important to wait a few seconds

time.sleep(4)

table = driver.find_element(By.CSS_SELECTOR, 'table')

# For each row, find the cells and extract the text

df = pd.read_html(table.get_attribute('outerHTML'))

print(df)

driver.close()

Aprofundando

Embora os passos descritos acima lhe permitam extrair tabelas JavaScript usando Python, existem algumas maneiras de melhorar a eficiência e a fiabilidade do processo.

Uma forma de melhorar a eficiência é utilizar um navegador headless, que é um navegador que funciona em segundo plano sem uma GUI. Isto pode ser mais rápido do que executar um navegador completo e consome menos recursos. Para utilizar um navegador headless com o Selenium, pode utilizar o sinalizador --headless ao criar a instância do web driver.

Outra forma de melhorar a eficiência é utilizar um serviço que forneça endereços IP rotativos, como um servidor proxy. Isto pode ajudá-lo a evitar ser detetado como um scraper e bloqueado pelo site, uma vez que o endereço IP do pedido parecerá mudar a cada pedido. O WebScrapingAPI é um serviço que oferece a possibilidade de fazer scraping de um site utilizando um servidor proxy. Pode saber mais sobre como utilizar proxies para web scraping; não hesite em consultar a nossa documentação.

Para utilizar um servidor proxy com o Selenium, recomendo vivamente que utilize o selenium-wire, uma vez que é mais simples do que o Selenium puro quando se trata de se ligar a um servidor proxy. Tal como qualquer outro pacote Python, pode simplesmente instalá-lo executando o seguinte comando:

$ pip install selenium-wire

Depois, pode utilizar o seguinte exemplo de código para utilizar um servidor proxy com o Selenium:

from seleniumwire import webdriver

from selenium.webdriver.chrome.service import Service

import time

# Create a webdriver instance with the desired proxy server and authentication details

API_KEY = '<YOUR-API-KEY-HERE>'

options = {

    'proxy': {

        'http': f'http://webscrapingapi:{API_KEY}@proxy.webscrapingapi.com:80',

        'https': f'https://webscrapingapi:{API_KEY}@proxy.webscrapingapi.com:80',

        'no_proxy': 'localhost,127.0.0.1'

    }

}

driver = webdriver.Chrome(service=Service('/path/to/chromedriver'), seleniumwire_options=options)

# Use the webdriver to load a webpage

driver.get('http://httpbin.org/ip')

# When scraping JavaScript generated content it is important to wait a few seconds

time.sleep(5)

# Do something with the page, such as extract data or take a screenshot

# ...

# Close the webdriver

driver.quit()

Embora estas técnicas possam ser úteis para melhorar a eficiência e a fiabilidade do seu web scraping, é importante notar que elas estão fora do âmbito deste artigo. Para tarefas de scraping mais complexas, pode ser mais eficiente e fiável utilizar um scraper profissional, como o WebScrapingAPI. Esta ferramenta oferece funcionalidades adicionais, como rotação de IP e contorno de CAPTCHA, que podem tornar o processo de scraping muito mais fácil e fiável.

Na próxima secção, iremos resumir os passos para extrair tabelas JavaScript com Python e discutir as vantagens de utilizar um scraper profissional para tarefas mais complexas.

Resumo

Em conclusão, o scraping de tabelas JavaScript com Python é uma forma poderosa de extrair dados de sites e utilizá-los para uma variedade de fins. Quer esteja a utilizar o seu próprio código ou um scraper profissional, esta técnica pode ser uma ferramenta valiosa para recolher dados e obter insights.

Sobre o autor
Andrei Ogiolan, Desenvolvedor Full Stack @ WebScrapingAPI
Andrei OgiolanDesenvolvedor Full Stack

Andrei Ogiolan é um programador Full Stack na WebScrapingAPI, contribuindo em todas as áreas do produto e ajudando a criar ferramentas e funcionalidades fiáveis para a plataforma.

Comece a construir

Pronto para expandir a sua recolha de dados?

Junte-se a mais de 2.000 empresas que utilizam a WebScrapingAPI para extrair dados da Web à escala empresarial, sem quaisquer custos de infraestrutura.