1. Análise de desempenho
Por que a otimização é importante?
Imagine um carro potente que pode acelerar até 100 km/h em três segundos, mas consome combustível como uma baleia - plâncton. O mesmo acontece com seu script: ele pode ser muito rápido, mas extremamente "guloso" em termos de recursos e tempo de execução. Além disso, "vazamentos" de recursos podem torná-lo instável, o que, por sua vez, pode levar a erros. A otimização ajuda a evitar esses problemas.
Primeiro de tudo, como dizem os cirurgiões, fazemos uma "incisão". Vamos realizar uma análise de desempenho do nosso script para entender onde ele pode estar "sofrendo".
Métodos para verificar a velocidade e estabilidade do script
Um dos métodos simples de análise é usar ferramentas básicas do Python, como o módulo time. Vamos adicionar algumas linhas no nosso script para entender quais operações estão consumindo mais tempo.
import time
start_time = time.time()
# Aqui está seu código para executar ações com Selenium
end_time = time.time()
print(f"Tempo de execução: {end_time - start_time} segundos")
Esse pequeno trecho de código te ajudará a determinar quanto tempo leva para executar partes do código. Com esses "cronômetros", é possível localizar os gargalos.
Identificação de pontos fracos e sua otimização
Assim que encontrar a parte do código que está "consumindo" mais tempo, tome uma atitude. Talvez você esteja acessando elementos dinâmicos com mais frequência do que o necessário, ou seu código virou uma espécie de "spaghetti". O primeiro passo é identificar; o segundo, agir.
Redução do número de requisições: Verifique se você não está navegando entre páginas ou atualizando o DOM com muita frequência. Por exemplo, usar o método WebDriverWait ajuda a executar o script apenas após o carregamento completo dos elementos desejados.
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, 'meuElementoDinamico'))
)
Cache de dados: Se você está lidando com os mesmos dados repetidamente, considere usar cache. Armazene dados em variáveis ou em cache para minimizar operações que consomem muitos recursos.
2. Melhorando a estrutura do script
Se seu código é tão legível quanto um mapa do metrô sem marcadores e nomes das estações, está na hora de melhorá-lo. Uma estrutura de código otimizada é essencial para uma compreensão fácil e maior resistência a erros.
Usando pipelines de dados e soluções algorítmicas otimizadas
Pense em estruturar seu código como um pipeline, onde cada função ou módulo é responsável por sua parte lógica. Dividir o código em blocos lógicos não só melhora a legibilidade como também facilita o debug.
def carregar_pagina(url):
driver.get(url)
def extrair_dados():
# Código para extrair dados
pass
def salvar_dados():
# Código para salvar dados
pass
carregar_pagina("http://example.com")
extrair_dados()
salvar_dados()
Melhorando a legibilidade e testabilidade do código
Siga o princípio "uma função — uma tarefa". Isso facilitará os testes e refatoração. Use constantes nomeadas em vez de "números mágicos" e strings para maior clareza.
MAX_TENTATIVAS = 5
def buscar_dados_com_tentativa():
for tentativa in range(MAX_TENTATIVAS):
try:
# Tentativa de solicitação de dados
pass
except Exception as e:
print(f"Tentativa {tentativa+1} falhou: {e}")
3. Se o código pode ser melhorado, ele deve ser melhorado
Use esperas explícitas em vez de implícitas
Esperas explícitas permitem controlar com precisão quando o Selenium deve começar a realizar ações, aguardando a presença dos elementos necessários. Em vez de confiar em esperas implícitas (como implicitly_wait), use a biblioteca WebDriverWait, que permite configurar condições específicas para os elementos (por exemplo, o elemento está visível, clicável, etc.).
Exemplo de uso de espera explícita
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(driver, 10).until(
EC.visibility_of_element_located((By.ID, "elemento_alvo"))
)
Certifique-se de que a página está pronta
Após o carregamento de uma página, nem sempre todos os elementos estão imediatamente acessíveis, especialmente se o site usar métodos de carregamento assíncrono (AJAX). Use document.readyState para verificar o carregamento completo antes de começar a interagir.
GO TO FULL VERSION