1. 셀레니움(Selenium)과 VBA로 특정 웹사이트 조작하는 방법
이전 포스팅에서는 셀레니움의 소개와 크롬 드라이버의 업데이트 방법, 설치방법 등을 설명드렸는데요. 이번에는 본격적으로 셀레니움을 활용한 특정 웹사이트의 자동 조작방법을 알려드리겠습니다. 먼저 셀레니움을 설치한 후 크롬드라이버의 버전에 맞게 업데이트하는 준비작업이 필요하므로 해당 내용은 하기 포스팅을 참고 부탁드립니다.
엑셀 크롤링4. 셀레니움 크롬 드라이버 업데이트 방법 (tistory.com)
첫번째로 엑셀파일을 열고 난후 Art+F11을 눌러 VBA 창에 진입하여, 모듈을 하나 추가합니다.
그리고 VBA창에서 도구→참조 버튼을 눌러서 참조 창에서 "Selenium Type Library"를 추가해줍니다. 셀레니움을 제대로 설치하셨다면 이 라이브러리가 보일 것이며 셀레니움을 엑셀 VBA로 조작하기 위해서는 이 참조가 반드시 필요합니다.
마지막으로 방금 추가한 모듈의 우측 VBA코드 입력창에 하기 코드를 그대로 복사하여 붙여넣습니다.
Sub seleniums_TEST()
Static sel As New WebDriver '여기서 변수를 Static으로 선언해줌으로서 열린 웹사이트를 매크로 종료후에도 유지함
Set sel = New ChromeDriver 'sel이라는 변수를 크롬으로 새로 선언
'Dim sel As New Selenium.ChromeDriver 이런 선언도 됩니다.
sel.Start "chrome" '크롬드라이버로 웹사이트를 엽니다.
sel.Get "https://vba-excel.tistory.com/" '해당 url웹사이트로 이동합니다.
sel.Window.Maximize '크롬의 웹사이트 창을 최대사이즈로 조정합니다.
sel.ExecuteScript "document.body.style.zoom = '120%'" '화면비율을 120%로 조정합니다.
sel.Wait (2000) '2초정도 기다려줍니다.
sel.FindElementByCss("#recent > ul > li:nth-child(1) > a > span.title").Click '최근글을 클릭합니다.
End Sub
그렇게 되면 현재 이블로그의 최신글을 자동으로 클릭하는 매크로를 만들 수 있습니다.
1. 셀레니움(Selenium)과 VBA로 특정 웹사이트 조작 상세 코드분석
상기 코드를 상세하게 분석해보겠습니다.
먼저 sel이라는 변수를 Static sel As New WebDriver으로 정적 변수로서 웹드라이버로서 선언해줍니다. 여기서 중요한 것은 Static이라는 선언 방식으로 일반적으로 변수는 Dim으로 선언합니다만, Static이라는 선언으로 인해 모든 SUB가 종료되어도 sel이라는 변수가 중단되지 않고 유지되도록 정적변수로서 선언합니다.
그 다음으로 sel.Start "chrome" 를 실행하면 크롬 창이 실행됩니다. 이 상태에서는 빈 크롬창만 나타나게 되는데요. 이후 sel.Get "https://vba-excel.tistory.com/"이라는 부분에서 원하시는 url을 " "로 감싸서 넣어주면 해당 웹사이트로 이동하도록 변경해줄 수 있습니다.
sel.Window.Maximize이라는 것은 최초 크롬이 실행될 때는 창이 최소화 된 상태로 나타나는데 크롬 창을 최대사이즈로 조정시키는 구문입니다. sel.ExecuteScript "document.body.style.zoom = '120%'"는 크롬 창에서 화면 비율을 바꿔주는 구문인데요. 여기서 '120%'를 원하시는 숫자로 바꿔주면 해당 비율로 화면비율을 조정할 수 있습니다.
sel.Wait (2000)는 2초간 다음 동작으로 넘어가기전에 기다리게 하는 구문인데요. 셀레니움은 웹사이트를 자동으로 조작합니다만, 웹사이트에서 다음 페이지로 넘어갈 때 시간이 소요되는데요. sel.wait로 기다리지 않을 경우 웹사이트가 다음 페이지로 넘어가는 도중에 다음 명령(특정 요소를 클릭해라 등)을 내리게되고 에러가 발생합니다. 이 에러를 방지하기 위해서 특정 시간동안 기다리게 하는 구문을 추가하는 것이 sel.wait입니다 ()안에 있는 숫자로 2000= 2초 200= 0.2초가 됩니다.
마지막으로 sel.FindElementByCss("#recent > ul > li:nth-child(1) > a > span.title").Click인데요. 이 부분으로 특정 웹사이트의 요소(엘리먼트)를 찾아 클릭하게 하거나, 값을 입력시키게 하는 등 조작을 할 수 있게합니다. 이 부분은 다음 포스팅에서 구체적으로 다뤄보겠습니다.
감사합니다.