엑셀 크롤링 함수 :: GetHttp 명령문 사용법

엑셀 웹 페이지 정보를 크롤링 할 수 있는 GetHttp 함수의 사용법 및 동작원리를 살펴봅니다.

홈페이지 » 엑셀 크롤링 함수 :: GetHttp 명령문 사용법

엑셀 크롤링 함수 :: GetHttp 명령문 사용법 총정리

엑셀 GetHttp 명령문 목차 바로가기
요약

엑셀 GetHttp 함수는 특정 URL의 웹페이지 정보를 받아오는 함수입니다. 결과값으로 HTML 문서를 반환합니다.

명령문 구문
= GetHttp ( URL, RequestHeader )
사용된 인수 및 변수 알아보기
인수 설명
URL
[Range]
웹페이지 정보를 받아올 URL 주소입니다.
RequestHeader
[Variant, 선택인수]
URL 주소와 함께 전송할 RequestHeader 를 입력합니다. Header와 Value를 쉼표로 구분하여 입력합니다. RequestHeader 는 반드시 짝수(=Header와 Value가 한쌍)로 입력되어야 합니다.

만약 RequestHeader로 입력된 인수의 개수가 짝수가 아닐경우 함수는 #VALUE! 오류를 반환합니다.

예제파일 다운로드

상세 설명

엑셀로 웹 페이지 정보를 받아오는 엑셀 "웹 크롤링 함수"입니다. 특정 URL의 웹페이지 정보를 HTML 문서로 반환합니다. 상황에 따라 RequestHeader를 직접 추가할 수 있습니다.

GetHttp의 함수의 User-Agent (사용중인 브라우저)의 기본값은 ""Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Mobile Safari/537.36"" (*크롬/사파리 최신 브라우저, 2020년 11월 기준) 으로 설정되어 있으며 필요에 따라 명령문의 User-Agent 값을 변경하여 사용합니다.

결과값으로 HTML 문서를 반환하기 때문에 시트 위에서는 사용할 수 없습니다. GetHTTP 로 반환된 값은 Object (일반 개체)로도 받아올 수 있으나, Object로 받아올 경우 HTML 라이브러리에서 제공되는 일부 기능 사용에 제한이 있을 수 있습니다. (*HTML 문서로 받아올 경우 [도구] - [참조] 에서 Microsoft HTML Object Library를 추가해야 합니다.)

HTML Object 라이브러리 설정
HTML Object 라이브러리를 추가합니다. (필요시)

GetHttp 명령문의 결과값을 Object로 반환받는 경우

Sub 크롤링예제1()
 
Dim htmlResult As Object
Dim htmlString As String
 
Set htmlResult = GetHttp(Sheet1.Range("B8").Value)
htmlString = htmlResult.body.innerhtml
 
MsgBox htmlString
 
End Sub

GetHttp 명령문의 결과값을 HTML 문서로 받환받는 경우

'// [도구] - [참조] 에서 Microsoft HTML Object Library 를 추가합니다.
Sub 크롤링예제2()
 
Dim htmlResult As HTMLDocument
Dim htmlItem As IHTMLElement
Dim htmlString As String
 
Set htmlResult = GetHttp(Sheet1.Range("B8").Value)
htmlString = htmlResult.body.innerhtml
 
For Each htmlItem In htmlResult.getElementsByClassName("Class")
    htmlItem.innerText
Next
 
End Sub
실전 사용 예제
  1. 네이버 메인 페이지의 HTML 문을 A1셀에 출력하기
    Sub 네이버크롤링예제()
     
    Dim htmlResult As HTMLDocument
    Dim htmlString As String
     
    Set htmlResult = GetHttp("https://www.naver.com")
    htmlString = htmlResult.body.innerhtml
     
    Sheet1.Range("A10").Value = htmlString
     
    End Sub
  2. 네이버 메인 페이지의 네이게이션 메뉴 가져오기
    '// [도구] - [참조] 에서 Microsoft HTML Object Library 를 추가합니다.
    Sub 네이버크롤링예제()
     
    Dim htmlResult As HTMLDocument
    Dim htmlItem As IHTMLElement
    Dim i As Long
     
    Set htmlResult = GetHttp("https://www.naver.com")
     
    i = 1
    For Each htmlItem In htmlResult.getElementsByClassName("nav_item")
        Sheet1.Cells(i, 1).Value = htmlItem.innerText
        i = i + 1
    Next
     
    End Sub

엑셀 크롤링, GetHttp 명령문 동작원리

GetHttp 명령문 전체 코드
Function GetHttp(URL As String, ParamArray RequestHeader() As Variant) As Object
 
'###############################################################
'오빠두엑셀 VBA 사용자지정함수 (https://www.oppadu.com)
'▶ GetHttp 함수
'▶ 웹에서 데이터를 받아옵니다.
'▶ 인수 설명
'_____________URL                               : 데이터를 스크랩할 웹 페이지 주소입니다.
'_____________RequestHeader            : RequestHeader를 배열로 입력합니다. 반드시 짝수(한 쌍씩 이루어진) 개수로 입력되어야 합니다.
'▶ 사용 예제
'Dim HtmlResult As Object
'Set htmlResult = GetHttp("https://www.naver.com")
'msgbox htmlResult.body.innerHTML
'###############################################################
 
Dim oHTMLDoc As Object: Dim objHTTP As Object
 
Dim sUserAgent As String: sUserAgent = "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Mobile Safari/537.36"
 
Application.DisplayAlerts = False
 
If Left(URL, 4) <> "http" Then URL = "http://" & URL
 
Set oHTMLDoc = CreateObject("HtmlFile")
Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
 
objHTTP.setTimeouts 3000, 3000, 3000, 3000
objHTTP.Open "GET", URL, False
objHTTP.setRequestHeader "User-Agent", sUserAgent
If Not IsMissing(RequestHeader) Then
    Dim vRequestHeader As Variant
    For Each vRequestHeader In RequestHeader
        Dim uHeader As Long: Dim Lheader As Long: Dim steps As Long
        uHeader = UBound(vRequestHeader): Lheader = LBound(vRequestHeader)
        If (uHeader - Lheader) Mod 2 = 0 Then GET_HttpRequest = CVErr(xlValue): Exit Function
        For i = Lheader To uHeader Step 2
            objHTTP.setRequestHeader vRequestHeader(i), vRequestHeader(i + 1)
        Next
    Next
End If
objHTTP.send
 
With oHTMLDoc
    .Open
    .Write objHTTP.responsetext
    .Close
End With
 
Set GetHttp = oHTMLDoc
Set oHTMLDoc = Nothing
Set objHTTP = Nothing
 
Application.DisplayAlerts = True
 
End Function
명령문 동작원리 단계별 알아보기
  1. 변수를 선언하고 설정합니다.
    Dim oHTMLDoc As Object: Dim objHTTP As Object
     
    Dim sUserAgent As String: sUserAgent = "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Mobile Safari/537.36"
     
    Application.DisplayAlerts = False
     
    If Left(URL, 4) <> "http" Then URL = "http://" & URL
     
    Set oHTMLDoc = CreateObject("HtmlFile")
    Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
  2. HTTP 요청을 보내기전 URL 주소 및 Request-Header를 설정합니다.
    objHTTP.setTimeouts 3000, 3000, 3000, 3000
    objHTTP.Open "GET", URL, False
    objHTTP.setRequestHeader "User-Agent", sUserAgent
    If Not IsMissing(RequestHeader) Then
        Dim vRequestHeader As Variant
        For Each vRequestHeader In RequestHeader
            Dim uHeader As Long: Dim Lheader As Long: Dim steps As Long
            uHeader = UBound(vRequestHeader): Lheader = LBound(vRequestHeader)
            If (uHeader - Lheader) Mod 2 = 0 Then GET_HttpRequest = CVErr(xlValue): Exit Function
            For i = Lheader To uHeader Step 2
                objHTTP.setRequestHeader vRequestHeader(i), vRequestHeader(i + 1)
            Next
        Next
    End If
  3. HTTP 요청을 보냅니다.
    objHTTP.send
  4. HTTP 결과값을 HTLM 문서로 저장합니다.
    With oHTMLDoc
        .Open
        .Write objHTTP.responsetext
        .Close
    End With
  5. GetHttp 함수의 결과값을 반환한 뒤 함수를 종료합니다.
    Set GetHttp = oHTMLDoc
    Set oHTMLDoc = Nothing
    Set objHTTP = Nothing
     
    Application.DisplayAlerts = True
guest
0 댓글
Inline Feedbacks
모든 댓글 보기
0
여러분의 생각을 댓글로 남겨주세요.x