1. Użycie przycisku „Dalej”
Jeśli na stronie znajduje się przycisk lub link „Dalej” do przejścia na następną stronę, możesz skonfigurować pętlę, aby wykonać kliknięcia na tym przycisku, dopóki jest dostępny.
Przykład kodu
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
import time
def initialize_driver():
driver = webdriver.Chrome()
driver.implicitly_wait(10)
return driver
def open_page(driver, url):
driver.get(url)
def collect_data(driver):
# Przykład zbierania danych z obecnej strony
items = driver.find_elements(By.CLASS_NAME, "item_class")
for item in items:
print(item.text) # Tutaj można zapisać lub przetworzyć dane
def click_next_button(driver):
try:
next_button = driver.find_element(By.LINK_TEXT, "Next")
next_button.click()
return True
except NoSuchElementException:
return False # Przycisk nie został znaleziony, czyli jesteśmy na ostatniej stronie
def main():
driver = initialize_driver()
open_page(driver, "https://example.com/page1")
try:
while True:
collect_data(driver)
if not click_next_button(driver):
break # Wyjście z pętli, jeśli przycisk "Next" jest niedostępny
time.sleep(2) # Opóźnienie dla załadowania następnej strony
finally:
driver.quit()
main()
Wyjaśnienie kodu
initialize_driver() — inicjalizacja drivera.
open_page() — otwarcie pierwszej strony, aby rozpocząć pracę.
collect_data() — funkcja do zbierania danych z obecnej strony.
click_next_button() — funkcja, która znajduje i klika przycisk „Next”. Jeśli przycisk jest niedostępny, zwraca False, co oznacza zakończenie przeglądania.
Pętla w main() — główna pętla do przeglądania stron. Kończy pracę, kiedy przycisk „Next” nie jest już dostępny.
2. Paginacja z użyciem numerów stron
Na niektórych stronach pojawiają się numerowane linki do stron (np. „1”, „2”, „3” i tak dalej). W takich przypadkach możesz zebrać listę linków i przejść po nich kolejno.
Przykład kodu
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
def initialize_driver():
driver = webdriver.Chrome()
driver.implicitly_wait(10)
return driver
def open_page(driver, url):
driver.get(url)
def collect_data(driver):
items = driver.find_elements(By.CLASS_NAME, "item_class")
for item in items:
print(item.text)
def go_to_page(driver, page_number):
page_link = driver.find_element(By.LINK_TEXT, str(page_number))
page_link.click()
def main():
driver = initialize_driver()
open_page(driver, "https://example.com/page1")
try:
total_pages = 5 # Podaj całkowitą liczbę stron, jeśli znana
for page in range(1, total_pages + 1):
collect_data(driver)
if page < total_pages: # Nie przechodź na następną stronę po ostatniej
go_to_page(driver, page + 1)
time.sleep(2) # Opóźnienie dla załadowania następnej strony
finally:
driver.quit()
main()
Wyjaśnienie kodu
go_to_page() — funkcja, która znajduje link do odpowiedniej strony na podstawie jej numeru i przechodzi do niej.
Pętla w main() — używa zmiennej total_pages, aby określić liczbę stron. Pętla przechodzi na kolejną stronę, aż do osiągnięcia ostatniej.
3. Zmiana URL dla każdej strony
Niektóre strony mają prostą strukturę URL, gdzie każda strona jest identyfikowana numerem w URL, np. https://example.com/page/1, https://example.com/page/2 itd. Wtedy można po prostu zmieniać URL i ładować odpowiednią stronę, unikając konieczności szukania elementów na stronie.
Przykład kodu
Ważne: przykłady poniżej używają składni Selenium 3. W Selenium 4 metody find_element_by_* zostały usunięte (ostatecznie od wersji 4.3.0): zamiast nich używa się uniwersalnej metody find_element() ze strategią z klasy By. Dlatego po każdym przykładzie podajemy jego wersję dla Selenium 4.
from selenium import webdriver
import time
def initialize_driver():
driver = webdriver.Chrome()
driver.implicitly_wait(10)
return driver
def open_page(driver, url):
driver.get(url)
def collect_data(driver):
items = driver.find_elements_by_class_name("item_class")
for item in items:
print(item.text)
def main():
driver = initialize_driver()
try:
total_pages = 5 # Podaj całkowitą liczbę stron, jeśli znana
base_url = "https://example.com/page/"
for page_number in range(1, total_pages + 1):
url = f"{base_url}{page_number}"
open_page(driver, url)
collect_data(driver)
time.sleep(2) # Opóźnienie dla załadowania następnej strony
finally:
driver.quit()
main()
To samo w Selenium 4:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
def initialize_driver():
driver = webdriver.Chrome()
driver.implicitly_wait(10)
return driver
def open_page(driver, url):
driver.get(url)
def collect_data(driver):
items = driver.find_elements(By.CLASS_NAME, "item_class")
for item in items:
print(item.text)
def main():
driver = initialize_driver()
try:
total_pages = 5 # Podaj całkowitą liczbę stron, jeśli znana
base_url = "https://example.com/page/"
for page_number in range(1, total_pages + 1):
url = f"{base_url}{page_number}"
open_page(driver, url)
collect_data(driver)
time.sleep(2) # Opóźnienie dla załadowania następnej strony
finally:
driver.quit()
main()
Wyjaśnienie kodu
Zmienne base_url zawiera bazowy URL strony. Pętla uzupełnia go numerem strony i kolejno otwiera każdą stronę.
Pętla generuje URL każdej strony i wykonuje zbieranie danych bez klikania elementów. To minimalizuje prawdopodobieństwo wystąpienia błędów.
4. Wskazówki dotyczące optymalizacji
- Minimalizuj oczekiwania i kliki na dynamicznych elementach: Użycie linków i URL jest bardziej stabilne niż klikanie przycisków ładowanych przez JavaScript.
- Użyj timerów oczekiwania z minimalnym opóźnieniem: Przy przejściu na nową stronę używaj krótkiego opóźnienia
time.sleep(2), aby elementy zdążyły się załadować, ale nie czekaj dłużej niż to konieczne. - Zbieraj dane po załadowaniu całej strony: Upewnij się, że dane na stronie zostały w pełni załadowane przed rozpoczęciem ich zbierania. Użyj
implicitly_waitdla pewniejszego znajdywania elementów. - Logowanie: Wprowadź logowanie, aby rejestrować aktualną stronę, błędy i udane przejścia. To ułatwi diagnozowanie skryptu podczas jego wykonywania.
GO TO FULL VERSION