개요
보리 프로젝트를 하면서 판매점 주소 데이터가 필요하여, 네이버 지역 검색 API를 이용해 주소 정보를 수집하였다.
로컬 환경에서 수행하지는 않았고, Google Colab을 이용하여 간단하게 Python 으로 처리하였다.
이제 방법을 알아보자.
개발 환경
- Google Colab
- Python 3.10.12
사전 지식
- 구글 코랩, 주피터 노트북 사용 방법을 알고 있다.
- 네이버에서 제공해주는 지역검색 API 문서 숙지: https://developers.naver.com/docs/serviceapi/search/local/local.md
흐름
- 네이버 개발자센터에 애플리케이션을 등록한다.
- 코랩에서 네이버 지역 검색 API를 활용해 정보를 가져온다.
애플리케이션 등록하기
먼저 네이버 개발자 센터에 들어간다.
주소: https://developers.naver.com/main/
NAVER Developers
네이버 오픈 API들을 활용해 개발자들이 다양한 애플리케이션을 개발할 수 있도록 API 가이드와 SDK를 제공합니다. 제공중인 오픈 API에는 네이버 로그인, 검색, 단축URL, 캡차를 비롯 기계번역, 음
developers.naver.com

로그인한 후, Application 메뉴를 선택하고, 애플리케이션 등록을 누른다.

자신의 애플리케이션 이름을 작성한다.
사용API 는 네이버가 제공해주는 API 서비스 중 무엇을 사용할지 고르는 것이다.
환경은 자신의 애플리케이션에 맞게 선택하면 되는데, 나는 코랩을 이용해서 간단한 웹 요청만 할거라 WEB 을 선택하고, URL도 코랩으로 넣어줬다.
로컬에서 하는 경우 localhost 정보를 넣어주면 될 것 같다.

애플리케이션 생성 후 내 애플리케이션에 들어가서 Client ID와 Client Secret을 확인할 수 있다.
API를 이용할 때 꼭 필요한 민감 정보이므로, 유출하지 않고 나만 알고 있자!
구현
from google.colab import drive
drive.mount('/content/drive')위 코드를 통해 자신의 구글 드라이브와 연결할 수 있다.
만약 기존에 가지고 있던 데이터를 활용할 것이거나, 새로운 데이터를 저장해야하는 경우에만 사용하면 된다.
import urllib.request
import json
필요한 모듈들을 먼저 import 해준다.
요청을 위해 urllib.request 를 import 해준다.
응답값을 json으로 받고 다룰 것이라 json도 import 해줬다. 필요한 사람만 import 해주면 된다.
참고로 python 에서 웹 클라이언트 요청을 할 때 사용할 때 urllib랑 requests를 둘다 사용할 수 있는데, 나는 간단한 작업을 수행할 것이기 때문에 기본 패키지인 urllib를 사용했다.
나는 데이터프레임을 다뤄야해서 pandas를 import 해줬는데, 해당 글에서 다루는 내용에서 조금 벗어나기에 제외하고 작성한다.
전체 요청하는 함수는 아래와 같다.
하나씩 살펴보자.
def request(word):
client_id = "애플리케이션 CLIENT_ID"
client_secret = "애플리케이션 CLIENT_SECRET"
encText = urllib.parse.quote(word)
url = "https://openapi.naver.com/v1/search/local.json?query=" + encText
request = urllib.request.Request(url)
request.add_header("X-Naver-Client-Id",client_id)
request.add_header("X-Naver-Client-Secret",client_secret)
response = urllib.request.urlopen(request)
response_code = response.getcode()
if(response_code == 200):
response_body = response.read()
return response_body.decode('utf-8')
else:
print("Error Code:" + response_code)
return False
client_id = "애플리케이션 CLIENT_ID"
client_secret = "애플리케이션 CLIENT_SECRET"네이버 개발자센터에서 애플리케이션을 생성하면 발급해주는 id와 secret을 적어준다.
민감 정보이기 때문에 깃허브와 외부에 노출하지 말자.
encText = urllib.parse.quote(word)검색 키워드를 인코딩 한다.
참고로 urllib.parse.quote() 는 아스키코드 형식이 아닌 글자를 URL 인코딩 해준다.
# JSON 결과 요청 url
url = "https://openapi.naver.com/v1/search/local.json?query=" + encText
# XML 결과 요청 url
url = "https://openapi.naver.com/v1/search/blog.xml?query=" + encText요청 url을 통해 어떤 형태로 응답을 받을 건지 선택할 수 있다.
나는 json으로 응답을 받았고, 그래서 전자로 작성했다.
그리고 인코딩한 검색 키워드를 요청 url에 합쳐준다.
request = urllib.request.Request(url)
request.add_header("X-Naver-Client-Id",client_id)
request.add_header("X-Naver-Client-Secret",client_secret)
작성한 요청 url로 Request() 를 생성해주는데, 바로 요청하지 않고 굳이 Request()를 이용한 이유는 id, secret을 헤더에 넣어줘야 하기 때문이다 (네이버 API 문서 참고).
response = urllib.request.urlopen(request)
response_code = response.getcode()
if(response_code==200):
response_body = response.read()
return response_body.decode('utf-8')
else:
print("Error Code:" + response_code)
return False
urlopen()을 이용하여 요청을 수행하고, 응답으로 response를 받는다.
상태코드를 통해 요청에 대한 응답이 잘 왔는지 확인한다(200 OK).
응답이 정상적으로 왔다면, response body를 decode 하여 반환한다.
이제 작성한 메서드를 이용하여 요청을 보내보자.
- 요청
response = request("포낙보청기 청주센터")- 응답
{\n\t"lastBuildDate":"Fri, 26 Jul 2024 21:04:36 +0900",\n\t"total":1,\n\t"start":1,\n\t"display":1,\n\t"items":[\n\t\t{\n\t\t\t"title":"<b>포낙보청기 청주센터<\\/b>",\n\t\t\t"link":"https:\\/\\/blog.naver.com\\/bokeumcj",\n\t\t\t"category":"쇼핑,유통>보청기",\n\t\t\t"description":"",\n\t\t\t"telephone":"",\n\t\t\t"address":"충청북도 청주시 상당구 남문로1가 130-2 1층",\n\t\t\t"roadAddress":"충청북도 청주시 상당구 상당로 17-1 1층",\n\t\t\t"mapx":"1274910094",\n\t\t\t"mapy":"366297526"\n\t\t}\n\t]\n}
응답이 잘 오긴 하는데, 결과 값이 이상하게 보인다.
이 때 json.loads()를 이용하여 다시 확인해보면, 값이 json으로 제대로 파싱된 것을 확인할 수 있을 것이다.
json_data = json.loads(response)
나는 다른 정보 말고, json의 items 키에 있는 첫 값이 필요해서 아래와 같이 값을 빼서 봤다.
json_data['items'][0]{'title': '<b>포낙보청기 청주센터</b>',
'link': 'https://blog.naver.com/bokeumcj',
'category': '쇼핑,유통>보청기',
'description': '',
'telephone': '',
'address': '충청북도 청주시 상당구 남문로1가 130-2 1층',
'roadAddress': '충청북도 청주시 상당구 상당로 17-1 1층',
'mapx': '1274910094',
'mapy': '366297526'}
이제 응답 받은 정보를 필요에 따라 사용하면된다.
'프로젝트 > 기록' 카테고리의 다른 글
| 테스트 - 외부 API 를 의존하는 OAuth 로그인 테스트하기 (4) | 2024.10.31 |
|---|---|
| 로그인 - OAuth 2.0 를 이용한 카카오 소셜 로그인 구현하기 (0) | 2024.10.31 |
| 데이터 처리 - 코랩으로 농촌진흥청 공공데이터 활용하기 (0) | 2024.10.31 |
| API 문서화 - RestDocs 와 Swagger 함께 사용하기 (2) | 2024.08.08 |