2014년 7월 23일 수요일

Web Parsing by VBA

http://bizanalytics.tistory.com/37

업무상 VBA로 웹에서 정보를 파싱해 오는 경우가 많은데 이럴 때 매번 어떤 방법으로 파싱할지 고민을 하게 된다.
속도와 정확도를 고려해야 하고 사이트에서 로그인 등을 요구하는 경우, 좀더 복잡한 방법이 필요하게 된다.

지금까지 경험을 통해서 VBA로 웹파싱하는 각각의 방법과 장단점을 비교해 본다.

1. Winhttp를 이용하는 방법

가장 기본적인 방법이면서도 필요한 모든 기능을 제공하는 아주 막강한 라이브러리이다. GET, POST 방식 모두 지원하며, 헤더와 쿠키 정보도 작성하여 같이 전송할 수 있다.

사실상 거의 모든 페이지를 완벽히 파싱해 올 수 있으나 우리나라의 웹 환경상 접근이 제한되어 있는 페이지는 파싱해오기 어려운 문제점이 있다.(Internet Explorer.Application을 이용하면 이 문제도 해결 가능하다. 추후 설명) 또한 결과값은 단순히 String으로 제공하기 때문에 DOM 형식에 따른 접근이 어려운 문제점도 존재한다. 따라서 String을 일일이 Split하는 노가다가 불가피하다. (HTMLDocument를 이용하면 이 문제도 해결 가능하다 추후 설명)

때문에 단순한 페이지를 파싱해 올때는 속도면에서나 코딩 작업의 효율 면에서 매우 유용하나, 복잡한 페이지를 파싱하는 데에는 다른 라이브러리를 같이 사용할 필요가 있다.

또한 비슷한 라이브러리로 xmlhttp가 있는데 불러온 페이지의 정보를 XML DOM 형식으로 제공하는 장점이 있다. 해외 포럼에서는 xmlhttp의 속도가 더 빠르다고 이야기하는 경우를 종종 봤는데, 체감상으로 잘 느껴지지 않는다. 그리고 winhttp는 WaitForResponse를 통해서 페이지를 모두 로드할 때까지 대기하게 할 수 있지만, xmlhttp는 Status를 통해서 간접적으로 확인 할 수밖에 없어 불편함이 있다.


2. Internet Explorer.Application 오브젝트를 이용하는 방법

VB나 VC 계열의 언어에서는 자바나 다른 언어와는 달리 추가적인 라이브러리 없이 손쉽게 Internet Explorer를 제어할 수 있다. InternetExplorer.Application 오브젝트를 생성한 다음에 웹페이지에 접근하고, 폼에 정보를 입력하거나 마우스를 클릭하는 등 이벤트도 설정할 수 있다.

따라서 ActiveX 환경하에서 로그인이 필요한 홈뱅킹 등의 사이트도 손쉽게 접근할 수 있다. 그리고 페이지 정보를 DOM 형식으로 제공하기 때문에 id나 tag, class 정보로 손쉽게 특정 정보에 접근할 수 있어 활용범위가 무궁무진한 장점이 있다.

때문에 winhttp의 대부분의 단점을 커버한다고 볼수 있으나 가장 큰 문제점은 속도이다. Internet Explorer 애플리케이션을 직접 실행시켜서 제어하기 때문에 메모리를 지나치게 많이 차지하고 ActiveX 추가기능들이 실행되는 환경이라면 더욱더 느려지는 문제점이 발생한다.

그리고 속도가 느려지다 보니 파싱한 페이지 정보가 짤려버리는 문제점도 종종 발생하기 때문에 에러 처리에 많은 시간을 들여야 할 수도 있다. 따라서 불가피한 경우에만 사용하는 것이 좋다고 본다.


3. Winhttp와 HtmlDocument를 이용하는 방법

Winhttp로 파싱한 페이지 정보를 HTMLDocment 오브젝트에 강제로 집어넣음으로서 DOM 형식으로 만드는 방법이다. 속도면에서나 정보의 접근성 면에서나 가장 우수한 방법이다. 현재는 이방법으로만 코딩을 하고 있다. 추후에 이 방법으로 페이지를 파싱하는 방법에 대해서 글을 올려 보겠다.

tip. 3번의 방법 즉, winhttp와 HtmlDocument를 같이 사용하는 방법이 효과적이긴 하나 로그인 등이 필요한 일부 페이지는 접근이 어려운 문제가 있다. 이러한 문제는 InternetExplorer 애플리케이션을 실행하여 로그인 한다음에 쿠키를 복사한 뒤, WinHttp로 쿠키 정보를 다시 보내면 간단히 해결 가능하다. 이 방법에 대해서도 추후 글을 올려 보겠다.