import requests import logging class NaverSearchAPI: def __init__(self, client_id: str, client_secret: str, logger=None): """ 네이버 검색 API 클라이언트 초기화 :param client_id: 네이버 API 클라이언트 ID :param client_secret: 네이버 API 클라이언트 Secret :param logger: 로그 기록용 객체 (선택) """ self.client_id = client_id self.client_secret = client_secret self.logger = logger def get_search_words(self, input_text, count=4): """ 입력된 문자열을 띄어쓰기로 분리 후 앞 네 개의 단어만 반환하는 메서드. :param input_text: 문자열 입력 :param count: 반환 단어 갯수 :return: 앞 네 개의 단어로 구성된 문자열 """ if not isinstance(input_text, str): raise ValueError("입력값은 문자열이어야 합니다.") # 띄어쓰기로 분리 words = input_text.split() # 앞 네 개의 단어만 추출 split_words = words[:count] # 다시 문자열로 결합하여 반환 return " ".join(split_words) def search(self, query: str, display: int = 10, start: int = 1, sort: str = "sim") -> dict: """ 네이버 검색 API로 검색어를 검색 :param query: 검색어 :param display: 검색 결과 출력 개수 (기본값: 10) :param start: 검색 시작 위치 (기본값: 1) :param sort: 정렬 옵션 ("sim": 유사도, "date": 날짜) :return: 검색 결과 JSON 데이터 """ search_words = self.get_search_words(query, 4) url = "https://openapi.naver.com/v1/search/shop.json" headers = { "X-Naver-Client-Id": self.client_id, "X-Naver-Client-Secret": self.client_secret } params = { "query": search_words, "display": display, "start": start, "sort": sort } try: response = requests.get(url, headers=headers, params=params) response.raise_for_status() # HTTP 에러 발생 시 예외 처리 search_results = response.json() result = self.parse_search_results(search_results) if self.logger: self.logger.log(f"네이버 검색 성공: {query}, 결과 개수: {len(result)}", level=logging.DEBUG) return result except requests.exceptions.RequestException as e: if self.logger: self.logger.log(f"네이버 검색 실패: {e}", level=logging.DEBUG, exc_info=True) return {"error": str(e)} def parse_search_results_list(self, search_results: dict) -> list: """검색 결과를 원하는 형식으로 변환""" detailed_products = [] # 검색 결과에서 items 리스트 추출 items = search_results.get('items', []) for item in items: # 각 항목에서 필요한 데이터 추출 title = item.get('title', '').replace('', '').replace('', '') # HTML 태그 제거 lprice = item.get('lprice', '') # 최저가 # manu_tag = item.get('brand', '') # 브랜드 # related_tags = item.get('relatedTags', []) # 연관 검색어 # 카테고리 데이터 category = [ item.get('category1', ''), item.get('category2', ''), item.get('category3', ''), item.get('category4', '') ] # 데이터 추가 detailed_products.append({ "title": title, "price": lprice, "manu_tag": '', "category": category, 'related_tags': '' }) return detailed_products def parse_search_results(self, search_results: dict) -> dict: """검색 결과를 원하는 형식으로 변환""" detailed_products = {} # 검색 결과에서 items 리스트 추출 items = search_results.get('items', []) for index, item in enumerate(items): # 각 항목에서 필요한 데이터 추출 title = item.get('title', '').replace('', '').replace('', '') # HTML 태그 제거 lprice = item.get('lprice', '') # 최저가 category = [ item.get('category1', ''), item.get('category2', ''), item.get('category3', ''), item.get('category4', '') ] # 인덱스를 키로 사용하여 딕셔너리로 저장 detailed_products[index] = { "title": title, "price": lprice, "category": category } return detailed_products # n_search = NaverSearchAPI(client_id='Uq5c9J_WdQYF8e2wOQT4', client_secret='y0CnrADAae') # query = "섬유 시편 원단 수동 절단기 컷팅기 샘플러 나이프" # search_results = n_search.search(query, display=20, start=1, sort="sim") # print("검색 search_results:", search_results) # print("items") # for item in search_results.get("items", []): # print(f"{item}")