NAVER OpenAPI 사용방법


https://developers.naver.com/main/

🗝️ API Key 발급

  1. 애플리케이션 등록

    image.png

    Client ID : Zyel6Vr43XwDcjQKUW8o
    Client Secret : jUOmsO2Pyi
    
  2. 발급 받은 키 .env 파일에 입력

    $ pip install python-dotenv
    
    # .env
    
    NAVER_CLIENT_ID=Zyel6Vr43XwDcjQKUW8o
    NAVER_CLIENT_SECRET=jUOmsO2Pyi
    
  3. 환경 변수로 API 요청하기

    https://developers.naver.com/docs/serviceapi/search/news/news.md#뉴스 ⇒ 파라미터 확인

    import urllib.request  # 표준 라이브러리: HTTP 요청(전송/수신)을 위한 모듈
    import urllib.parse  # URL 인코딩(quote 등)을 위한 하위 모듈 ※ 원본 코드에 누락되어 있어 추가
    from dotenv import load_dotenv  # .env 파일을 로드하는 함수만 임포트
    import os  # OS 기능(특히 환경 변수 접근)을 위한 표준 라이브러리
    
    # 현재 작업 디렉터리의 .env 파일을 찾아 변수들을 OS 환경 변수에 등록
    load_dotenv()
    
    # 환경 변수 읽기
    NAVER_CLIENT_ID = os.getenv("NAVER_CLIENT_ID")
    NAVER_CLIENT_SECRET = os.getenv("NAVER_CLIENT_SECRET")
    
    # quote : 인코딩함수
    # 한글 쿼리 문자열을 URL에 안전하게 넣기 위해 퍼센트 인코딩
    encText = urllib.parse.quote("인공지능")
    
    # 검색 API 요청 URL 구성(뉴스 JSON 엔드포인트)
    url = "<https://openapi.naver.com/v1/search/news.json?query=>" + encText
    
    # HTTP 요청 객체 생성(기본 메서드: GET)
    request = urllib.request.Request(url)
    
    # 인증 헤더: 클라이언트 ID 설정
    request.add_header("X-Naver-Client-Id", NAVER_CLIENT_ID)
    # 인증 헤더: 클라이언트 시크릿 설정
    request.add_header("X-Naver-Client-Secret", NAVER_CLIENT_SECRET)
    
    # 요청 전송 후 서버 응답 수신(네트워크 I/O, 실패 시 예외 발생 가능)
    response = urllib.request.urlopen(request)
    
    # 응답 바디(바이트)를 모두 읽고 UTF-8 문자열로 디코딩해 출력
    print(response.read().decode("utf-8"))
    
    # 응답 코드(200, 404 등) 출력
    print(response.getcode()) 
    
    
    {
            "lastBuildDate":"Mon, 01 Sep 2025 14:47:50 +0900", # 검색 결과를 생성한 시간
            "total":3187611, # 총 검색 결과 개수
            "start":1,       # 검색 시작 위치
            "display":10,    # 한 번에 표시할 검색 결과 개수
            "items":         # 가져온 데이터
    	        [
                    {
                            "title":"삼성물산, ‘넥스트 리모델링’ 선보여…철거 없이도 신축 아파트처럼...",  
                            "originallink":"https:\\/\\/www.donga.com\\/news\\/Economy\\/article\\/all\\/20250901\\/132294633\\/1",
                            "link":"https:\\/\\/n.news.naver.com\\/mnews\\/article\\/020\\/0003657922?sid=101", 
                            "description":"삼성물산은 ‘넥스트 리모델링’ 단지에 에너지 절감형 외장재를 설치하고 <b>인공지능<\\/b>(AI) 주차 솔루션, 로봇 주차 시스템 등을 도입할 계획이다. 로봇 전용 엘리베이터를  짓고 층간소음 저감기술, 골조결합형... ",
                            "pubDate":"Mon, 01 Sep 2025 14:47:00 +0900" # 뉴스 기사가 네이버에 제공된 시간
                    },
                    {...},
                    {
                            "title":"[AT 산업 단신] 현대차·현대위아·현대로템·한국타이어",
                            "originallink":"https:\\/\\/www.asiatime.co.kr\\/article\\/20250901500156",       
                            "link":"https:\\/\\/www.asiatime.co.kr\\/article\\/20250901500156",
                            "description":"전차뿐만 아니라 <b>인공지능<\\/b>(AI)과 자율주행 등 미래무인기술까지 폭넓은 협력을 이어갈 수 있는 사업을 모색하겠다는 전략이다. 한국타이어 후원, 월드 랠리 챔피언십 ‘ 파라과이 랠리’ 성료 한국타이어 후원, 월드... ",
                            "pubDate":"Mon, 01 Sep 2025 14:46:00 +0900"
                    }, 
    	        ]
    }
    200
    

DB에 저장하기

# mySQL 
# ROOT 계정에서 실행
create database bookdb;
grant all privileges on bookdb.* to ohgiraffers@'%';

# bookdb 에서 실행
create table naver_book
(
	book_code int auto_increment primary key,
	book_title varchar(300),
    book_image varchar(300),
    author varchar(100),
    publisher varchar(100),
    isbn varchar(100),
    book_description varchar(3000),
    pub_date datetime
) engine=innodb;
# ./db.py
import mysql.connector

conn = mysql.connector.connect(
    host="localhost",  #
    user="ohgiraffers",  #
    password="ohgiraffers",  #
    database="bookdb",
)

# 02_naver_book_api.py
from dotenv import load_dotenv
import os
import urllib.request
import urllib.parse
import json
from db import conn

load_dotenv()

NAVER_CLIENT_ID = os.getenv("NAVER_CLIENT_ID")
NAVER_CLIENT_SECRET = os.getenv("NAVER_CLIENT_SECRET")

# 1. 검색어 설정
encText = urllib.parse.quote("인공지능")
url = "<https://openapi.naver.com/v1/search/book.json?query=>" + encText

# 2. url 및 헤더 설정
headers = {
    "X-Naver-Client-Id": NAVER_CLIENT_ID,
    "X-Naver-Client-Secret": NAVER_CLIENT_SECRET,
}
request = urllib.request.Request(url, headers=headers)

# 3. api 요청 및 결과값 json 반환
response = urllib.request.urlopen(request)
result = response.read().decode("utf-8")
data = json.loads(result)  # JSON 문자열을 딕셔너리로 변환
# print(data)

# 4. DB 연결 객체 생성
cursor = conn.cursor()

for item in data["items"]:
    insert_query = "INSERT INTO naver_book (book_title, book_image, author, publisher, isbn, book_description, pub_date) VALUES (%s, %s, %s, %s, %s, %s, %s)"
    values = (
        item["title"],
        item["image"],
        item["author"],
        item["publisher"],
        item["isbn"],
        item["description"],
        item["pubdate"],
    )
    cursor.execute(insert_query, values)

conn.commit()

print(f"{cursor.rowcount} row(s) inserted.")

cursor.close()
conn.close()