대규모 데이터셋 페이지 처리 및 수집
페이지 처리, next_cursor 패턴, time.sleep을 활용한 요청 속도 제한, 진행률 표시줄을 다룹니다.
대규모 데이터셋 페이지 처리 및 수집은(는) CoddyKit의 무료 Learn AI with Python 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Learn AI with Python 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Learn AI with Python 강의에는 총 4개의 강의가 포함되어 있습니다.
페이지네이션이 필요한 이유
API는 한 번의 응답으로 수백만 개의 레코드를 반환하는 경우가 드뭅니다. 각 응답을 작고 빠르게 유지하기 위해 결과를 페이지로 나눕니다.
전체 데이터셋을 수집하려면 모든 페이지를 반복하며 결과를 결합해야 합니다. 이 레슨에서는 일반적인 페이지네이션 방식과 요청 제한 및 진행 상황 추적을 다룹니다.
페이지 번호 기반 페이지네이션
가장 간단한 방식은 page 매개변수를 사용하는 것입니다. API가 빈 페이지를 반환할 때까지 값을 하나씩 늘립니다.
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 기반 페이지네이션
많은 최신 API는 다음 페이지를 가리키는 다음 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으로 요청 제한 준수하기
API는 초당 또는 분당 보낼 수 있는 요청 수를 제한합니다. 요청을 마구 보내면 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요청 제한 헤더 읽기
제대로 설계된 API는 X-RateLimit-Remaining 및 X-RateLimit-Reset과 같은 헤더에 남은 할당량을 알려 줍니다.
항상 sleep하는 대신 한도에 가까워졌을 때만 속도를 늦출 수 있도록 이 헤더를 확인할 수 있습니다.
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 oncetqdm으로 진행률 표시줄 만들기
긴 수집 작업은 피드백이 없으면 멈춘 것처럼 느껴집니다. 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))전체 과정 결합하기
실제 운영 환경의 수집 반복문은 모든 요소를 결합합니다. 페이지를 순회하고, 요청 제한을 위해 sleep하고, 진행 상황을 표시하고, 증분 방식으로 기록하고, 체크포인트를 저장합니다.
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)빠른 확인: 커서 페이지네이션
API가 URL인 "next" 필드를 반환하고, 마지막 페이지에서는 None을 반환합니다.
복습: 대규모 데이터셋 수집
이제 여러 페이지에 걸친 데이터셋을 수집할 수 있습니다.
- 페이지 번호 및 커서(
while next_url) 기반 페이지네이션 - 429 오류를 피하기 위한
time.sleep과 요청 제한 헤더 - 요청 제한 초과 시
Retry-After백오프 - 긴 작업을 위한
tqdm진행률 표시줄 - 오류에 대비한 증분 방식의 재개 가능한 기록
다음 주제는 수집한 데이터를 효율적으로 저장하기입니다.
자주 묻는 질문
“대규모 데이터셋 페이지 처리 및 수집” 강의는 무료인가요?
네 — “대규모 데이터셋 페이지 처리 및 수집” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Learn AI with Python 강의 전체를 잠금 해제할 수 있습니다. Learn AI with Python 강의에는 총 4개의 강의가 포함되어 있습니다.
“대규모 데이터셋 페이지 처리 및 수집”에서 뭘 배우나요?
페이지 처리, next_cursor 패턴, time.sleep을 활용한 요청 속도 제한, 진행률 표시줄을 다룹니다. 브라우저에서 직접 실행하는 실습 코드로 Learn AI with Python을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Learn AI with Python을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Learn AI with Python은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“대규모 데이터셋 페이지 처리 및 수집” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Learn AI with Python 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Learn AI with Python 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 데이터 수집을 위한 REST API 기초
- 대규모 데이터셋 페이지 처리 및 수집
- 수집 데이터의 효율적 저장
- 공공 데이터 API 활용