JavaRush /Курси /Python SELF UA /Основні підходи для обходу декількох сторінок

Основні підходи для обходу декількох сторінок

Python SELF UA
Рівень 38 , Лекція 2
Відкрита

1. Використання кнопки «Далі»

Якщо на сайті є кнопка або посилання «Далі» для переходу до наступної сторінки, то можна налаштувати цикл для виконання кліків по цій кнопці, поки вона доступна.

Приклад коду

Python

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):
    # Приклад збору даних з поточної сторінки
    items = driver.find_elements(By.CLASS_NAME, "item_class")
    for item in items:
        print(item.text)  # Тут можна зберегти або обробити дані
    
def click_next_button(driver):
    try:
        next_button = driver.find_element(By.LINK_TEXT, "Next")
        next_button.click()
        return True
    except NoSuchElementException:
        return False  # Кнопка не знайдена, отже ми на останній сторінці

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  # Вихід з циклу, якщо кнопка "Next" відсутня
            time.sleep(2)  # Затримка для завантаження наступної сторінки
    finally:
        driver.quit()

main()

Пояснення коду

initialize_driver() — ініціалізація драйвера.
open_page() — відкриття першої сторінки для початку роботи.
collect_data() — функція для збору даних з поточної сторінки.
click_next_button() — функція, яка знаходить і натискає кнопку «Next». Якщо кнопка відсутня, повертає False, що означає завершення обходу.
Цикл в main() — основний цикл для обходу сторінок. Він завершує роботу, коли кнопка «Next» більше не знаходиться.

2. Пагінація з використанням номерів сторінок

На деяких сайтах присутні пронумеровані посилання сторінок (наприклад, «1», «2», «3» і так далі). У таких випадках можна зібрати список посилань і переходити по кожному з них послідовно.

Приклад коду

Python

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  # Вкажіть загальну кількість сторінок, якщо відомо
        for page in range(1, total_pages + 1):
            collect_data(driver)
            if page < total_pages:  # Не переходимо на наступну сторінку після останньої
                go_to_page(driver, page + 1)
                time.sleep(2)  # Затримка для завантаження наступної сторінки
    finally:
        driver.quit()

main()

Пояснення коду

go_to_page() — функція, яка знаходить посилання на потрібну сторінку за її номером і переходить на неї.
Цикл в main() — використовує змінну total_pages для визначення кількості сторінок. Цикл переходить на наступну сторінку, поки не досягне останньої.

3. Зміна URL для кожної сторінки

Деякі сайти мають просту структуру URL, де кожна сторінка ідентифікується номером у URL, наприклад, https://example.com/page/1, https://example.com/page/2 і т.д. У цьому випадку можна просто змінювати URL і завантажувати потрібну сторінку, уникаючи необхідності в пошуку елементів.

Приклад коду

Python

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  # Вкажіть загальну кількість сторінок, якщо відомо
        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)  # Затримка для завантаження наступної сторінки
    finally:
        driver.quit()

main()

Пояснення коду

Змінна base_url містить базовий URL сторінки. Цикл доповнює його номером сторінки і відкриває по черзі кожну сторінку.
Цикл генерує URL кожної сторінки і виконує збір даних без кліків по елементах. Це мінімізує ймовірність виникнення помилок.

4. Поради з оптимізації

  • Мінімізуйте очікування та кліки по динамічних елементах: Використання посилань і URL більш стійке, ніж кліки по кнопках, підвантажуваним JavaScript.
  • Використовуйте таймери очікування з мінімальною затримкою: При переході на нову сторінку використовуйте невелику затримку time.sleep(2), щоб елементи встигли завантажитися, але не затримуйтеся довше, ніж необхідно.
  • Збирайте дані після завантаження усієї сторінки: Переконайтеся, що дані на сторінці повністю завантажені перед початком їх збору. Використовуйте implicitly_wait для надійного виявлення елементів.
  • Логування: Впровадьте логування для фіксації поточної сторінки, помилок і успішних переходів. Це спростить діагностику скрипта під час його виконання.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ