본문 바로가기
VBA

[VBA] 네이버 이미지에서 원하는 이미지 다운받기

by 일등미노왕국 2022. 6. 10.

이미지 크롤링에 대해서 이야기 해보려고 한다.

기존에 해왔던 방식은 주소를 타고 들어가면 우리가 원하는 자료들이 있고, 그것을 크롤링하는 방식이었다고 하면

비동기 방식은  메인주소를 들어갔을 때 페이지가 변하거나 값이 변할 때 하나의 자바스크립트 틀안에 새로운 값들을 채우는 방식이다. 더 간단히 말하면 모니터로 표현을 하였을 때 동기방식은 모니터상에 보이는 부분과 보이지 않는 부분들을 같이 Call하여 앵글의 변화에 따라 모니터상에 보이는 값이 달리 보이게 하는 방식이라고 하면 비동기 방식은 모니터 화면이라는 큰 틀에 스크롤의 위치가 변화면 마치 앵글이 변화된것처럼 그때 데이터를 Call하는 방식이다. 동기방식은 처음 페이지를 오픈할때 딜레이가 걸리지만 페이지 변화에는 유기적이라면 비동기 방식은 오픈페이지에는 빠르지만 새롭게 쿼리를 요청할때는 딜레이가 발생할 수 있다.

여튼 오늘 할 네이버 이미지 탭에서 원하는 이미지를 다운하는 방식인 비동기 방식의 크롤링이다.

https://www.youtube.com/watch?v=Fs1o3jaozdo&t=1282s 

윤자동 채널로 활동하시는 다잡님의 코드를 통해서 만든 코드이다. 영상에서는 비동기 방식을 Json컨버터로 파싱을 하셨는데 본인은 정규식으로 파싱을 하였다. 근데 앞으로는 정규식 파싱은 간단한 내용이 아니면 쓰지 않을것 같다..Json방식이 훨씬 편하고 깔끔하기 때문이다.

코드 진행은 이렇다.

Url만 알면 그것을 다운받는 방법에 대해서는 전 시간에 한적이 있다.

그럼 Url만 알면된다.

다잡님 영상에 개발자코드에서 분석하는 방법이 나와있기에 더 깊은 이야기는 하지 않겠다.

본인 코드는 OriginUrl의 링크주소를 정규식으로 파싱한 후  다운로드 하는것 까지만 보면 될듯 하다.

더보기
Option Explicit
Sub Haja_img()
    
    Dim strUrl$                                                 '= 네이버 이미지 주소
    Dim strKword$, strRequest$                                  '= 키워드와 리퀘스트 결과변수
    Dim List                                                    '= 이미지 주소를 담을 변수
    Dim imgFolder$: imgFolder = "c:\이미지다운"                 '= 이미지를 담을 폴더 변수
    Dim RegObj As Object                                        '= 정규식
    Dim Mat As Object                                           '= 정규식의 일치값
    Dim i&, N&, Cnt&                                            '= 순환변수
    
        If [d3] > 1000 Then Exit Sub                            '= 한번에 이미지 다운 가능수량을 1000개 이하로 해라
        strKword = [b3]                                         '= 키워드는 [b3]에서 가져와라
        
        Do Until N >= [d3] / 50                                 '= 50개 단위로 ....
        N = N + 1                                               '= 1 [1부터 50] 2 [51부터 100]
        strUrl = "https://s.search.naver.com/p/c/image/search.naver?where=m_image&mode=imgonly&rev=44&section=image&query=" & strKword & _
                 "&ac=0&aq=0&spq=1&nx_search_query=" & strKword & _
                 "&json_type=8&optStr=&ccl=0&x_image=&display=" & _
                  "50&abt=&pq=&start=" & N
                 
        strRequest = Fn.Request(strUrl)                         '= 주소를 파싱해서 strRequest에 담아라
                 
            Set RegObj = Fn.Reg                                 '= 정규식 선언
            With RegObj
                .Pattern = """originalUrl""" & " : " & "(.+?)," '= 정규식 패턴
                .Global = True
            End With
   
            If RegObj.test(strRequest) = False Then Exit Do     '= 정규식 패턴이 일치하지 않으면 종료해사
                
               Set Mat = RegObj.Execute(strRequest)             '= 정규식 패턴의 일치값을 Mat에 담아라
               ReDim List(Mat.Count - 1)                        '= 정규식 패턴의 일치값으로 List배열의 크기를 설정해라
               For i = 0 To Mat.Count - 1                       '= 정규식 패턴의 일치값을 순환해라
                    Cnt = Cnt + 1                               '= 순환하기 위래 cnt를 +1 해라
                    List(i) = Mat.Item(i).submatches(0)         '= orginalurl에 링크주소 영역을 List에 담아라.
                   
                    List(i) = Fn.DECODEURL(List(i))             '= 담긴 주소를 디코딩해라
                    List(i) = Replace(List(i), """", "")        '= 디코딩 된 주소의 양끝에 있는 쌍따옴표를 지워라
                    If Len(Dir(imgFolder & "\", vbDirectory)) = 0 Then MkDir imgFolder  '= 폴더가 없다면 생성해라
                    Fn.downloadFile List(i), imgFolder & "\" & Cnt & ".jpg"             '= 링크 주소를 가지고 사진을 다운로드 하여 폴더에 다운해라
                Next i
        
        Loop
    
End Sub

다잡님의 코드를 참고하여 본인도 사용자함수부분은 모듈속에 Fn으로 담아서 코드를 공개하려고 한다.

그래야 공부하기에 혼란이 덜 할듯 하다.

이미지 크롤링(22.06.10).xlsm
0.02MB

댓글