diff --git a/realestate-lab/app/collector.py b/realestate-lab/app/collector.py index ee752c6..2310bc4 100644 --- a/realestate-lab/app/collector.py +++ b/realestate-lab/app/collector.py @@ -1,5 +1,6 @@ import os import re +import time import logging from datetime import date, timedelta import requests @@ -53,17 +54,28 @@ def _api_call(endpoint: str, params: Dict[str, Any] = None) -> List[Dict]: all_data: List[Dict] = [] page = 1 + _MAX_RETRIES = 2 while True: base_params["page"] = page - try: - resp = requests.get(url, params=base_params, timeout=30) - resp.raise_for_status() - body = resp.json() - except requests.RequestException as e: - logger.error("API 호출 실패 [%s page=%d]: %s", endpoint, page, e) - break - except ValueError as e: - logger.error("JSON 파싱 실패 [%s page=%d]: %s", endpoint, page, e) + body = None + for attempt in range(_MAX_RETRIES + 1): + try: + resp = requests.get(url, params=base_params, timeout=30) + resp.raise_for_status() + body = resp.json() + break + except requests.RequestException as e: + if attempt < _MAX_RETRIES: + logger.warning("API 호출 실패 [%s page=%d] — %d초 후 재시도 (%d/%d): %s", + endpoint, page, 2 ** attempt, attempt + 1, _MAX_RETRIES, e) + time.sleep(2 ** attempt) + else: + logger.error("API 호출 최종 실패 [%s page=%d]: %s", endpoint, page, e) + except ValueError as e: + logger.error("JSON 파싱 실패 [%s page=%d]: %s", endpoint, page, e) + break # 파싱 오류는 재시도 무의미 + + if body is None: break data = body.get("data", [])