43. 파이썬으로 네이버 Open API를 사용하여 도서 검색하기(xml)

안녕하세요. 언휴예요.

앞에서 네이버 개발자센터에서 제공하는 Open API 서비스를 이용하여 도서 검색하는 프로그램을 작성해 보았어요. 이 때 사용한 방식은 Json 방식을 사용하였는데 이번에는 XML 방식으로 사용하는 것을 살펴볼게요.

#제목: Open API를 활용하여 도서 정보 출력
#naver 개발자센터 - 검색/도서
#방식: xml

먼저 import 구문을 작성합시다. urllib.request를 이용하여 Open API 서비스를 요청할 거예요. 그리고 요청 결과를 분석하기 위해 BeautifulSoup을 사용합니다.

import urllib.request
from bs4 import BeautifulSoup

앞에서 Json 방식으로 도서 검색을 요청했던 부분입니다. 이 부분은 Open API 서비스를 요청하는 부분으로 차이가 있는 부분은 url부분만 차이가 있습니다.

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

    #도서검색 url
    url = "https://openapi.naver.com/v1/search/book.xml"
    option = "&display=3&sort=count"   
    query = "?query="+urllib.parse.quote(title)
    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):
        return response.read().decode('utf-8')
    else:
        return None

이번에는 검색한 도서 한 권의 정보를 출력하는 showitem 기능을 구현합시다. 앞에서 BeautifulSoup 사용법을 소개하면서 부모에서 자식 태그에 접근할 때 “부모.자식” 형태로 접근한다고 하였습니다. 그리고 내부 문자열을 접근할 때 get_text()함수를 이용합니다.

#검색 결과 항목 정보 출력하기
def showitem(item):
    print('<--------------------------')
    print('제목 : ' + item.title.get_text())
    print('설명 : ' + item.description.get_text())
    print('-------------------------->\n')

이번에는 프로그램 진입점을 작성합시다. 질의를 요청하는 부분까지는 같습니다.

#프로그램 진입점
def main():
    #검색 질의 요청
    res = searchbook(input("질의:"))
    if(res == None):
        print("검색 실패!!!")
        exit()

BeautifulSoup을 이용하여 결과 내용과 ‘html.parser’를 전달하여 파싱에 사용할 개체를 구해옵니다.

    xmlsoup = BeautifulSoup(res,'html.parser')

파싱에 사용할 개체의 find_all 함수에 도서 한 권의 정보를 갖고 있는 요소 이름인 ‘item’을 전달하여 전체 도서 목록을 포함하는 개체를 구해옵니다.

    items = xmlsoup.find_all('item')

전체 도서 목록에서 각 도서 목록에 접근하여 해당 도서의 정보를 출력합니다. 이 때 한 권의 책의 정보를 출력하는 것은 앞에서 작성한 showitem 함수를 호출하세요.

    for item in items:
        showitem(item)

#진입점 함수를 main으로 지정

if __name__ == '__main__':
    main()

다음은 실습한 전체 소스 코드와 실행 결과 화면입니다.

#제목: Open API를 활용하여 도서 정보 출력
#naver 개발자센터 - 검색/도서
#방식: xml 

import urllib.request
from bs4 import BeautifulSoup

def searchbook(title):
    #애플리케이션 클라이언트 id 및 secret
    client_id = "[자신의 client id]" 
    client_secret = "[자신의 client secret]"
    
    #도서검색 url
    url = "https://openapi.naver.com/v1/search/book.xml"
    option = "&display=3&sort=count"    
    query = "?query="+urllib.parse.quote(title)
    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):
        return response.read().decode('utf-8')
    else:
        return None

#검색 결과 항목 정보 출력하기
def showitem(item):
    print('<--------------------------')
    print('제목 : ' + item.title.get_text())
    print('설명 : ' + item.description.get_text())
    print('-------------------------->\n')

#프로그램 진입점
def main():
    #검색 질의 요청
    res = searchbook(input("질의:"))
    if(res == None):
        print("검색 실패!!!")
        exit()
    xmlsoup = BeautifulSoup(res,'html.parser')
    items = xmlsoup.find_all('item')
    for item in items:
        showitem(item)

#진입점 함수를 main으로 지정
if __name__ == '__main__':
    main()
[그림 1] 실행 결과 화면
[그림 1] 실행 결과 화면