0Pricing
Learn AI with Python · Урок

Постраничная загрузка и сбор больших наборов данных

Обработка постраничной выдачи, шаблоны next_cursor, ограничение частоты с time.sleep и индикаторы выполнения.

«Постраничная загрузка и сбор больших наборов данных» — бесплатный урок Learn AI with Python на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn AI with Python, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn AI with Python содержит 4 уроков всего.

Зачем нужна постраничная загрузка

Интерфейсы редко возвращают миллионы записей в одном ответе. Они разделяют результаты на страницы, чтобы каждый ответ оставался небольшим и быстрым.

Чтобы собрать полный набор данных, необходимо пройти по всем страницам в цикле и объединить результаты. В этом уроке рассматриваются распространённые способы постраничной загрузки, а также ограничение частоты запросов и отслеживание хода выполнения.

Постраничная загрузка по номерам страниц

В простейшей схеме используется параметр page. Увеличивайте его, пока интерфейс не вернёт пустую страницу.

import requests

all_items = []
page = 1
while True:
    resp = requests.get(url, params={"page": page, "per_page": 100}, timeout=10)
    resp.raise_for_status()
    items = resp.json()
    if not items:
        break
    all_items.extend(items)
    page += 1
print(len(all_items), "items collected")

Постраничная загрузка с курсором или следующим URL

Многие современные интерфейсы возвращают следующий URL или маркер-курсор, указывающий на следующую страницу. Выполняйте цикл, пока существует следующая ссылка.

Этот способ надёжен, поскольку сервер управляет началом следующей страницы.

all_items = []
next_url = "https://api.example.com/items?limit=100"
while next_url:
    resp = requests.get(next_url, timeout=10)
    resp.raise_for_status()
    data = resp.json()
    all_items.extend(data["results"])
    next_url = data.get("next")   # None when no more pages
print(len(all_items))

Соблюдение ограничений с помощью time.sleep

Интерфейсы ограничивают количество запросов, которые можно отправлять за секунду или минуту. Частые запросы приводят к ответу 429 Too Many Requests или блокировке.

Добавляйте небольшую паузу time.sleep между запросами, чтобы соблюдать ограничения и не создавать лишнюю нагрузку.

import time

while next_url:
    resp = requests.get(next_url, timeout=10)
    resp.raise_for_status()
    data = resp.json()
    all_items.extend(data["results"])
    next_url = data.get("next")
    time.sleep(0.5)   # 2 requests per second

Чтение заголовков ограничений запросов

Хорошо реализованные интерфейсы сообщают оставшуюся квоту в таких заголовках, как X-RateLimit-Remaining и X-RateLimit-Reset.

Вы можете читать их и замедляться только при приближении к ограничению, вместо того чтобы всегда делать паузу.

remaining = int(resp.headers.get("X-RateLimit-Remaining", 1))
if remaining < 5:
    reset = int(resp.headers.get("X-RateLimit-Reset", 1))
    print("Near limit, sleeping", reset, "s")
    time.sleep(reset)

Обработка 429 с помощью отсрочки

Если Вы всё же получили 429, ответ часто содержит заголовок Retry-After, сообщающий, сколько нужно ждать. Соблюдайте это указание перед повторной попыткой.

resp = requests.get(url, timeout=10)
if resp.status_code == 429:
    wait = int(resp.headers.get("Retry-After", 5))
    time.sleep(wait)
    resp = requests.get(url, timeout=10)   # retry once

Индикаторы выполнения с помощью tqdm

Длительные задания по сбору данных кажутся зависшими без обратной связи. tqdm оборачивает любой итерируемый объект и выводит динамический индикатор выполнения со скоростью и ETA.

from tqdm import tqdm

for page in tqdm(range(1, 101), desc="Fetching"):
    resp = requests.get(url, params={"page": page}, timeout=10)
    all_items.extend(resp.json())
    time.sleep(0.2)

tqdm при неизвестном общем количестве

При постраничной загрузке с курсором общее количество заранее неизвестно. Используйте tqdm как ручной счётчик и вызывайте update() в каждой итерации.

from tqdm import tqdm

pbar = tqdm(desc="Pages")
while next_url:
    resp = requests.get(next_url, timeout=10)
    data = resp.json()
    all_items.extend(data["results"])
    next_url = data.get("next")
    pbar.update(1)
pbar.close()

Поэтапный сбор данных

При работе с огромными наборами данных не храните всё в памяти. Поэтапный сбор данных записывает каждую страницу на диск по мере получения, поэтому сбой не приводит к потере всего прогресса.

import json

with open("items.jsonl", "w") as f:
    while next_url:
        resp = requests.get(next_url, timeout=10)
        data = resp.json()
        for item in data["results"]:
            f.write(json.dumps(item) + "\n")
        next_url = data.get("next")

Возобновляемый сбор данных

Сохраняйте последний курсор или номер страницы, чтобы при повторном запуске можно было продолжить работу, а не начинать сначала. Это делает длительные задания устойчивыми к сбоям.

import os

start_page = 1
if os.path.exists("checkpoint.txt"):
    start_page = int(open("checkpoint.txt").read()) + 1

for page in range(start_page, 1000):
    # ... fetch and store ...
    open("checkpoint.txt", "w").write(str(page))

Объединение всех элементов

Производственный цикл сбора данных объединяет все элементы: загружает страницы, делает паузы с учётом ограничений, показывает ход выполнения, записывает данные поэтапно и сохраняет контрольные точки.

from tqdm import tqdm
import time, json

with open("out.jsonl", "a") as f:
    next_url = "https://api.example.com/items?limit=100"
    pbar = tqdm(desc="Pages")
    while next_url:
        r = requests.get(next_url, timeout=10)
        r.raise_for_status()
        d = r.json()
        for it in d["results"]:
            f.write(json.dumps(it) + "\n")
        next_url = d.get("next")
        pbar.update(1)
        time.sleep(0.3)

Быстрая проверка: постраничная загрузка с курсором

Интерфейс возвращает поле "next" со значением URL или None на последней странице.

Итоги: сбор больших наборов данных

Теперь Вы умеете собирать наборы данных, охватывающие множество страниц:

  • Постраничная загрузка по номерам страниц и с курсором (while next_url)
  • time.sleep и заголовки ограничений запросов для предотвращения ответов 429
  • Отсрочка с помощью Retry-After при ограничении скорости
  • Индикаторы выполнения tqdm для длительных заданий
  • Поэтапная и возобновляемая запись для устойчивости к сбоям

Далее: эффективное хранение собранных данных.

Часто задаваемые вопросы

Урок «Постраничная загрузка и сбор больших наборов данных» бесплатный?

Да — полный текст урока «Постраничная загрузка и сбор больших наборов данных» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn AI with Python, подпишись на CoddyKit PRO. Курс Learn AI with Python содержит 4 уроков всего.

Чему я научусь в уроке «Постраничная загрузка и сбор больших наборов данных»?

Обработка постраничной выдачи, шаблоны next_cursor, ограничение частоты с time.sleep и индикаторы выполнения. Ты практикуешь Learn AI with Python с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Learn AI with Python?

Предыдущий опыт не требуется. Learn AI with Python на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Постраничная загрузка и сбор больших наборов данных»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Learn AI with Python?

Да. Каждый урок Learn AI with Python включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Основы REST API для сбора данных
  2. Постраничная загрузка и сбор больших наборов данных
  3. Эффективное хранение собранных данных
  4. Работа с общедоступными API данных
← Назад к Learn AI with Python