1. Analiza wydajności
Dlaczego optymalizacja jest potrzebna?
Wyobraź sobie szybkie auto, które może przyspieszyć do 100 km/h w trzy sekundy, ale zużywa paliwo jak wieloryb plankton. Twój skrypt może być bardzo szybki, ale "żarłoczny", jeśli chodzi o zasoby i czas wykonania. Co więcej, "wycieki" zasobów mogą sprawić, że będzie niestabilny, co może prowadzić do błędów. Optymalizacja pomaga uniknąć takich problemów.
Najpierw, jak mówią chirurdzy, robimy "cięcie". Przeprowadzimy analizę wydajności naszego skryptu, aby zobaczyć, gdzie może "cierpieć".
Metody sprawdzania prędkości i stabilności wykonywania skryptu
Jednym z prostych sposobów analizy jest użycie podstawowych narzędzi Python, takich jak moduł time
. Dodajmy kilka linijek do naszego skryptu, aby zobaczyć, które operacje zajmują najwięcej czasu.
import time
start_time = time.time()
# Tutaj twój kod do wykonania akcji z Selenium
end_time = time.time()
print(f"Czas wykonania: {end_time - start_time} sekund")
Ten mały fragment kodu pomoże ci określić, ile czasu zajmuje wykonanie części kodu. Dzięki takim "stoperom" można zlokalizować "wąskie gardła".
Identyfikacja słabych punktów i ich optymalizacja
Gdy znajdziesz część kodu, która "pożera" czas, możesz podjąć działania. Może być tak, że odwołujesz się do dynamicznych elementów częściej niż to konieczne, albo twój kod przypomina "spaghetti". Pierwszy krok — identyfikacja, drugi — działanie.
Zmniejszanie liczby zapytań: Sprawdź, czy nie wykonujesz zbyt wielu przejść między stronami lub aktualizacji DOM. Na przykład używanie metody WebDriverWait
pomaga uruchomić skrypt dopiero po pełnym załadowaniu pożądanych elementów.
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'))
)
Keszowanie danych: Jeśli wielokrotnie pracujesz z tymi samymi danymi, rozważ ich keszowanie. Przechowuj dane w zmiennych lub keszu, aby zminimalizować zasobożerne operacje.
2. Udoskonalenie struktury skryptu
Jeśli twój kod jest czytelny jak mapa metra bez wskaźników i nazw stacji, czas go poprawić. Optymalna struktura kodu to klucz do łatwego zrozumienia i, co za tym idzie, odporności na błędy.
Użycie pipeline'ów danych i optymalnych rozwiązań algorytmicznych
Pomyśl o strukturze swojego kodu jako o pipeline'ach, gdzie każda funkcja lub moduł odpowiada za swoją część logiki. Podzielenie kodu na logiczne bloki nie tylko poprawia czytelność, ale też ułatwia debugowanie.
def load_page(url):
driver.get(url)
def extract_data():
# Kod do wyciągania danych
pass
def save_data():
# Kod do zapisywania danych
pass
load_page("http://example.com")
extract_data()
save_data()
Poprawa czytelności i testowalności kodu
Trzymaj się zasady "jedna funkcja — jedno zadanie". To ułatwi testowanie i refaktoryzację. Używaj nazwanych stałych zamiast "magicznych liczb" i ciągów tekstowych dla większej jasności.
MAX_RETRIES = 5
def fetch_data_with_retry():
for attempt in range(MAX_RETRIES):
try:
# Próba zapytania o dane
pass
except Exception as e:
print(f"Próba {attempt+1} nie powiodła się: {e}")
3. Jeśli kod można poprawić - należy go poprawić
Używaj jawnych oczekiwań zamiast niejawnych
Jawne oczekiwania pozwalają precyzyjnie kontrolować, kiedy Selenium zaczyna wykonywać akcje, czekając na pojawienie się odpowiednich elementów. Zamiast polegać na niejawnych oczekiwaniach (np. implicitly_wait
), używaj biblioteki WebDriverWait
, która pozwala dostosować oczekiwania dla konkretnych elementów na podstawie warunków (np. element jest widoczny, dostępny do kliknięcia, itd.).
Przykład użycia jawnego oczekiwania
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"))
)
GO TO FULL VERSION