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

Основные подходы для обхода нескольких страниц

Python SELF
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 для надежного обнаружения элементов.
  • Логирование: Внедрите логирование для фиксации текущей страницы, ошибок и успешных переходов. Это упростит диагностику скрипта при его выполнении.
Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Анатолий Уровень 53
23 февраля 2026
❤️