엑셀 크롤링 함수 :: GetHttp 명령문 사용법 총정리
엑셀 GetHttp 명령문 목차 바로가기
요약
엑셀 GetHttp 함수는 특정 URL의 웹페이지 정보를 받아오는 함수입니다. 결과값으로 HTML 문서를 반환합니다.
패치노트
- 2023.02.22 : 일부 윈도우 버전에서 보안 채널 접속(Secure Channel Authentication) 오류 발생 시, XMLServerHTTP → XMLHTTP 개체로 요청하도록 코드를 수정하였습니다.
- 2021.04.21 : 런타임 424 오류 "개체가 필요합니다" 오류 발생시 대응가능한 IncludeMeta 인수 추가. 424 오류 발생시 IncludeMeta를 True로 사용합니다. IncludeMeta를 True로 사용할 경우 InnerText 속성을 사용할 수 없습니다.
- 2021.02.14 : WinHTTP 요청을 선택할 수 있도록 isWinHttp 인수 추가
명령문 구문
사용된 인수 및 변수 알아보기
인수 | 설명 |
URL [Range] |
웹페이지 정보를 받아올 URL 주소입니다. |
FormText [String, 선택인수] |
직접적인 쿼리 문자열이 아닌 FormText 데이터로 쿼리를 전달해야 할 경우에 쿼리문을 입력합니다. (예: Content-Type: application/x-www-form-urlencoded; 인 경우) |
IsWinHttp [Boolean, 선택인수] |
기본값은 XMLHttp 요청입니다. 상황에 따라 페이지 Redirect가 필요할 경우 TRUE로 입력하여 WinHTTP 요청을 보냅니다. |
RequestHeader [Variant, 선택인수] |
URL 주소와 함께 전송할 RequestHeader 를 배열로 입력합니다. RequestHeader 는 반드시 짝수(=Header와 Value가 한쌍)로 입력되어야 합니다.
만약 RequestHeader로 입력된 인수의 개수가 짝수가 아닐경우 함수는 #VALUE! 오류를 반환합니다. |
IncludeMeta [Boolean, 선택인수] |
424 런타임 "개체가 필요합니다." 오류가 발생할 경우 IncludeMetra를 True로 사용합니다. 기본값은 False 입니다.
IncludeMeta를 True로 사용하면 HTML문서의 InnerText 속성은 사용할 수 없습니다. |
RequestType [String, 선택인수] |
HTTP 요청 방식을 선택합니다. 기본값은 "GET" 입니다. |
예제파일 다운로드
오빠두엑셀의 강의 예제파일은 여러분을 위해 자유롭게 제공하고 있습니다.
- [엑셀VBA함수] GetHttp 함수예제파일
상세 설명
엑셀로 웹 페이지 정보를 받아오는 엑셀 "웹 크롤링 함수"입니다. 특정 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 라이브러리를 추가합니다. (필요시) GetHttp 함수로 받아온 HTML 코드에 특수기호 코드(예: < > 등..) 이 포함되어 있을 경우, HtmlEntites 함수를 사용하면 특수기호 코드를 실제 특수기호로 변환할 수 있습니다.
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
실전 사용 예제
- 네이버 메인 페이지의 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
- 네이버 메인 페이지의 네이게이션 메뉴 가져오기
'// [도구] - [참조] 에서 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, Optional formText As String, _ Optional isWinHttp As Boolean = False, _ Optional RequestHeader As Variant, _ Optional includeMeta As Boolean = False, _ Optional RequestType As String = "GET") As Object '############################################################### '오빠두엑셀 VBA 사용자지정함수 (https://www.oppadu.com) '▶ GetHttp 함수 '▶ 웹에서 데이터를 받아옵니다. '▶ 인수 설명 '_____________URL : 데이터를 스크랩할 웹 페이지 주소입니다. '_____________formText : Encoding 된 FormText 형식으로 보내야 할 경우, Send String에 쿼리문을 추가합니다. '_____________isWinHttp : WinHTTP 로 요청할지 여부입니다. Redirect가 필요할 경우 True로 입력하여 WinHttp 요청을 전송합니다. '_____________RequestHeader : RequestHeader를 배열로 입력합니다. 반드시 짝수(한 쌍씩 이루어진) 개수로 입력되어야 합니다. '_____________includeMeta : TRUE 일 경우 HTML 문서위로 ResponseText를 강제 입력합니다. Meta값이 포함되어 HTML이 작성되며 innerText를 사용할 수 없습니다. 기본값은 False 입니다. '_____________RequestType : 요청방식입니다. 기본값은 "GET"입니다. '▶ 사용 예제 'Dim HtmlResult As Object 'Set htmlResult = GetHttp("https://www.naver.com") 'msgbox htmlResult.body.innerHTML '############################################################### Dim oHTMLDoc As Object: Dim objHTTP As Object Dim HTMLDoc As Object Dim i As Long: Dim blnAgent As Boolean: blnAgent = False 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 HTMLDoc = CreateObject("HtmlFile") ' 2023-02-22 | 수정 | 윈도우 인증 접속 문제 발생 시 (일부 버전) ServerXMLHTTP -> XMLHTTP 요청으로 변경 ' XMLHTTP 요청 시, TimeOut 세팅 불가 (기본값 설정) ' https://stackoverflow.com/questions/11605613/differences-between-xmlhttp-and-serverxmlhttp On Error GoTo SendError: '------------------------------ If isWinHttp = False Then Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP") Else Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1") End If objHTTP.setTimeouts 1200000, 1200000, 1200000, 1200000 '응답 대기시간 120초 ' 2023-02-22 | 수정 | 윈도우 인증 접속 문제 발생 시 (일부 버전) ServerXMLHTTP -> XMLHTTP 요청으로 변경 SendRestart: '------------------------------ objHTTP.Open RequestType, URL, False 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 GetHttp = CVErr(xlValue): Exit Function For i = Lheader To uHeader Step 2 If vRequestHeader(i) = "User-Agent" Then blnAgent = True objHTTP.setRequestHeader vRequestHeader(i), vRequestHeader(i + 1) Next Next End If If blnAgent = False Then objHTTP.setRequestHeader "User-Agent", sUserAgent objHTTP.send formText If includeMeta = False Then With oHTMLDoc .Open .Write objHTTP.responseText .Close End With Else oHTMLDoc.Body.innerHTML = objHTTP.responseText End If Set GetHttp = oHTMLDoc Set oHTMLDoc = Nothing Set objHTTP = Nothing Application.DisplayAlerts = True ' 2023-02-22 | 수정 | 윈도우 인증 접속 문제 발생 시 (일부 버전) ServerXMLHTTP -> XMLHTTP 요청으로 변경 Exit Function SendError: Set objHTTP = CreateObject("MSXML2.XMLHTTP") On Error GoTo 0 Resume SendRestart: '------------------------------ End Function
명령문 동작원리 단계별 알아보기
- 변수를 선언하고 설정합니다.
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")
- 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
- HTTP 요청을 보냅니다.
objHTTP.send
- HTTP 결과값을 HTLM 문서로 저장합니다.
With oHTMLDoc .Open .Write objHTTP.responsetext .Close End With
- GetHttp 함수의 결과값을 반환한 뒤 함수를 종료합니다.
Set GetHttp = oHTMLDoc Set oHTMLDoc = Nothing Set objHTTP = Nothing Application.DisplayAlerts = True
- 네이버 메인 페이지의 HTML 문을 A1셀에 출력하기