관련: 지식인

 

아직 작동하는 HTML 요소를 이용하는 방식의 VBA입니다.

https://kin.naver.com/qna/detail.naver?d1id=1&dirId=102020101&docId=436801616

 

아래는 좀 더 빠른 속도를 위해 JSON 데이터를 검색하는 방식입니다.

교보문고에서 검색할 때 판매중인 자료는 실시간으로 간단한 데이터들을 Json형식으로 가져옵니다.

이 API를 이용해서 Json 형식으로 빠르게 도서 정보를 가져오는 방법입니다.

 

https://search.kyobobook.co.kr/srp/api/v1/search/autocomplete/shop?callback=autocompleteShop&keyword=9788954442688

이런 식으로 검색하면 아래와 같은 JSON 데이터를 받아옵니다.

더보기
autocompleteShop({
    "data": {
        "returnCode": 1,
        "totalSize": 1,
        "realSize": 1,
        "errorMessage": null,
        "resultDocuments": [{
            "CMDTCODE": "9791190090018",
            "CMDT_NAME": "우리가 빛의 속도로 갈 수 없다면",
            "SALE_CMDTID": "S000001935245",
            "SALE_CMDT_DVSN_CODE_SUB": "KOR",
            "SCORE": "100856",
            "RELATE_HTML_LIST": "",
            "SALE_CMDT_GRP_DVSN_CODE": "SGK",
            "DQ_ID": "TOT_S000001935245",
            "SALE_CMDT_DVSN_CODE": "TOT",
            "TOT_RELATE_HTML_LIST": "9791190090018$@소설$@우리가 빛의 속도로 갈 수 없다면$@김초엽$@허블$@2019$@06$@14000.00$@12600.00$@10.00$@700$@N$@N$@KOR$@https://contents.kyobobook.co.kr/sih/fit-in/200x0/pdt/9791190090018.jpg$@0$@0$@0$@0$@0$@5.00$@바이오센서를 만드는 과학도에서 이제는 소설을 쓰는 작가 김초엽. 어디에도 없는 그러나 어딘가에 있을 것 같은 상상의 세계를 특유의 분위기로 손에 잡힐 듯 그려내며, 정상과 비정상, 성공과 실패, 주류와 비주류의 경계를 끊임없이 질문해온 그의 첫 소설집 『우리가 빛의 속도로 갈 수 없다면』.\n\n《관내분실》로 2017년 제2회 한국과학문학상 중단편부문 대상을, 《우리가 빛의 속도로 갈 수 없다면》으로 가작을 동시에 받으며 작품 활동을 시작한 저자의 이야기를 만나볼 수 있다. 신인소설가로서는 드물게 등단 일 년여 만에 《현대문학》, 《문학3》, 《에피》 등 여러 지면을 통해 발표한 작품으로 펴낸 첫 소설집으로, 근사한 세계를 그려내는 상상력에서 한 발 더 나아가, 우리를 돌아보게 하는 질문을 던지는 일곱 편의 작품이 수록되었다.$@$@0$@0$@0$@010107"
        }]
    },
    "resultCode": "200",
    "resultMessage": "Search Success",
    "detailMessage": "자동완성 상품 검색 결과를 가져왔습니다."
});

 

autoCompleteShop( 다음에 오는 내용이 Json 형식의 데이터입니다.

위 JSON 형식의 데이터안의 TOT_RELATE_HTML_LIST 데이타 문자열을 파싱하면

제목, 가격, 저자, 출판사, 표지이미지, 소개 등 대부분의 정보를 빠르게 가져올 수 있습니다.

단점은 절판된 자료는 검색이 되지 않습니다.

 

아래 코드는 JsonBag 클래스 2.6버전을 이용합니다.

더보기
'Alt-F11 도구-참조에서  MS XML x.0 Object Library 체크

Option Explicit

Const ImgOn As Boolean = False

Sub getKyobobook_JSON()
    
    Dim lastRow As Range
    Dim sht As Worksheet
    Dim rng As Range
    Dim URL As String
    Const KYOBOsearch As String = "https://search.kyobobook.co.kr/srp/api/v1/search/autocomplete/shop?callback=autocompleteShop&keyword="
    Const KYOBO As String = "http://mobile.kyobobook.co.kr/showcase/book/"
    Dim temp As String
    Dim http As Object  'MSXML2.ServerXMLHTTP or MSXML2.ServerXMLHTTP60
    Dim JSON As New JsonBag
    Dim arr() As String
    Dim ImgFile As String, ImgPath As String, ImgDir As String, shp As Shape
    Dim l As Long
    
    'Set http = New MSXML2.ServerXMLHTTP 'or MSXML2.ServerXMLHTTP60
    Set http = CreateObject("MSXML2.ServerXMLHTTP")
    Set sht = ThisWorkbook.ActiveSheet
    
    Set lastRow = Cells(sht.Rows.Count, "B").End(xlUp)
    If lastRow.Row < 4 Then Exit Sub
    
    '기존 내용 삭제
    sht.Hyperlinks.Delete
    sht.Range("C4:Z" & lastRow.Row).ClearContents
    If Not ImgOn Then
        For l = sht.Shapes.Count To 1 Step -1
            If sht.Shapes(l).Name Like "Img_*" Then
                sht.Shapes(l).Delete
            End If
        Next l
    End If
    
    On Error Resume Next ' 에러무시
    
    'ISBN 순환 검색
    For Each rng In sht.Range("B4", lastRow)
        
         '검색
         With http
            .Open "GET", KYOBOsearch & rng, False
            .setRequestHeader "User-Agent", "Mobile"
            '.setRequestHeader "Content-Type", "Application / javascript"
            .send
            temp = .responseText
            temp = Mid(temp, InStr(temp, "{"))
            temp = Left(temp, InStrRev(temp, "}"))
            JSON.JSON = temp
'autocompleteShop({
'    "data": {
'        "returnCode": 1,
'        "errorMessage": null,
'        "resultDocuments": [{
'            "CMDTCODE": "9791190090018",
'            "CMDT_NAME": "우리가 빛의 속도로 갈 수 없다면",
'            "SALE_CMDTID": "S000001935245",
'            "TOT_RELATE_HTML_LIST": "9791190090018$@소설$@우리가 빛의 속도로 갈 수 없다면$@김초엽$@허블$@2019$@06$@14000.00$@12600.00$@10.00$@700$@N$@N$@KOR$@https://contents.kyobobook.co.kr/sih/fit-in/200x0/pdt/9791190090018.jpg$@0$@0$@0$@0$@0$@5.00$@바이오센서를 만드는 과학도에서 이제는 소설을 쓰는 작가 김초엽. 어디에도 없는 그러나 어딘가에 있을 것 같은 상상의 세계를 특유의 분위기로 손에 잡힐 듯 그려내며, 정상과 비정상, 성공과 실패, 주류와 비주류의 경계를 끊임없이 질문해온 그의 첫 소설집 『우리가 빛의 속도로 갈 수 없다면』.\n\n《관내분실》로 2017년 제2회 한국과학문학상 중단편부문 대상을, 《우리가 빛의 속도로 갈 수 없다면》으로 가작을 동시에 받으며 작품 활동을 시작한 저자의 이야기를 만나볼 수 있다. 신인소설가로서는 드물게 등단 일 년여 만에 《현대문학》, 《문학3》, 《에피》 등 여러 지면을 통해 발표한 작품으로 펴낸 첫 소설집으로, 근사한 세계를 그려내는 상상력에서 한 발 더 나아가, 우리를 돌아보게 하는 질문을 던지는 일곱 편의 작품이 수록되었다.$@$@0$@0$@0$@010107"
'        }]
'    },
'    "resultCode": "200",
'    "resultMessage": "Search Success",
'});
            
            '첫번째 데이터
            JSON.JSON = JSON("data")("resultDocuments")(1).JSON
            'Debug.Print JSON.JSON

            
        End With
 
 '9791190090018$@
 '소설$@
 '우리가 빛의 속도로 갈 수 없다면$@
 '김초엽$@
 '허블$@
 '2019$@
 '06$@
 '14000.00$@
 '12600.00$@
 '10.00$@
 '700$@
 'N$@
 'N$@
 'KOR$@
 'https://contents.kyobobook.co.kr/sih/fit-in/200x0/pdt/9791190090018.jpg$@
 '0$@
 '0$@
 '0$@
 '0$@
 '0$@
 '5.00$@
 '바이오센서를 만드는 과학도에서 이제는 소설을 쓰는 작가 김초엽. 어디에도 없는 그러나 어딘가에 있을 것 같은 상상의 세계를 특유의 분위기로 손에 잡힐 듯 그려내며, 정상과 비정상, 성공과 실패, 주류와 비주류의 경계를 끊임없이 질문해온 그의 첫 소설집 『우리가 빛의 속도로 갈 수 없다면』.\n\n《관내분실》로 2017년 제2회 한국과학문학상 중단편부문 대상을, 《우리가 빛의 속도로 갈 수 없다면》으로 가작을 동시에 받으며 작품 활동을 시작한 저자의 이야기를 만나볼 수 있다. 신인소설가로서는 드물게 등단 일 년여 만에 《현대문학》, 《문학3》, 《에피》 등 여러 지면을 통해 발표한 작품으로 펴낸 첫 소설집으로, 근사한 세계를 그려내는 상상력에서 한 발 더 나아가, 우리를 돌아보게 하는 질문을 던지는 일곱 편의 작품이 수록되었다.$@
 '$@
 '0$@
 '0$@
 '0$@
 '010107
            
            If ImgOn Then rng.RowHeight = 100 Else rng.RowHeight = 18    '행 높이
            rng.Offset(, -1) = rng.Row - 3 ' 연번
            '제목
            rng.Offset(, 1) = JSON("CMDT_NAME")      'arr(2)
            If Len(rng.Offset(, 1)) = 0 Then
                rng.Offset(, 1) = "[n/a]"
            Else
             
                sht.Hyperlinks.Add rng.Offset(, 1), KYOBO & JSON("SALE_CMDTID")
                
                'Debug.Print JSON("TOT_RELATE_HTML_LIST")
                '요약 문자열 분리
                arr() = Split(JSON("TOT_RELATE_HTML_LIST"), "$@")
                
                '작가
                rng.Offset(, 2) = arr(3)
                '출판사
                rng.Offset(, 3) = arr(4)
                '가격
                rng.Offset(, 4) = arr(8)
                rng.Offset(, 4).NumberFormat = "###,###,##0"
                'intro_summary
                rng.Offset(, 5) = arr(21)
                '표지
                rng.Offset(, 6) = arr(14)
                 
                ImgFile = "": ImgDir = "\Img"
                ImgFile = arr(14)
                If ImgOn And Len(ImgFile) Then
                    ImgPath = ThisWorkbook.Path & ImgDir
                    If Dir(ImgPath, vbDirectory) <> Mid(ImgDir, 2) Then MkDir ImgPath
                    ImgPath = ImgPath & Application.PathSeparator & rng & ".jpg"
                    Call URLDownloadToFile(0, ImgFile, ImgPath, 0, 0)
                    
                    With rng.Offset(, 6)
                        Set shp = sht.Shapes.AddPicture(ImgPath, 0, 1, .Left, .Top, .Width / 2, .Height)
                        shp.ScaleHeight 1, msoTrue: shp.ScaleWidth 1, msoTrue
                        shp.LockAspectRatio = msoTrue
                        shp.Height = rng.Height
                        shp.Left = .Left + (.Width / 2 - shp.Width / 2)
                        shp.Name = "Img_" & rng.Row - 3 & "_" & rng
                        shp.AlternativeText = ImgFile
                    End With
                End If
            End If
            
            '대기
            If (rng.Row - 3) Mod 5 = 0 Then Application.Wait Now() + TimeSerial(0, 0, 1)
            
    Next rng
    
    Application.StatusBar = False
    Set JSON = Nothing
    Set http = Nothing
End Sub

 

ImgOn이 False 일때:

ImgOn이 True 일때:

첨부파일 참고하세요.

 

ISBN교보Json1.xlsm
0.10MB

 

주의) 교보문고 사이트가 변경되면 위 코드는 언제든지 작동을 하지 않게 됩니다.

위 코드의 지속적인 작동을 보장하지 않고 업데이트 계획도 없습니다.

인터넷 사이트에서 Json 자료를 가져오는 방법에 대한 예시일 뿐입니다.