1. Analyse des performances
Pourquoi l'optimisation est importante ?
Imagine une voiture puissante qui peut accélérer à 100 km/h en trois secondes, mais qui consomme du carburant comme une baleine mange du plancton. Eh bien, ton script peut aussi être super rapide mais très "gourmand" en ressources et en temps d'exécution. En plus, des "fuites" de ressources peuvent le rendre instable, ce qui peut à son tour causer des erreurs. L'optimisation sert à éviter ce genre de problèmes.
Tout d'abord, comme disent les chirurgiens, faisons une "incision". On va analyser les performances de notre script pour comprendre où il peut "souffrir".
Méthodes pour tester la vitesse et la stabilité d'un script
Une des manières simples d'analyse est d'utiliser les outils de base de Python, comme le module time. Ajoutons quelques lignes à notre script pour voir quelles opérations prennent le plus de temps.
import time
start_time = time.time()
# Ici ton code pour exécuter les actions avec Selenium
end_time = time.time()
print(f"Temps d'exécution : {end_time - start_time} secondes")
Ce petit bout de code t'aidera à déterminer combien de temps prend l'exécution d'une partie du code. Avec ces "timers", on peut localiser les "zones problématiques".
Identifier les faiblesses et les optimiser
Une fois que tu as trouvé la partie du code qui "bouffe" du temps, il est temps d'agir. Peut-être que tu accèdes trop souvent à des éléments dynamiques ou que ton code ressemble à des "spaghettis". La première étape, c'est l'identification, la deuxième — l'action.
Réduire le nombre de requêtes : Vérifie si tu ne fais pas beaucoup de transitions inutiles entre les pages ou de mises à jour du DOM. Par exemple, utiliser la méthode WebDriverWait permet de lancer le script uniquement après le chargement complet des éléments souhaités.
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, 'myDynamicElement'))
)
Mettre en cache les données : Si tu travailles avec les mêmes données plusieurs fois, pense à les mettre en cache. Stocker les données dans des variables ou un cache permet de minimiser les opérations coûteuses en ressources.
2. Amélioration de la structure du script
Si ton code est lisible comme un plan de métro sans légendes ni noms de stations, il est temps de l'améliorer. Une structure de code optimale garantit une compréhension facile et réduit les erreurs.
Utilisation de pipelines de données et de solutions algorithmiques optimales
Pense à structurer ton code sous forme de pipelines, où chaque fonction ou module est responsable d'une partie de la logique. Diviser le code en blocs logiques améliore non seulement sa lisibilité, mais facilite aussi le débogage.
def load_page(url):
driver.get(url)
def extract_data():
# Code pour extraire les données
pass
def save_data():
# Code pour sauvegarder les données
pass
load_page("http://example.com")
extract_data()
save_data()
Améliorer la lisibilité et la testabilité du code
Suis le principe "une fonction — une tâche". Cela facilitera les tests et le refactoring. Utilise des constantes nommées au lieu de "nombres magiques" et de chaînes pour plus de clarté.
MAX_RETRIES = 5
def fetch_data_with_retry():
for attempt in range(MAX_RETRIES):
try:
# Tentative de requête de données
pass
except Exception as e:
print(f"Tentative {attempt+1} échouée : {e}")
3. Si ton code peut être amélioré, améliore-le
Utilise des attentes explicites au lieu d'implicites
Les attentes explicites te permettent de contrôler précisément quand Selenium commence à exécuter des actions, en attendant l'apparition des éléments nécessaires. Plutôt que de te fier à des attentes implicites (comme implicitly_wait), utilise la bibliothèque WebDriverWait, qui permet de configurer des attentes pour des éléments spécifiques basées sur des conditions (par exemple, un élément est visible, disponible pour cliquer, etc.).
Exemple d'attente explicite
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, "target_element"))
)
Assure-toi que la page est prête
Après le chargement de la page, tous les éléments ne sont pas toujours immédiatement disponibles, surtout si le site utilise des méthodes de chargement asynchrones (AJAX). Utilise document.readyState pour vérifier le chargement complet du document avant de commencer toute interaction.
Exemple de vérification de chargement complet de la page
def wait_for_page_load(driver):
WebDriverWait(driver, 10).until(
lambda d: d.execute_script("return document.readyState") == "complete"
)
GO TO FULL VERSION