https://developers.naver.com/main/
애플리케이션 등록

Client ID : Zyel6Vr43XwDcjQKUW8o
Client Secret : jUOmsO2Pyi
발급 받은 키 .env 파일에 입력
$ pip install python-dotenv
# .env
NAVER_CLIENT_ID=Zyel6Vr43XwDcjQKUW8o
NAVER_CLIENT_SECRET=jUOmsO2Pyi
환경 변수로 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
# 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()