네이버 검색 API 무료 신청하고 파이썬으로 데이터 가져오기


셀레니움 크롤러를 버리고 공식 API로 갈아탄 이유

석 달째 매일 아침 똑같은 작업을 반복했다. 경쟁사 키워드를 네이버에 검색하고, 스크롤을 내리며 블로그 제목과 링크를 엑셀에 손으로 옮기는 일이었다. 지루함의 한계에서 BeautifulSoup과 셀레니움을 찾아봤다. 그런데 검색을 하면 할수록 불안한 이야기만 나왔다. “과도한 트래픽으로 IP가 차단됐다”, “계정이 정지됐다”는 후기들이었다.

고민하다 네이버 개발자 센터를 열었다. 거기에 공식 네이버 검색 오픈 API가 있었다. 하루 25,000건까지 완전 무료. 정제된 JSON으로 깔끔하게 데이터를 준다. 불법 크롤링 대신 네이버가 직접 열어둔 문을 쓰는 것이니 차단 걱정도 없었다. 직접 신청하고, 에러를 두 번 만나고, 결국 실무에 붙여넣기까지 거친 과정을 전부 공개한다.



1. 개발 환경 및 사전 준비

셀레니움처럼 브라우저를 강제로 띄우는 무거운 라이브러리는 필요 없다. HTTP 통신과 데이터 가공만 하면 되므로, 파이썬 기초만 있으면 충분히 따라올 수 있다.

  • 운영체제: Windows 11 Pro, RAM 16GB
  • Python 버전: 3.12.2
  • 코드 편집기: VS Code
  • 핵심 라이브러리: requests (API 통신), pandas (데이터 가공 및 엑셀 저장)
  • 필요 계정: 네이버 일반 계정 하나면 충분 (신용카드 연동 불필요)

라이브러리 설치는 터미널에서 한 줄로 끝난다. pip install requests pandas openpyxlopenpyxl은 pandas가 엑셀 파일을 저장할 때 내부적으로 사용하므로 함께 설치하는 것이 좋다. 이걸 빠뜨렸다가 저장 단계에서 에러를 만났다.

2. API 발급부터 파이썬 자동 수집까지 단계별 실습

1단계: 네이버 개발자 센터에서 앱 등록

네이버 개발자 센터(developers.naver.com)에 본인 계정으로 로그인한다. 상단 [Application] → [애플리케이션 등록]을 클릭한다. 이름은 ‘블로그_트렌드_수집기’처럼 알아보기 쉽게 적고, ‘사용 API’에서 ‘검색’을 선택한다. 비로그인 오픈 API 서비스 환경은 ‘WEB 설정’으로 택하고, URL 입력란에 http://localhost를 넣으면 된다. 실제 서비스 도메인이 없어도 API 발급에는 전혀 문제없다.

2단계: Client ID와 Client Secret 발급 및 보관

등록 완료 후 화면 중앙에 Client IDClient Secret이 나타난다. 이 두 키가 네이버 서버의 문을 여는 신분증이다. 절대 깃허브나 공개된 곳에 올리면 안 된다. 누군가 이 키를 가져가면 내 일일 25,000회 할당량을 소진시켜 버린다. 안전한 메모장이나 비밀번호 관리 앱에 복사해 보관하자.

3단계: 파이썬 자동 수집 전체 코드

naver_search.py 파일을 만들고 아래 코드를 붙여 넣는다. ‘인공지능 트렌드’ 키워드로 블로그 검색 결과 100건을 가져와 HTML 태그를 제거한 뒤 엑셀로 자동 저장하는 완전한 파이프라인이다.

import requests
import pandas as pd

# 발급받은 키를 여기에 입력 (공백 주의 — 401 에러의 원인)
client_id = "여러분의_CLIENT_ID"
client_secret = "여러분의_CLIENT_SECRET"

query = "인공지능 트렌드"
url = f"https://openapi.naver.com/v1/search/blog.json?query={query}&display=100&start=1&sort=sim"

headers = {
    "X-Naver-Client-Id": client_id,
    "X-Naver-Client-Secret": client_secret
}

print(f"[{query}] 키워드로 네이버 블로그 데이터를 수집합니다...")
response = requests.get(url, headers=headers)

if response.status_code == 200:
    data = response.json()
    items = data['items']
    df = pd.DataFrame(items)

    # HTML 태그 클렌징 (,  등 제거)
    df['title'] = df['title'].str.replace('', '').str.replace('', '')
    df['description'] = df['description'].str.replace('', '').str.replace('', '')

    df.to_excel('naver_blog_result.xlsx', index=False)
    print("완료! 'naver_blog_result.xlsx' 파일이 생성됐습니다.")
else:
    print(f"에러 발생: {response.status_code}")
    print(response.text)

⚠ 파라미터 한계와 API vs 크롤링 비교

한 번 호출로 가져올 수 있는 최대 건수(display)는 100개다. 500개가 필요하면 start 파라미터를 1, 101, 201… 순서로 100씩 늘리며 for 반복문을 돌리면 된다. 정렬 방식(sort)은 ‘sim'(유사도순)과 ‘date'(최신순) 중 목적에 맞게 골라야 원하지 않는 데이터가 섞이지 않는다.

비교 항목 네이버 검색 API (추천) 셀레니움 크롤링 (비추천)
속도 100건 약 0.5초 100건 15~30초
차단 위험 하루 25,000회 공식 허용, 차단 없음 매크로 탐지 → 계정·IP 정지 위험
데이터 형태 정제된 JSON, 즉시 엑셀 변환 가능 HTML DOM 파싱 필요, 구조 변경 시 코드 전면 수정

3. 직접 겪은 HTTP 에러 2가지와 해결법

에러 ① 401 Unauthorized — 보이지 않는 공백의 함정

코드를 완벽히 짜고 실행 버튼을 눌렀는데 빨간 글씨로 401이 떴다. “계정이 정지됐나?” 식은땀이 흘렀다. 한 시간을 헤맨 끝에 원인을 찾았다. 웹페이지에서 Client ID를 복사해 붙여넣을 때 문자열 맨 끝에 눈에 보이지 않는 공백이 하나 들어가 있었던 것이다. 네이버 서버는 그 공백까지 포함된 문자열을 엉뚱한 키로 인식했다. 따옴표 안에서 커서를 맨 끝으로 옮겨 백스페이스를 한 번 누르자 즉시 정상 작동했다. API 키를 복붙할 때는 앞뒤 공백을 반드시 육안으로 확인해야 한다.

에러 ② KeyError ‘items’ — 서버 오류를 가정하지 않은 코드의 대가

잘 쓰던 코드가 어느 날 검색어를 바꾸자 KeyError: 'items'를 내뱉으며 멈췄다. 원인은 코드 구조의 허점이었다. 네이버 서버가 일시적인 500 오류를 반환했는데, 내 코드는 “요청이 항상 성공한다”고 가정하고 무조건 data['items']를 열려 했다. 없는 키를 열려 하니 예외가 터진 것이다. 그 뒤로 위 코드처럼 if response.status_code == 200: 조건문을 달아 성공한 경우에만 데이터를 처리하도록 고쳤다. 서버 응답을 항상 신뢰하면 안 된다는 걸 몸으로 배웠다.

4. 자동화 도입 후 달라진 업무 수치

파이썬 검색 봇을 업무용 PC에 세팅한 뒤 아침 루틴이 바뀌었다. 숫자로 정리하면 아래와 같다.

  • 작업 시간: 브라우저를 열고 스크롤 내리며 엑셀에 손으로 붙여넣던 매일 2시간짜리 작업이, 스크립트 실행 한 번으로 3초로 줄었다
  • 데이터 품질: API는 포스팅 날짜, 블로거 이름, 원본 링크까지 정형화된 형태로 제공한다. pandas로 클렌징하면 오타 없는 완벽한 로우 데이터가 매일 자동으로 쌓인다
  • 심리적 안정: IP 차단 공포를 안고 크롤러를 돌리던 시절과 달리, 하루 25,000건이라는 공식 허용 범위 안에서 당당하게 데이터를 긁어온다. 불안감이 사라지자 오히려 분석에 더 집중하게 됐다

5. 이 방법이 맞는 사람과 한계를 넘는 방법

네이버 검색 오픈 API로 가장 효과를 보는 대상은 명확하다.

  • 강력 추천: 경쟁사 블로그 모니터링이 일상인 콘텐츠 마케터, 키워드 트렌드를 추적해야 하는 시장 분석가, 스마트스토어 상위 포스팅을 매일 체크하는 셀러. 반복 작업에 쓰이는 에너지를 기획에 돌릴 수 있다
  • 한계: 네이버 카페의 회원 전용 게시글, 네이버 쇼핑의 상세 리뷰, 로그인해야 보이는 데이터는 이 오픈 API로 가져올 수 없다. 그 영역까지 필요하다면 셀레니움 기반 브라우저 자동화를 별도로 학습하는 것이 맞다

API 키 공백 하나 때문에 한 시간을 날리고, 예외 처리를 빠뜨려서 코드가 터지는 경험을 거치고 나니 오히려 코드가 단단해졌다. 막혀서 뚫는 과정이 결국 제일 빠른 학습이다.