<엑셀VBA 입문 10강> VBA로 웹파싱하기 (HTML소스 가져오기)

<엑셀VBA 입문 10강> VBA로 웹파싱하기 (HTML소스 가져오기)

오늘은 간단하게 VBA로 웹파싱하는 방법을 배워본다. 웹파싱이란 웹사이트의 HTML소스를 가져와서 분석하는 것을 말한다. 파싱(Parsing)은 구문 분석이라는 뜻을 갖고 있다.

파싱해볼 대상은 구글이다. 구글 주소는 http가 아닌 https로 시작한다. 검색결과를 얻고 싶으면 구글 주소 뒤에 “search?q=검색어”를 붙이면 된다.

예를 들어 구글에 VBA를 검색하고 싶다면, https://google.com/search?q=VBA 라는 주소로 접속하면 된다. 아래 화면과 같이 말이다.

 


[구글 주소 뒤에 “search?q=검색어”를 붙이면 곧바로 검색페이지에 도달할 수 있다]

화면에 표시한 부분인 “검색결과 약 00000 개” 라는 부분을 실시간으로 가져오고 싶다고 가정하자. 이렇게 웹사이트 소스의 일부를 가져오는 행위를 파싱이라고 한다.

일단 전체 소스가 어떻게 생겼는지 대강 살펴보자. 마우스 우클릭 – [소스 보기] 를 클릭하거나, 키보드 F12 키를 누르면 HTML 소스를 볼 수 있다.


[구글 페이지의 HTML 소스다. 구글이니까 이렇게 복잡하지 웹페이지에 따라 간단한 경우도 많다]

현재 보고 있는 이 소스가 구글의 HTML소스다. 구글이니까 엄청 복잡하지, 실전에서 분석하고자 하는 페이지는 간단할 수도 있다.

먼저 이 소스 전체를 가져오는 작업을 할 것이다. VBA에서는 아래와 같이 짧은 함수로 HTML 소스를 가져올 수 있다.

Function getHtml(url As String) As String
    Set httpObj = CreateObject(“MSXML2.XMLHTTP”)
    httpObj.Open “GET”, url, False
    httpObj.send
    getHtml = httpObj.responseText
End Function

실제로 이 함수를 만든 후 시트에서 =getHtml(“http://blog.naver.com/bb_“)라고 쓰면 본 블로그의 HTML 소스가 엑셀 시트 상에 삽입될 것이다.

[getHtml 함수는 단 4줄로 특정 웹페이지의 HTML 전체소스를 가져오는 강력한 함수다]

이렇게 전체 소스를 가져오는 것 자체는 그다지 의미가 없기 때문에Ctrl + k 단축키로 동작하는 매크로를 만들어보겠다. 매크로를 만드는 방법을 까먹었다고? 간단하게 설명하겠다.

* VBA (단축키로 실행되는) 매크로 함수 만드는 방법

엑셀 상단메뉴의 [보기] – [매크로] 단추 하단의 화살표 클릭하여 [매크로 기록] – Ctrl 다음 빈칸에 영문자 k 입력하고 [확인] – 곧바로, [매크로] 단추 하단의 화살표 클릭하여 [기록 중지] – Alt + F11 키 눌러서 VBA 윈도우 띄움 – VBA창 좌측 탐색기에서 Module1 더블클릭 – Sub 매크로1() 안에서 코딩 시작

매크로를 아래와 같이 작성한다.

Sub 매크로1()

‘ 매크로1 매크로

‘ 바로 가기 키: Ctrl+k

    Dim inputVal
    inputVal = InputBox(“검색할 단어를 입력해주세요.”)
   
    If Len(inputVal) < 1 Then
        MsgBox (“빈값입니다.”)
        Exit Sub
    End If
   
    ‘결과를 담을 변수
    Dim result
    result = “”
   
    ‘HTML 소스를 가져온다
    Dim html
    html = getHtml(“https://www.google.com/search?q=” & inputVal)
   
    Dim beginIdx
    Dim endIdx
    beginIdx = 0
    endIdx = 0
   
    ‘HTML에서 [검색결과]라는 단어를 찾는다.
    beginIdx = InStr(1, html, “검색결과”)
   
    ‘이어서 여는태그(<) 를 찾는다.
    If beginIdx > 0 Then
        endIdx = InStr(beginIdx + 1, html, “<“)
    Else
        MsgBox (“HTML에서 단어 [검색결과]를 찾을 수 없습니다.”)

        Exit Sub
    End If
   
    ‘여는태그(<)가 존재할 경우
    If endIdx > 0 Then
        result = Mid(html, beginIdx, endIdx – beginIdx)
    Else
        result = Mid(html, beginIdx)
    End If
   
    MsgBox (“[” & result & “]”)

End Sub

역시 문자열을 다루기 위해 InStr 함수와 Mid 함수를 활용하고 있다.

InStr 함수는 InStr(시작위치, 대상값, 검색값) 으로 사용한다.

Mid 함수는 Mid(자를텍스트, 시작위치, 최종길이)로 사용한다. (만약 마지막 3번째 인자값을  사용하지 않고 Mid(자를텍스트, 시작위치) 로 사용한다면, 시작위치부터 끝까지 자르게 된다.)

매크로의 내용을 간단히 요약하자면, 먼저 HTML 소스를 전부 가져온다. 그 후 “검색결과”라는 단어를 찾고, 이어서 HTML의 여는 태그를 뜻하는 “<” 기호를 찾는다. “검색결과” 단어부터 “<“기호 바로 앞까지가, 우리가 가져오고 싶은 부분이기 때문이다.

원하는 부분을 얻기 위해 HTML 소스코드의 어떤 부분을 잘라내야 하는지는, HTML 소스코드를 메모장에 갖다놓고 이리저리 살펴봐야 알 수 있다.

언제나 소스코드 전체를 이해하거나 파악할 수는 없다. 소스코드란 그저 텍스트일 뿐이니 자신감을 갖고, 원하는 부분을 찾아오는데 집중하면 된다. 

결과적으로 VBA 코드는 아래와 같이 동작할 것이다.

여기까지가 웹파싱의 기본이다.

실시간 웹파싱은 웹페이지의 내용(HTML 소스코드)가 변경될 경우 프로그램도 같이 수정해줘야 하는 단점이 있다.

하지만 만약 정기적으로 특정 웹페이지의 내용을 긁어다가 활용해야 하는 업무를 맡고 있다면, 웹파싱만큼 훌륭한 솔루션이 없다.

칼퇴를 기원한다.

이어지는 글 <엑셀VBA 입문 11-2강> 배열(Array) : https://blog.naver.com/bb_/221313490342

​이어지는 글 <엑셀VBA 입문 12강> 특정파일 특정시트의 특정셀을 가져오는 매크로 : https://blog.naver.com/bb_/221288948784
이어지는 글 <엑셀VBA 입문 13강> 선택영역 한꺼번에 변경하기(VBA Selection)  : https://blog.naver.com/bb_/221303389424