40. 파이썬을 이용한 Naver Open API 활용하기 – 시작하기(도서 검색)

안녕하세요. 언제나 휴일의 언휴예요. 앞으로 여러분과 함께 Python을 이용하여 빅데이터 데이터 마이닝을 해 볼 거예요.

데이터 마이닝(data mining)은 빅데이터 집합에서 가치 있는 정보를 채굴하는 프로세스입니다. 그리고 제일 먼저 Open API에서 실제 데이터를 검색하는 작업을 해 보아요.

OPEN API는 표준 웹 프로토콜을 이용하여 프로그램 개발에 사용할 수 있는 공개 API 입니다. 일반적으로 현실 세계에 있는 실제 데이터를 수집한 단체에서 개발자들이 개발하는 응용에서 사용할 수 있게 제공하고 있습니다. 이러한 OPEN API에서는 웹 쿼리로 검색 질의를 보내면 XML 문서 형태로 결과를 보내는 것이 일반적이죠.

여기에서는 Naver 검색 API를 이용하여 도서를 검색하는 간단한 콘솔 응용을 제작하는 과정을 소개할게요.

먼저 네이버 개발자센터에서  Application 메뉴를 선택하고 다시 애플리케이션 등록을 선택하세요.

[그림 1] 네이버 개발자 센터 - 내 애플리케이션 등록 선택
[그림 1] 네이버 개발자 센터 – 내 애플리케이션 등록 선택

애플리케이션 이름을 정하고 사용 API 중에서 검색을 선택하세요. 환경추가에서 WEB설정을 선택하시고 웹 서비스 URL을 입력하세요. 만약 웹 서비스 URL을 소유하고 있는 것이 없다면 http://sample.co.kr로 입력합니다.

[그림 2] 네이버 개발자 센터 - 내 애플리케이션 등록
[그림 2] 네이버 개발자 센터 – 내 애플리케이션 등록

네이버 개발자센터의 내 애플리케이션 메뉴를 선택하여 등록한 애플리케이션을 선택하면 Open API를 사용하기 위해 발급한 ClientID와 ClientSecret을 확인할 수 있습니다.

[그림 3] 애플리케이션 정보
[그림 3] 애플리케이션 정보

이제 네이버 개발자 센터의 [Document]=>[검색]을 선택하세요.

[그림 4] 네이버 개발자 센터 - 검색 선택
[그림 4] 네이버 개발자 센터 – 검색 선택

OpenAPI 서비스는 웹 서비스 URL을 이용합니다. 여기에서는 검색 서비스 중에 책을 검색하는 예를 사용할 것입니다. 네이버 개발자 센터에서 제공하는 Open API는 XML 출력포멧 혹은 JSON 출력포멧으로 결과를 제공하고 있는데 이번 게시글에서는 json 출력포멧을 이용할 것입니다. 요청 URL 주소를 기록해 두세요.

[그림 5] 검색 서비스 -책 - API 기본 정보
[그림 5] 검색 서비스 -책 – API 기본 정보

OpenAPI 서비스를 사용할 때는 요청 URL과 요청 변수를 결합하여 쿼리 문자열을 만들어서 사용합니다. 책 검색 서비스의 요청 변수는 검색하고자 하는 질의 문자열은 필수이며 이 외에 여러 종류의 요청 변수가 있습니다.

쿼리 문자열을 만드는 방법은 요청 URL?요청 변수=값&요청 변수=값… 형태로 전달합니다. 예를 들어 책 검색 서비스 요청 URL인 https://openapi.naver.com/v1/search/book.json과 요청 변수 query의 값이 언제나이고 display의 값이 3이라 가정하면 쿼리 문자열은 다음과 같습니다.

https://openapi.naver.com/v1/search/book.json?query=언제나&display=3
[그림 6] 검색 서비스 -책 - 요청 변수
[그림 6] 검색 서비스 -책 – 요청 변수

이제 프로그램에서 이를 사용하는 방법을 알아봅시다.

네이버 검색 API는 웹으로 제공하는 서비스입니다. 이를 사용하기 위해 urllib.request를 임포트하세요.

#제목: 네이버 검색 API 활용하기
#import
import urllib.request

앞에서 등록한 애플리케이션의 클라이언트 ID와 secret을 변수에 설정합니다.

#애플리케이션 클라이언트 id 및 secret
client_id = "[자신의 client id]"
client_secret = "[자신의 client secret]"

도서 검색을 위한 url과 검색 옵션 및 사용자로부터 입력받은 질의를 하나의 쿼리 문자열로 설정하는 작업을 수행합시다.

다음은 python을 질의로 count 정렬 방식의 3개의 결과를 검색 요청하는 예제 쿼리 문자열입니다.

#디폴트(json) https://openapi.naver.com/v1/search/book?query=python&display=3&sort=count
#json 방식 https://openapi.naver.com/v1/search/book.json?query=python&display=3&sort=count
#xml 방식  https://openapi.naver.com/v1/search/book.xml?query=python&display=3&sort=count

도서 검색 url과 옵션을 설정하세요.

url = "https://openapi.naver.com/v1/search/book.json"
option = "&display=3&sort=count"

사용자로부터 입력받은 질의를 쿼리 문자열에 맞게 변환하세요.

query = "?query="+urllib.parse.quote(input("질의:"))

이제 도서 검색 url과 검색 질의 및 옵션을 하나의 쿼리 문자열로 설정합니다.

url_query = url + query + option

이제 실제 Open API에 검색 요청을 위한 개체를 설정합시다. 검색 요청을 위해 쿼리 문자열을 입력 인자로 Request 개체를 생성한 후에 클라이언트 id와 클라이언트 secret을 헤더에 추가합니다. 헤더에 추가하는 것은 네이버 개발자센터의 정책이예요.

#Open API 검색 요청 개체 설정
request = urllib.request.Request(url_query)
request.add_header("X-Naver-Client-Id",client_id)
request.add_header("X-Naver-Client-Secret",client_secret)

이제 검색을 요청하고 검색 결과의 내용을 얻어와서 화면에 출력합시다.

#검색 요청 및 처리
response = urllib.request.urlopen(request)
rescode = response.getcode()

만약 검색 요청한 결과가 200이면 정상적으로 성공한 것입니다. FTP, TELNET 등 다양한 응용 프로토콜에서 요청 결과가 성공일 때의 값이 200이며 일반적으로 200 O.K라고 말해요.

if(rescode == 200):

    response_body = response.read()

    print(response_body.decode('utf-8'))

else:

    print("Error code:"+rescode)

다음은 전체 코드 및 실행 결과 화면입니다.

#제목: 네이버 검색 API 활용하기

#import
import urllib.request

#애플리케이션 클라이언트 id 및 secret
client_id = "[자신의 client id]" 
client_secret = "[자신의 client secret]"

#도서검색 url
#디폴트(json) https://openapi.naver.com/v1/search/book?query=python&display=3&sort=count
#json 방식 https://openapi.naver.com/v1/search/book.json?query=python&display=3&sort=count
#xml 방식  https://openapi.naver.com/v1/search/book.xml?query=python&display=3&sort=count
url = "https://openapi.naver.com/v1/search/book.json"
option = "&display=3&sort=count"
query = "?query="+urllib.parse.quote(input("질의:"))
url_query = url + query + option

#Open API 검색 요청 개체 설정
request = urllib.request.Request(url_query)
request.add_header("X-Naver-Client-Id",client_id)
request.add_header("X-Naver-Client-Secret",client_secret)

#검색 요청 및 처리
response = urllib.request.urlopen(request)
rescode = response.getcode()
if(rescode == 200):
    response_body = response.read()
    print(response_body.decode('utf-8'))
else:
    print("Error code:"+rescode)
[그림 7] 실행 결과 화면
[그림 7] 실행 결과 화면