100 lines
3.0 KiB
Python
100 lines
3.0 KiB
Python
"""
|
|
네이버 지역 검색 API 클라이언트
|
|
|
|
숙박/펜션 자동완성 검색 기능을 제공합니다.
|
|
"""
|
|
|
|
import logging
|
|
from typing import List
|
|
|
|
import aiohttp
|
|
|
|
from config import naver_api_settings
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class NaverSearchClient:
|
|
"""
|
|
네이버 지역 검색 API 클라이언트
|
|
|
|
숙박/펜션 카테고리 검색을 위한 클라이언트입니다.
|
|
"""
|
|
|
|
def __init__(self) -> None:
|
|
self.client_id = naver_api_settings.NAVER_CLIENT_ID
|
|
self.client_secret = naver_api_settings.NAVER_CLIENT_SECRET
|
|
self.api_url = naver_api_settings.NAVER_LOCAL_API_URL
|
|
|
|
async def search_accommodation(
|
|
self,
|
|
query: str,
|
|
display: int = 5,
|
|
) -> List[dict]:
|
|
"""
|
|
숙박/펜션 검색
|
|
|
|
Args:
|
|
query: 검색어
|
|
display: 결과 개수 (기본 5개)
|
|
|
|
Returns:
|
|
검색 결과 리스트 (address, roadAddress, title)
|
|
"""
|
|
# 숙박/펜션 카테고리 검색을 위해 쿼리에 키워드 추가
|
|
search_query = f"{query} 숙박"
|
|
|
|
headers = {
|
|
"X-Naver-Client-Id": self.client_id,
|
|
"X-Naver-Client-Secret": self.client_secret,
|
|
}
|
|
|
|
params = {
|
|
"query": search_query,
|
|
"display": display,
|
|
"sort": "random", # 정확도순
|
|
}
|
|
|
|
logger.info(f"[NAVER] 지역 검색 요청 - query: {search_query}")
|
|
|
|
try:
|
|
async with aiohttp.ClientSession() as session:
|
|
async with session.get(
|
|
self.api_url,
|
|
headers=headers,
|
|
params=params,
|
|
) as response:
|
|
if response.status != 200:
|
|
error_text = await response.text()
|
|
logger.error(
|
|
f"[NAVER] API 오류 - status: {response.status}, error: {error_text}"
|
|
)
|
|
return []
|
|
|
|
data = await response.json()
|
|
items = data.get("items", [])
|
|
|
|
# 필요한 필드만 추출
|
|
results = [
|
|
{
|
|
"address": item.get("address", ""),
|
|
"roadAddress": item.get("roadAddress", ""),
|
|
"title": item.get("title", ""),
|
|
}
|
|
for item in items
|
|
]
|
|
|
|
logger.info(f"[NAVER] 검색 완료 - 결과 수: {len(results)}")
|
|
return results
|
|
|
|
except aiohttp.ClientError as e:
|
|
logger.error(f"[NAVER] 네트워크 오류 - {str(e)}")
|
|
return []
|
|
except Exception as e:
|
|
logger.error(f"[NAVER] 예기치 않은 오류 - {str(e)}")
|
|
return []
|
|
|
|
|
|
# 싱글톤 인스턴스
|
|
naver_search_client = NaverSearchClient()
|