feat(realestate): API 수집 retry 로직 추가 (최대 2회, 지수 백오프)
페이지 요청 실패 시 즉시 중단 대신 1초·2초 대기 후 재시도. 2회 모두 실패 시에만 해당 엔드포인트 수집 종료, 나머지 엔드포인트 계속 진행. JSON 파싱 오류는 재시도 없이 즉시 skip. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
|
import time
|
||||||
import logging
|
import logging
|
||||||
from datetime import date, timedelta
|
from datetime import date, timedelta
|
||||||
import requests
|
import requests
|
||||||
@@ -53,17 +54,28 @@ def _api_call(endpoint: str, params: Dict[str, Any] = None) -> List[Dict]:
|
|||||||
all_data: List[Dict] = []
|
all_data: List[Dict] = []
|
||||||
page = 1
|
page = 1
|
||||||
|
|
||||||
|
_MAX_RETRIES = 2
|
||||||
while True:
|
while True:
|
||||||
base_params["page"] = page
|
base_params["page"] = page
|
||||||
try:
|
body = None
|
||||||
resp = requests.get(url, params=base_params, timeout=30)
|
for attempt in range(_MAX_RETRIES + 1):
|
||||||
resp.raise_for_status()
|
try:
|
||||||
body = resp.json()
|
resp = requests.get(url, params=base_params, timeout=30)
|
||||||
except requests.RequestException as e:
|
resp.raise_for_status()
|
||||||
logger.error("API 호출 실패 [%s page=%d]: %s", endpoint, page, e)
|
body = resp.json()
|
||||||
break
|
break
|
||||||
except ValueError as e:
|
except requests.RequestException as e:
|
||||||
logger.error("JSON 파싱 실패 [%s page=%d]: %s", endpoint, page, 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
|
break
|
||||||
|
|
||||||
data = body.get("data", [])
|
data = body.get("data", [])
|
||||||
|
|||||||
Reference in New Issue
Block a user