엑셀 VBA를 이용하여 네이버의 이미지 탭에 있는 이미지 주소를 크롤링하고 다운로드 받는 방법을 알아보겠습니다. 오늘 포스팅을 통해 크롬 개발자 도구를 활용하여 이미지 URL을 확인하는 방법과 이미지 다운로더를 만드는 방법을 확인할 수 있습니다.
1. 엑셀 VBA를 이용한 네이버 이미지 다운로더 만들기
요즘 일상이나 업무에서 흔하게 다룰 수 있는 엑셀을 이용하여 크롤링하는 방법에 대해 계속 포스팅하고 있는데요. 오늘은 네이버 검색에서 이미지 탭에 있는 그림 파일의 URL을 확인하고 다운받는 방법에 대해서 살펴보겠습니다. 이미지 크롤링 및 다운로더 만드는 과정은 아래와 같이 6단계로 나누어 진행하겠습니다.
① 네이버 이미지 URL 확인
② URL 요청 및 응답
③ 응답을 json으로 변환
④ json파일에서 이미지 URL 추출
⑤ 이미지 다운로드
⑥ 추가사항
1) 네이버 이미지 URL 확인 – 개발자 도구
▼ 네이버를 접속하여 원하는 키워드로 검색하고 이미지 탭으로 이동합니다. 예시에서는 “제주도”라는 키워드로 검색을 진행하겠습니다. F12를 눌러 개발자 도구를 실행하고 Network 탭으로 이동합니다. Ctrl + L을 눌러 네트워크의 모든 내용을 지웁니다. 새로 고침(F5)을 한 후에 아래 항목들을 살펴봅니다. 우선 가장 먼저 로드된 “search.naver?……..” 항목을 선택하고 preview 탭을 누르면 이미지는 없고 텍스트만 확인할 수 있는데요.
▼ 현재 로드된 Network 정보로는 확인이 어려워 보입니다. 스크롤을 아래로 이동하다 보면 네트워크 정보가 추가되는 것을 확인할 수 있는데요. 맨 처음에 로드되었던 “search.naver?……..”로 시작하는 항목이 추가되는 것을 확인할 수 있습니다.
▼ 이 항목을 선택하고 Preview 탭을 클릭하면 아래와 같이 json 구조의 키와 값들을 확인할 수 있는데요. 해당 items를 클릭해보면 0~99까지 100개의 항목으로 구성된 json 파일을 확인할 수 있습니다. item 에서 번호를 선택하고 확장자가 jpg인 값을 찾다보면 originalUrl이라는 키를 확인할 수 있는데요. 해당 주소를 복사해서 웹 주소창에 붙여 넣으면 이미지가 뜨는 것을 확인할 수 있습니다. 이제 Headers 탭으로 이동하여 Request URL을 이용하여 이미지 주소를 크롤링해보겠습니다.
2) URL 요청 및 응답
▼ URL을 알아냈으니 VBA에서 winhttp를 이용하여 요청하고 응답을 받아보겠습니다. VBA 파일 안에서 작동하도록 펑션을 아래와 같이 추가했습니다. 작성된 url을 요청하고 응답을 받는 과정입니다.
' URL을 요청하고 응답을 반환하는 함수
Function request(url As String) As String
Dim winhttp As Object
Set winhttp = CreateObject("WinHttp.WinHttpRequest.5.1")
winhttp.Open "GET", url, False
winhttp.Send
request = winhttp.ResponseText
End Function
3) 응답을 json으로 변환하기
▼ 요청을 통해 받은 응답은 복잡한 구조의 데이터 인데요. 키와 값으로 호출이 가능한 json 구조로 변환하면 원하는 정보를 쉽게 크롤링할 수 있습니다. 해당 기능을 사용하려면 json 모듈이 필요한데요. 다운받지 않고 사용할 수 있도록 포스팅 하단에 첨부했습니다. 직접 다운로드 받으시려면 아래 링크로 이동하시기 바랍니다.
' 응답을 JSON으로 변환
Dim Json As Object
Set Json = JsonConverter.ParseJson(응답)
4) json파일에서 이미지 URL 추출
▼ 변환한 json 파일에서 이미지의 주소를 추출하는 과정입니다. items에서 j번째 originalUrl의 값을 호출하여 해당 이미지의 주소를 크롤링할 수 있습니다.
' JSON에서 "items"(j)("originalUrl")을 추출
Dim 이미지주소 As String
이미지주소 = Json("items")(j)("originalUrl")
5) 이미지 다운로드
▼ 이 코드에서 objStream 객체는 이미지를 다운로드한 후, 이진 데이터(이미지 파일)를 메모리에 읽어 들여 파일 시스템에 저장하는 데 사용됩니다.
- objStream.Open: 스트림을 열어 데이터를 받을 준비를 합니다.
- objStream.Type = 1: 이진 데이터를 처리하도록 설정합니다.
- objStream.Write: 응답 받은 데이터를 스트림에 씁니다.
- objStream.SaveToFile: 스트림에 저장된 데이터를 지정된 경로에 파일로 저장합니다.
' 파일을 다운로드하여 지정된 경로에 저장하는 함수
Function downloadFile(url As String, localPath As String) As String
On Error GoTo goErr
Dim winhttp As Object
Dim objStream As Object
Set winhttp = CreateObject("WinHttp.WinHttpRequest.5.1")
winhttp.Open "GET", url, False
winhttp.Send
Set objStream = CreateObject("ADODB.Stream")
objStream.Open
objStream.Type = 1 ' 이진 데이터 설정
objStream.Write winhttp.ResponseBody
objStream.SaveToFile localPath, 2 ' 파일 저장, 덮어쓰기 옵션
objStream.Close
downloadFile = "Success"
Exit Function
goErr:
downloadFile = "Error: " & Err.Description
End Function
6) 추가사항
사용자의 편의를 위해 이미지 다운로드 수량, 키워드, 파일 저장 위치를 추가하여 VBA 코드를 구성하였습니다. URL에는 특정한 규칙 및 조건이 적용되어 있는데요. 이건 데이터 구조와 요청 방법, 정렬, 서명 등 다양한 조건이 있고 사이트마다 다르게 적용되는 부분입니다. 네이버 이미지 탭 url에는 키워드, 요청수량, 시작번호, 정렬방법 등이 포함되어 있고, 이를 편리하게 사용하기 위해 키워드, 요청수량을 변수로 설정하여 코드를 추가했습니다.
2. 실행
이미지 다운로더.xlsm파일을 다운로드합니다.
아래 그림과 같이 B2, B3, B4에 내용을 입력하고 “실행”버튼을 누릅니다.
파일 저장 위치로 이동하여 해당 이미지 파일을 확인합니다. 요청을 만일 50개를 하더라도, 가끔 주소가 비어있어 실제 다운로드한 수량이 다를 수 있습니다.