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.
Introdução
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 Byimport 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 webpagedriver.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.




