2022년 3월 VBA로 ISBN로 네이버 OpenAPI를 검색하여 관리하는 엑셀 파일을 만들었는데...
https://halbe.kr/83
엑셀 VBA로 도서 관리 : ISBN이용 네이버 OpenAPI 도서정보
갖고 있는 책이 좀 많다보니 이미 가지고 있는데 바보같이 같은 책을 또 사는 일이 몇번 있었다. 안되겠다 싶어 갖고 있는 모든 책을 관리해야 겠다는 생각을 하게 되었다. 어떻게 하지? 엑셀로
halbe.kr
네이버에서 제공하는 정보가 부족한 것들이 있고 책 가격 정보를 2022년 중간에 OpenAPI에서 제외하면서 더는 네이버로 관리하기 어렵겠다는 생각을 해 왔다.
이런저런 문제로 국립중앙도서관 OpenAPI를 이용해 보겠다는 언급을 했었는데 1년 반정도가 지나서야 국립중앙도서관 OpenAPI를 이용해서 관리하고 있다.
결론을 적자면 국립중앙도서관에서 제공하는 OpenAPI를 통해 가져오는 데이터도 깔끔하지가 않다. 그리고 정보가 없는 책도 있고 앞선 글에서도 얘기한 것처럼 같은 ISBN에 두 개 이상의 책이 존재하는 경우도 여전히 있다.(당연한 얘기이지만)
특히 네이버 OpenAPI보다 국립중앙도서관 OpenAPI를 사용하고자 했던 목적 중 하나가 페이지 수 항목이 있기 때문이었는데 페이지 수가 없는 경우들이 많다. 너무 아쉬운 부분들이다.
왜일까? 추측해 보건대 도서 정보를 아르바이트생등을 통해 일괄 입력하지 않을까 싶은데 누락되는 경우들이 많은 게 아닐까 생각해 본다. 그 이유는 다른 항목들 예를 들면 VOL 필드가 있는데 이게 시리즈(예:나의 문화유산답사기등)로 나올 경우 몇 권인지를 갖고 있는 필드인데 장기간에 걸쳐 출판되는 경우 이 필드 항목이 없는 권들이 생긴다.
글로 쓰기에 참 어려운데 암튼 모든 데이터가 통일성 있게 존재하지 않는다는 것.
페이지 수가 없는 도서들이 많다는 것.
국립중앙도서관임에도 ISBN으로 검색되지 않는 책들이 꽤 있다는 것.
등이다.
32개 필드 중 도서 관리에 필요한 항목으로 정확하게 데이터가 있는 필드가 사실 얼마 없다는 것을 알게 되었다.
이런거 왜 정비를 안 하는 것인지...
국립중앙도서관 OpenAPI버전으로 만들면서 버튼을 한 개 더 만들었다.
현재 위치의 ISBN만 검색해서 데이터를 가져오는 것.
이번 글을 포스팅하면서 VBA 스크립트를 수정할 것이 생겼다.
. ISBN이 중복되는 경우 팝업을 띄워 어느 도서인지 선택하도록 해야 함. 이것은 이전에도 적었었는데 아직도 해결하지 못했음.
. '채우기-전체' 버튼을 누를때 프롬프트를 띄워 '진짜 전체를 검색할 것인지 ' 물어보도록 해야겠다. 오래 걸리기 때문
. 버튼을 누를때 Cell의 색상이 회색인 경우에는 다르게 작동하도록 해야겠다.
이유는 ISBN으로 검색했는데 정보가 없을 경우는 내가 인터넷으로 찾아서 직접 넣어야 하는 경우임.
이 상태에서 다시 버튼을 누르게 되면 내가 수작업으로 넣은 데이터가 사라지게 됨.(가져온 데이터도 없을 테니...)
아래는 국립중앙도서관 OpenAPI의 32개 항목이며 데이터를 받아서 확인해 보고 나에게 필요한 값만 엑셀에 넣고 나머지는 넣지 않았다.
' NO 필드 -- 값 설명
' 1 : PAGE_NO ---------------- String 현재 쪽번호 ==> 값 없음
' 2 : TOTAL_COUNT ------------ String 전체 출력수 ==> 값 없음
' 3 : TITLE ------------------ String 표제
' 4 : VOL -------------------- String 권차
' 5 : SERIES_TITLE ----------- String 총서명
' 6 : SERIES_NO -------------- String 총서편차
' 7 : AUTHOR ----------------- String 저자
' 8 : EA_ISBN ---------------- String ISBN ==> 불필요
' 9 : EA_ADD_CODE ------------ String ISBN 부가기호 ==> 불필요
' 10 : SET_ISBN --------------- String 세트 ISBN ==> 불필요
' 11 : SET_ADD_CODE ----------- String 세트 ISBN 부가기호 ==> 불필요
' 12 : SET_EXPRESSION --------- String 세트표현 (세트, 전2권.) ==> 불필요
' 13 : PUBLISHER -------------- String 발행처
' 14 : EDITION_STMT ----------- String 판사항
' 15 : PRE_PRICE -------------- String 예정가격
' 16 : KDC -------------------- String 한국십진분류 (2020년 12월 31일 이후 데이터 제공불가)
' 17 : DDC -------------------- String 듀이십진분류
' 18 : PAGE ------------------- String 페이지
' 19 : BOOK_SIZE -------------- String 책크기
' 20 : FORM ------------------- String 발행제본형태
' 21 : PUBLISH_PREDATE -------- String 출판예정일
' 22 : SUBJECT ---------------- String 주제 (KDC 대분류)
' 23 : EBOOK_YN --------------- String 전자책여부 (Y: 전자책, N : 인쇄책)
' 24 : CIP_YN ----------------- String CIP 신청여부 (Y: CIP신청, N: CIP신청안함) ==> 불필요
' 25 : CONTROL_NO ------------- String CIP 제어번호 ==> 불필요
' 26 : TITLE_URL -------------- String 표지이미지 URL ==> 불필요
' 27 : BOOK_TB_CNT_URL -------- String 목차 ==> 불필요
' 28 : BOOK_INTRODUCTION_URL -- String 책소개 ==> 불필요
' 29 : BOOK_SUMMARY_URL ------- String 책요약 ==> 불필요
' 30 : PUBLISHER_URL ---------- String 출판사 홈페이지 URL ==> 불필요
' 31 : INPUT_DATE ------------- String 등록날짜 ==> 불필요
' 32 : UPDATE_DATE ------------ String 수정날짜 ==> 불필요
주요 VBScript는 아래와 같다.
Sub Call_OpenAPI_NL(RowNum As Integer)
Dim OHTTP As WinHttpRequest
Dim s_URL, C_Key, s_URL2, ISBN As String
Dim O_XML As DOMDocument60
Dim NodeList As IXMLDOMNodeList
Dim NodeCell As IXMLDOMNode
Dim NodeChild As IXMLDOMNode
Dim i As Integer
s_URL = "http://seoji.nl.go.kr/landingPage/SearchApi.do?cert_key="
s_URL2 = "&result_style=xml&page_no=1&page_size=10&isbn="
' C_Key = Range("B1").Value2
' 여기에 본인이 발급받은 Key값을 넣으면 됨.
C_Key = "< 발급받은 Key >"
i = RowNum
Set OHTTP = New WinHttpRequest
Do While Range("A" & i).Value <> ""
ISBN = Range("A" & i).Value
OHTTP.Open "Get", s_URL & C_Key & s_URL2 & ISBN
OHTTP.Send
' Debug.Print OHTTP.ResponseText
If OHTTP.Status = 200 Then
Set O_XML = New DOMDocument60
O_XML.LoadXML (OHTTP.ResponseText)
Set NodeList = O_XML.SelectNodes("o/docs/e")
Range("A" & i).Interior.ColorIndex = 6
' NO 필드 -- 값 설명
' 1 : PAGE_NO ---------------- String 현재 쪽번호 ==> 값 없음
' 2 : TOTAL_COUNT ------------ String 전체 출력수 ==> 값 없음
' 3 : TITLE ------------------ String 표제
' 4 : VOL -------------------- String 권차
' 5 : SERIES_TITLE ----------- String 총서명
' 6 : SERIES_NO -------------- String 총서편차
' 7 : AUTHOR ----------------- String 저자
' 8 : EA_ISBN ---------------- String ISBN ==> 불필요
' 9 : EA_ADD_CODE ------------ String ISBN 부가기호 ==> 불필요
' 10 : SET_ISBN --------------- String 세트 ISBN ==> 불필요
' 11 : SET_ADD_CODE ----------- String 세트 ISBN 부가기호 ==> 불필요
' 12 : SET_EXPRESSION --------- String 세트표현 (세트, 전2권.) ==> 불필요
' 13 : PUBLISHER -------------- String 발행처
' 14 : EDITION_STMT ----------- String 판사항
' 15 : PRE_PRICE -------------- String 예정가격
' 16 : KDC -------------------- String 한국십진분류 (2020년 12월 31일 이후 데이터 제공불가)
' 17 : DDC -------------------- String 듀이십진분류
' 18 : PAGE ------------------- String 페이지
' 19 : BOOK_SIZE -------------- String 책크기
' 20 : FORM ------------------- String 발행제본형태
' 21 : PUBLISH_PREDATE -------- String 출판예정일
' 22 : SUBJECT ---------------- String 주제 (KDC 대분류)
' 23 : EBOOK_YN --------------- String 전자책여부 (Y: 전자책, N : 인쇄책)
' 24 : CIP_YN ----------------- String CIP 신청여부 (Y: CIP신청, N: CIP신청안함) ==> 불필요
' 25 : CONTROL_NO ------------- String CIP 제어번호 ==> 불필요
' 26 : TITLE_URL -------------- String 표지이미지 URL ==> 불필요
' 27 : BOOK_TB_CNT_URL -------- String 목차 ==> 불필요
' 28 : BOOK_INTRODUCTION_URL -- String 책소개 ==> 불필요
' 29 : BOOK_SUMMARY_URL ------- String 책요약 ==> 불필요
' 30 : PUBLISHER_URL ---------- String 출판사 홈페이지 URL ==> 불필요
' 31 : INPUT_DATE ------------- String 등록날짜 ==> 불필요
' 32 : UPDATE_DATE ------------ String 수정날짜 ==> 불필요
For Each NodeCell In NodeList
For Each NodeChild In NodeCell.ChildNodes
'If NodeChild.nodeName = "PAGE_NO" Then ' 불필요
' Range("B" & i).Value2 = NodeChild.Text ' 불필요
'ElseIf NodeChild.nodeName = "TOTAL_COUNT" Then ' 불필요
' Range("C" & i).Value2 = NodeChild.Text ' 불필요
If NodeChild.nodeName = "TITLE" Then
Range("B" & i).Value2 = NodeChild.Text
ElseIf NodeChild.nodeName = "VOL" Then
Range("C" & i).Value2 = NodeChild.Text
ElseIf NodeChild.nodeName = "SERIES_TITLE" Then
Range("D" & i).Value2 = NodeChild.Text
ElseIf NodeChild.nodeName = "SERIES_NO" Then
Range("E" & i).Value2 = NodeChild.Text
ElseIf NodeChild.nodeName = "AUTHOR" Then
Range("F" & i).Value2 = NodeChild.Text
'ElseIf NodeChild.nodeName = "EA_ISBN" Then ' 불필요
' Range("I" & i).Value2 = NodeChild.Text ' 불필요
'ElseIf NodeChild.nodeName = "EA_ADD_CODE" Then ' 불필요
' Range("J" & i).Value2 = NodeChild.Text ' 불필요
'ElseIf NodeChild.nodeName = "SET_ISBN" Then ' 불필요
' Range("K" & i).Value2 = NodeChild.Text ' 불필요
'ElseIf NodeChild.nodeName = "SET_ADD_CODE" Then ' 불필요
' Range("L" & i).Value2 = NodeChild.Text ' 불필요
'ElseIf NodeChild.nodeName = "SET_EXPRESSION" Then ' 불필요
' Range("M" & i).Value2 = NodeChild.Text ' 불필요
ElseIf NodeChild.nodeName = "PUBLISHER" Then
Range("G" & i).Value2 = NodeChild.Text
ElseIf NodeChild.nodeName = "EDITION_STMT" Then
Range("H" & i).Value2 = NodeChild.Text
ElseIf NodeChild.nodeName = "PRE_PRICE" Then
Range("I" & i).Value2 = NodeChild.Text
ElseIf NodeChild.nodeName = "KDC" Then
Range("J" & i).Value2 = NodeChild.Text
ElseIf NodeChild.nodeName = "DDC" Then
Range("K" & i).Value2 = NodeChild.Text
ElseIf NodeChild.nodeName = "PAGE" Then
Range("L" & i).Value2 = NodeChild.Text
ElseIf NodeChild.nodeName = "BOOK_SIZE" Then
Range("M" & i).Value2 = NodeChild.Text
ElseIf NodeChild.nodeName = "FORM" Then
Range("N" & i).Value2 = NodeChild.Text
ElseIf NodeChild.nodeName = "PUBLISH_PREDATE" Then
Range("O" & i).Value2 = NodeChild.Text
ElseIf NodeChild.nodeName = "SUBJECT" Then
Range("P" & i).Value2 = NodeChild.Text
ElseIf NodeChild.nodeName = "EBOOK_YN" Then
Range("Q" & i).Value2 = NodeChild.Text
'ElseIf NodeChild.nodeName = "CIP_YN" Then ' 불필요
' Range("Y" & i).Value2 = NodeChild.Text ' 불필요
'ElseIf NodeChild.nodeName = "CONTROL_NO" Then ' 불필요
' Range("Z" & i).Value2 = NodeChild.Text ' 불필요
'ElseIf NodeChild.nodeName = "TITLE_URL" Then ' 불필요
' Range("AA" & i).Value2 = NodeChild.Text ' 불필요
'ElseIf NodeChild.nodeName = "BOOK_TB_CNT_URL" Then ' 불필요
' Range("AB" & i).Value2 = NodeChild.Text ' 불필요
'ElseIf NodeChild.nodeName = "BOOK_INTRODUCTION_URL" Then ' 불필요
' Range("AC" & i).Value2 = NodeChild.Text ' 불필요
'ElseIf NodeChild.nodeName = "BOOK_SUMMARY_URL" Then ' 불필요
' Range("AD" & i).Value2 = NodeChild.Text ' 불필요
'ElseIf NodeChild.nodeName = "PUBLISHER_URL" Then ' 불필요
' Range("AE" & i).Value2 = NodeChild.Text ' 불필요
'ElseIf NodeChild.nodeName = "INPUT_DATE" Then ' 불필요
' Range("AF" & i).Value2 = NodeChild.Text ' 불필요
'ElseIf NodeChild.nodeName = "UPDATE_DATE" Then ' 불필요
' Range("AG" & i).Value2 = NodeChild.Text ' 불필요
End If
Next NodeChild
Next NodeCell
Else
Range("A" & i).Interior.ColorIndex = 48
End If
i = i + 1
Loop
End Sub
무조건 따라 하기보다 우선 제공하는 사이트의 정보를 숙지할 필요가 있으니 국립중앙도서관 OpenAPI 페이지를 먼저 방문해서 알아보는 게 좋겠다.
국립중앙도서관 OpenAPI 활용방법 안내 페이지
국립중앙도서관
국립중앙도서관에 오신 것을 환영합니다
www.nl.go.kr
아래는 약 300여 개의 도서 정보와 VBA 스크립트를 담고 있는 엑셀파일이다.
허접한 스크립트이지만 어떤 분에게는 조금이나마 도움이 되길.
'IT' 카테고리의 다른 글
SecureCRT auto login VBScript for multiple servers(여러대 자동 로그인) (0) | 2025.03.15 |
---|---|
운영DBA가 보는 지연된 블록 클린아웃(Delayed Block Cleanout) (0) | 2024.08.05 |
구글 플레이게임 나이 제한 지났다. 13세 또는 14세 ?? (2) | 2022.11.20 |
DBA(Database Administrator)를 잘하려면. 운영DBA의 조언 (0) | 2022.05.30 |
Oracle Dev Gym 소개 (0) | 2022.05.14 |