Перейти к содержанию

Пагинация

PaginatedList[T] — ленивый контейнер: первая страница загружается при создании, остальные подгружаются только при обращении к данным за их пределами. Это позволяет работать с большими списками без полной загрузки всех страниц сразу.

Ленивая итерация

for-цикл читает страницы по одной. Если вам нужны только первые несколько элементов, обход прекращается без лишних HTTP-запросов.

from avito import AvitoClient

with AvitoClient.from_env() as avito:
    listings = avito.ad(user_id=7).list(status="active", limit=2)
    for item in listings:
        print(item.item_id, item.title)

Полная загрузка

materialize() загружает все оставшиеся страницы и возвращает обычный list[T]. Используйте этот метод, когда нужны все элементы сразу.

from avito import AvitoClient

with AvitoClient.from_env() as avito:
    listings = avito.ad(user_id=7).list(status="active", limit=2)
    items = listings.materialize()

print(len(items))
print(items[0].title)

Доступ по индексу

Обращение по индексу подгружает только нужные страницы. Отрицательный индекс вызывает полную загрузку.

from avito import AvitoClient

with AvitoClient.from_env() as avito:
    listings = avito.ad(user_id=7).list(status="active", limit=2)
    first = listings[0]

print(first.item_id)

Контроль размера страницы

Параметр limit управляет количеством элементов на странице. Меньший limit снижает объём первого ответа, больший — уменьшает число запросов при полной загрузке.

from avito import AvitoClient

with AvitoClient.from_env() as avito:
    compact = avito.ad(user_id=7).list(limit=1)
    large = avito.ad(user_id=7).list(limit=10)

print(compact[0].title)
print(large[0].title)

Проверка общего числа элементов

len() возвращает известный total из ответа API, если он был передан. Если total неизвестен, len() дозагружает все страницы.

from avito import AvitoClient

with AvitoClient.from_env() as avito:
    listings = avito.ad(user_id=7).list(status="active", limit=2)
    total = len(listings)

print(total)

Пагинация со смещением

Параметр offset позволяет начать чтение не с первого элемента. Используйте его для постраничного перехода с фиксированными позициями.

from avito import AvitoClient

with AvitoClient.from_env() as avito:
    page2 = avito.ad(user_id=7).list(limit=2, offset=0)
    items = page2.materialize()

print(items[0].item_id)

Полный контракт PaginatedList описан в reference по пагинации. Семантика ленивой загрузки подробно разобрана в explanations.