41. 파이썬 웹 크롤링 기초 – 네이버 Open API를 사용하여 도서 검색하기(json)

*동영상 강의에서는 네이버 개발자센터 – 지역 검색 API를 사용합니다. *

안녕하세요. 언휴예요.

이미 네이버 개발자센터의 Open API 서비스를 이용하는 방법을 간략하게 알아보았어요. 그런데 앞에서는 단순히 질의한 전체 결과를 아무런 작업도 하지 않은 채 바로 화면에 출력하기만 했죠. 실제 프로그래밍에서는 목적에 맞게 데이터를 가공하는 작업이 필요할 거예요.

이번 프로그램에서는 json을 이용하여 원하는 항목을 추출할 거예요. 이를 위해 json을 import하세요.

#import
import urllib.request
import json

앞에서 도서 검색 API를 사용했던 부분을 함수로 변경하였습니다. 그리고 검색할 도서 제목은 입력 인자로 전달받게 수정했어요.

def searchbook(title):
    #애플리케이션 클라이언트 id 및 secret
    client_id = "[자신의 클라이언트 ID]"
    client_secret = "[자신의 클라이언트 secret]"
    
    #도서검색 url
    url = "https://openapi.naver.com/v1/search/book.json"
    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.read() 결과를 utf-8로 디코딩하여 결과를 반환할게요.

    #검색 요청 및 처리
    response = urllib.request.urlopen(request)
    rescode = response.getcode()
    if(rescode == 200):
        return response.read().decode('utf-8')
    else:
        return None

검색 결과 항목(도서) 정보를 출력하는 함수를 구현합시다. json에서는 특정 항목을 인덱서를 통해 접근할 수 있어요. 이를 이용하여 제목, 설명, 사이트 주소를 출력하세요.

#검색 결과 항목 정보 출력하기
def showitem(item):
    print("제목:"+item['title'])
    print("설명:"+item['description'])
    print("url:"+item['link'])
    print("================")

이번에는 프로그램 진입점도 함수로 정의할게요.

#프로그램 진입점
def main():

먼저 사용자가 입력한 질의를 입력 인자로 도서 검색을 요청합니다.

    #검색 질의 요청
    res = searchbook(input("질의:"))
    if(res == None):
        print("검색 실패!!!")
        exit()

도서 검색을 요청한 결과를 입력 인자로 json.loads를 호출하세요.

    #검색 결과를 json개체로 로딩
    jres = json.loads(res)
    if(jres == None):
        print("json.loads 실패!!!")
        exit()

for문을 이용하여 json 결과에 도서 항목들의 부모인 items를 인덱서를 사용하여 각 도서 항목을 post로 접근합니다. 그리고 앞에서 정의한 항목 출력하는 showitem 함수를 호출합니다.

    #검색 결과의 items 목록의 각 항목(post)을 출력
    for post in jres['items']:
        showitem(post)
#진입점 함수를 main으로 지정
if __name__ == '__main__':
    main()

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

#제목: 도서 검색 API 활용하여 도서 정보 출력

#import
import urllib.request
import json

def searchbook(title):
    #애플리케이션 클라이언트 id 및 secret
    client_id = "[자신의 client id]" 
    client_secret = "[자신의 client secret]"
    
    #도서검색 url
    url = "https://openapi.naver.com/v1/search/book.json"
    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("제목:"+item['title'])
    print("설명:"+item['description'])
    print("url:"+item['link'])
    print("================")

#프로그램 진입점
def main():
    #검색 질의 요청
    res = searchbook(input("질의:"))
    if(res == None):
        print("검색 실패!!!")
        exit()
    #검색 결과를 json개체로 로딩
    jres = json.loads(res)
    if(jres == None):
        print("json.loads 실패!!!")
        exit()

    #검색 결과의 items 목록의 각 항목(post)을 출력
    for post in jres['items']:
        showitem(post)

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