엑셀 VBA 리다이렉트 URL :: GetRedirectURL 함수 사용법

URL 접속시 리다이렉트되는 경우에 리다이렉트 된 URL 주소를 반환하는 GetRedirectURL 함수의 사용법을 알아봅니다.

작성자 :
오빠두엑셀
최종 수정일 : 2021. 01. 30. 13:44
URL 복사
메모 남기기 : (1)

엑셀 VBA 리다이렉트 URL :: GetRedirectURL 명령문 사용법 총정리

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

엑셀 GetRedirectURL 함수는 접속시 리다이렉트 되는 URL 주소를 반환하는 함수입니다.
(301, 302, 303, 307, 308 상태를 모두 포함하여 조회합니다.)

명령문 구문
= GetRedirectURL ( URL, [RequestHeader] )
사용된 인수 및 변수 알아보기
인수 설명
URL주소
[String]
리다이렉트되는 주소를 확인할 최초 URL 주소입니다.
RequestHeader
[Variant, 선택인수]
HTTP 요청에 사용할 RequestHeader 값입니다. "Header종류", "Header값" 으로 반드시 쌍으로 입력되어야 합니다.

예제파일 다운로드

상세 설명

엑셀 GetRequestURL 함수는 URL 접속시 리다이렉트되는 경우(301, 302, 303, 307, 308 상태)에 리다이렉트 된 URL 주소를 반환하는 사용자 함수입니다. WinHttpRequest 개체를 사용하므로 윈도우 PC에서만 사용가능합니다.

웹 브라우저의 개발자툴 (F12)의 네트워크 창을 통해 기존 URL의 접속상태를 확인할 수 있으며, 리다이렉트되는 경우 3으로 시작되는 상태번호를 확인할 수 있습니다.

HTTP 리다이렉트 코드
접속한 URL이 리다이렉트 될 경우 3으로 시작하느 상태코드를 확인할 수 있습니다.

HTTP 요청을 통한 웹 크롤링 시, 리다이렉트 되는 URL일 경우 정보를 올바르게 가져오지 못하는 상황이 발생할 수 있습니다. 그럴경우, GetRedirectURL 함수를 사용하여 리다이렉트 된 URL 주소를 우선 받아와 문제를 해결합니다.

실전 사용 예제
  1. 리다이렉트 되는 URL 주소 받아오기 (예: 네이버 부동산)
    Dim sURL as String
    sURL = "https://www.naver.com/예제주소"
    sURL = GetRedirectURL(sURL)
  2. 오류 방지를 위해 URL 주소가 리다이렉트 되는지 확인하기
    Dim sURL as String
    sURL = "https://www.naver.com/예제주소"
    If sURL <> GetRedirectURL(sURL) Then MsgBox "리다이렉트 되었습니다."

엑셀 VBA 리다이렉트 URL, GetRedirectURL 명령문 동작원리

GetRedirectURL 명령문 전체 코드
Function GetRedirectURL(URL As String, ParamArray RequestHeader() As Variant) As String
 
'###############################################################
'오빠두엑셀 VBA 사용자지정함수 (https://www.oppadu.com)
'▶ GetRedirectURL 함수
'▶ 302 Redirect 된 URL 주소를 받아옵니다.
'▶ 인수 설명
'_____________URL                               : 데이터를 스크랩할 웹 페이지 주소입니다.
'_____________RequestHeader            : RequestHeader를 배열로 입력합니다. 반드시 짝수(한 쌍씩 이루어진) 개수로 입력되어야 합니다.
'▶ 사용 예제
'Dim sURL as String
'sURL = GetRedirectURL("https://www.google.com")
'###############################################################
 
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"
 
Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
 
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
On Error GoTo NoRedirect:
objHTTP.send
 
GetRedirectURL = objHTTP.Option(1)
Exit Function
 
NoRedirect:
GetRedirectURL = URL
 
End Function
명령문 동작원리 단계별 알아보기
  1. 리다이렉트 된 URL 주소를 받아오기 위한 WinHTTP 개체를 생성합니다.
    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"
     
    Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
  2. HTTP 요청을 수립 후 RequestHeader를 설정합니다.
    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 요청을 보낸 뒤, 리다이렉트 된 URL 주소를 반환합니다. (Send 자동화 오류 발생시 -> 리다이렉트 되지 않음)
    On Error GoTo NoRedirect:
    objHTTP.send
     
    GetRedirectURL = objHTTP.Option(1)
    Exit Function
     
    NoRedirect:
    GetRedirectURL = URL
5 1 투표
게시글평점
1 댓글
Inline Feedbacks
모든 댓글 보기
1
0
여러분의 생각을 댓글로 남겨주세요.x