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

셀레니움 크롤러 대신 공식 API를 선택한 이유

매일 아침 같은 작업을 반복하는 건 단순히 지루함을 넘어선 문제였다. 경쟁사 키워드를 네이버에서 검색하고, 스크롤을 내리며 블로그 제목과 링크를 하나씩 엑셀에 복사하는 과정은 시간이 너무 많이 들었고, 무엇보다 셀레니움을 쓸 때마다 불안감이 컸다. 셀레니움은 브라우저를 띄우는 무거운 라이브러리라서 시스템 자원을 많이 잡아먹는데, 네이버에서는 과도한 요청에 대해 IP 차단이나 계정 정지 사례가 꽤 자주 발생한다. 그런건 무서워서 못하지..

아무튼 그래서 공식 API를 찾아봤다. 네이버 개발자 센터에 가보니 네이버 검색 오픈 API가 있었고, 하루 25,000건까지 무료로 사용할 수 있다는 점이 매력적이었다. JSON 형태로 데이터를 받아서 훨씬 깔끔하게 처리할 수 있었고, 무엇보다 불법 크롤링이 아니니 차단 위험에서 벗어날 수 있다는 사실이 마음에 들었다. 직접 API를 신청하고, 두 번이나 예상치 못한 에러를 겪으면서도 결국은 실무에 바로 적용했다.

 

naver-developecenter

 



1. 네이버 검색 API 사용을 위한 준비

아까도 말했지만 셀레니움처럼 브라우저를 띄우는 무거운 도구는 이제 그만 쓰기로 했다. 굳이 그게 아니더라도 API를 이용하면 HTTP 통신과 데이터 처리만 하면 되니, 파이썬 기본만 알아도 충분히 따라갈 수 있다. 사실 몰라도 ai가 코딩해주니 쉽게 쓸수 있다

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

일단 라이브러리 설치는 터미널에서 딱 한 줄로 끝낸다. pip install requests pandas openpyxl — 여기서 openpyxl을 빼먹으면 pandas가 엑셀 저장할 때 내부 에러를 뿜는데, 직접 겪어 보기전에 설치하자. 이 단순한 실수 하나가 꽤 시간을 잡아먹었다.

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

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

일단 한국사람이라면 네이버 아이디는 있을 것이다. 그 계정 중 하나를 사용해서 네이버 개발자 센터(developers.naver.com)에 들어가고 나서 네이버 계정으로 로그인한다. 상단 메뉴에서 [Application] → [애플리케이션 등록]을 누르면 된다. 앱 이름은 ‘블로그_트렌드_수집기’ 같은 식으로 나중에 헷갈리지 않게 짓는 게 좋다. ‘사용 API’에서 ‘검색’을 선택해야 하는데, 여기서 ‘WEB 설정’ 부분이 가장 혼란스러웠다. 실제 서비스 도메인이 없으면 URL 입력란에 http://localhost를 넣으면 되는데, 나는 도메인이 없다는 이유로 한참 멈춰 있었다. 이 부분은 미리 알고 있으면 시간 낭비는 안할듯.

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

당연히 누구나 사용할 수 있지만 호출횟수 제한이 있으니 api가 필요하다. 네이버 API를 쓰려면 반드시 Client ID와 Client 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)

일단 내가 직접 써보니, 이 코드에서 제일 까다로운 부분은 키 복사 시 앞뒤 공백 문제였다. 테스트 할때 이게 살짝만 껴 있어도 401 인증 오류가 나서 한참 원인 찾느라 시간을 날렸다. 그리고 모바일 환경에서 API 요청하면 메뉴가 엉켜서 제대로 작동하지 않는 경우가 은근히 많더라. 그래서 나는 무조건 PC에서 작업한다. 기본적인 검색과 결과 저장에 집중한 코드라, 실제로 더 복잡한 데이터 가공이나 에러 처리 로직은 직접 추가해야 한다. 사실 요것도 ai한테 물어보면 쉽게 추가 가능.

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

네이버 검색 API가 한 번에 가져올 수 있는 데이터가 display 기준으로 최대 100개로 제한된다는 점은 알고 있어야 한다. 만약 500건 정도 데이터를 뽑아내고 싶으면 start 값을 1, 101, 201, 이런 식으로 100씩 올려가면서 반복 호출해야 한다. 여기서 sort 옵션은 ‘sim'(유사도순)과 ‘date'(최신순) 둘 중 하나를 선택해야 하는데, 이걸 잘못 고르면 원하는 결과 대신 엉뚱한 데이터가 섞여서 오히려 손만 더 가는 상황이 벌어진다.

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

셀레니움을 써본 경험으로 말하자면, 속도가 느린 건 둘째치고 여러 가지로 골치 아픈 점들이 많았다. 100건 데이터를 긁게 하기도 어렵고 오래도 걸린다. 당연히 네이버가 매크로 탐지를 강화하면서 IP나 계정이 차단돼버리는 리스크도 있으니 꼭 이부분은 고려하기 바란다.실제 구현을 하더라도 HTML 구조가 조금만 바뀌어도 크롤러가 먹통이 돼서 코드를 다시 손봐야 한다. 이런 점들을 감안하면, 단순한 데이터 수집이라도 API를 쓰는 게 정신건강에 훨씬 이롭다.

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

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

API 키를 복사해서 붙여넣은 뒤 코드를 돌렸는데 401 에러가 뜨면서 완전 당황했다. 나중에 안 것이지만 문제는 입려된 키 문자열 끝에 보이지 않는 공백 문자가 포함돼 있었던 것이다. 네이버 서버가 그 공백까지 키로 인식해 인증이 실패했다. 문자를 눈으로 확인해도 전혀 보이지 않아 한참을 헤맸는데, 결국 끝에 커서를 옮겨서 백스페이스 한 번 누르니 바로 해결됐다. 이런 사소한 실수들로 시간을 낭비하는 경우가 의외로 많다. 뭐가 되었든 코딩할때 공백은 주의하자.

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

검색어를 바꾸자마자 KeyError: ‘items’가 뜨면서 프로그램이 멈췄다. 이유는 네이버 서버가 갑작스레 500 내부 서버 오류를 반환했기 때문이다. 문제는 내가 만든 코드가 성공 응답만 믿고 data[‘items’]를 바로 열어봤다는 점이다. 서버가 실패 신호를 보내면 ‘items’ 키는 존재하지 않으니 예외가 발생하는 건 당연했다. 이걸 겪고 나서야 코드에서 응답 상태 코드를 반드시 체크하고 200번일 때만 데이터를 다루도록 코드를 수정했다.

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

내가 업무용 PC에 파이썬 검색 봇을 설치하면서 시간적으로 여유가 생겼다. 커피라도 한잔 할 수 있는 시간을 벌었다랄까?

  • 작업 시간: 예전에는 컴퓨터키고 브라우저를 켜고 필요한 페이지를 일일이 스크롤하며 엑셀에 복사-붙여넣기 하는 데 시간를 낭비했다. 지금은 스크립트 한 번 실행으로 3끝난다. 이 차이는 말로 표현하기 어렵다.
  • 데이터 품질: API에서 포스팅 날짜, 작성자 이름, 원본 링크 같은 정형 데이터가 깔끔하게 넘어와 pandas로 정리하면 오류 없는 원시 데이터가 자동으로 쌓인다. 손으로 복사하다 보면 생기던 오타와 누락 문제에서 완전히 자유로워졌다.

5. 정리

네이버 검색 오픈 API가 나와 같은 작업을 원하는 사람들에게는 무조건 추천한다.

  • 강력 추천: 경쟁사 블로그를 매일 체크하는 콘텐츠 마케터, 키워드 트렌드를 꾸준히 모니터링하는 사람, 그리고 스마트스토어 상위 노출 포스팅을 매일 점검하는 셀러등등. 반복 업무에 허비하는 시간을 전략 수립과 기획에 쏟을 수 있다.
  • 한계: 단 네이버 카페 회원 전용 게시글 이라던지 네이버 쇼핑 상세 리뷰, 로그인 후 접근 가능한 데이터는 API가 막아둔다. 이런 영역까지 다뤄야 한다면 다른 방법도 생각해야한다.
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [{
"@type": "Question",
"name": "네이버 검색 API는 상업적 용도로 사용해도 완전 무료인가요?",
"acceptedAnswer": {
"@type": "Answer",
"text": "네, 네이버 개발자 센터에서 제공하는 검색 오픈 API는 개인 및 기업의 상업적 사용을 허용하며, 하루 25,000건의 검색 요청까지 비용 없이 무료로 제공됩니다."
}
}, {
"@type": "Question",
"name": "한 번 검색할 때 수천 개의 글을 한 번에 가져올 수는 없나요?",
"acceptedAnswer": {
"@type": "Answer",
"text": "API 정책상 한 번의 호출(Request)로 가져올 수 있는 최대 데이터(display)는 100개로 제한되어 있습니다. 더 많은 데이터를 원한다면 start 파라미터를 변경하며 여러 번 호출하는 코드를 작성해야 합니다."
}
}, {
"@type": "Question",
"name": "이 API를 이용하면 네이버 카페의 게시글 본문도 수집할 수 있나요?",
"acceptedAnswer": {
"@type": "Answer",
"text": "아니요. 오픈 API는 네이버 통합검색에 노출되는 제목, 요약문(description), 원본 링크 등의 메타 데이터만 제공합니다. 카페 게시글의 상세 본문이나 댓글은 개인정보 및 보안 문제로 인해 API로 제공하지 않습니다."
}
}]
}