웹쿼리 오류
Sub 웹쿼리()
Dim url As String
url = "https://www.daum.net/" ' ← 가져올 웹페이지 주소
With ActiveSheet.QueryTables.Add( _
Connection:="URL;" & url, _
Destination:=Range("A1"))
.Name = "WebQuery"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.WebSelectionType = xlEntirePage ' 웹 전체 가져오기
.WebFormatting = xlWebFormattingNone
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.WebSingleBlockTextImport = False
.WebDisableDateRecognition = False
.WebDisableRedirections = False
.Refresh BackgroundQuery:=False
End With
End Sub
이제 이런식의 웹쿼리 방식은 지원종료됐나요? 저번주까지 잘 됐는데....
Z
h
김
숫
혀
신
댓글 3
엑셀2007에서는 됩니다..
안녕하세요~
1. 위 증상은
두가지 측면서 살펴볼 수 있는데,
하나는, 이 코딩은
내부적으로 Internet Explorer 엔진(WinINET/Trident) 를
이용하는 오래된 웹쿼리 방식이어서
이미 MS는 IE11 지원 종료를 했고,
엑셀 내부의 IE 의존 기능도 단계적으로 축소하거나 막는 중입니다.
어느 날 Office 업데이트가 깔리면서
TLS, 스크립트, 리디렉션 등 보안 정책이 바뀌면서
“어제까지 되던 사이트가 오늘부터 안 되는” 상황이 충분히 생길 수도 있습니다.
두번째는 다음측의 변경 가능성이 있는데,
메인 페이지는 요즘 트렌드대로
JavaScript로 동적으로 렌더링되는 부분이 많고
봇/스크래핑 차단이 점점 강화되는 추세입니다.
특히 구식 IE 계열 User-Agent, 쿠키 없는 요청, 일반 브라우저와 다른 헤더 등은
리디렉션을 돌리거나, 빈 페이지,에러 페이지를 돌려주는 식으로 응답할 수 있습니다.
2. 이 두가지 관점에서
BackgroundQuery := False 에서 에러가 나는 이유는
실제로는 Refresh 단계에서 통신/파싱이 실패해서,
QueryTable이 제대로 생성이나 초기화되지 못했기 때문으로
이는 Daum 사이트 구조, 보안정책 변경과 함께
Office 업데이트로 IE기반의 WebQuery 기능의 약화로 볼 수 있습니다.
반면에
Excel 2007은 더 이상 기능 업데이트가 거의 안되어
WebQuery( QueryTables.Add Connection:="URL;..." )가
예전부터 쓰던 IE 기반 엔진 구조 그대로 남아있고,
보안정책이 더 이상 크게 바뀌지 않아서
Windows에 IE 컴포넌트만 살아 있는 한
2007의 WebQuery는 계속 예전 방식대로 구조라고 볼 수 있습니다.
따라서,
특히 같은 코드가 2007에서는 되고, 365/2019에서만 BackgroundQuery := False 에러가 난다는 건
Daum이 완전히 막았다기보다는,
새 버전 오피스의 WebQuery/IE 처리 방식과 보안정책이 달라졌기 때문일 가능성이 크다고 볼 수 있습니다.
즉,
QueryTables.Add 를 호출하더라도
2007에서는 IE7, 8 기준의 느슨한 보안과 더불어
WinINet, MSHTML을 거의 그대로 끌어다 쓰는 구조여서
서버가 HTTPS를 쓰더라도
그 당시 수준의 암호화/TLS 조합이면 웬만하면 다 연결이 완료되고
HTML을 어떻게든 가져오기만 하면,
QueryTable을 생성하고
.Refresh BackgroundQuery:=False 도
성공으로 간주합니다.
그러나
최신버전에서는 IE11지원 공식 종료와 함께
TLS 1.0/1.1 차단하고, TLS 1.2 이상을 강제하고,
일부 암호화 스위트/프로토콜 사용을 금지했습니다.
또한
보안존/ActiveX/스크립트 실행 제한을 강화하여
QueryTables.Add를 호출하더라도
응답을 제대로 못 받거나,
SSL/TLS handshake 단계에서 내부 통신 에러가 발생할 수 있습니다.
그래서 Daum처럼
HTTPS 기반에 동적 JS 랜더링, 봇 차단 로직까지 섞인 사이트는
2007에서는 겨우 응답을 받는다고 볼 수 있고,
최신 버전에서는 보안과 엔진상 지원이 불가하여
.Refresh BackgroundQuery:=False 에서 바로 에러가 난다고 볼 수 있습니다.
3. 따라서
요즘 엑셀을 사용하신다면,
Private Sub 웹쿼리() Dim http As Object Dim html As String Set http = CreateObject("WinHttp.WinHttpRequest.5.1") http.Open "GET", "https://www.daum.net/", False http.Send html = http.ResponseText With ActiveSheet .Range("A1").Value = html .Columns("A").EntireColumn.AutoFit End With End Sub이렇게
WinHttp로 직접 요청을 보내고,
HTML/JSON을 직접 파싱하는 방식을 메인으로 가져가시는 게 좋을 듯 싶습니다.
감사합니다.