본문 바로가기

코딩/파이썬(Python)

[파이썬] 파이썬 Selenium과 Javascript를 사용한 웹 자동화

반응형

파이썬 Selenium과 Javascript를 사용한 웹 자동화

많이 알다시피 Selenium은 웹자동화를 위한 라이브러리이고, 파이썬 뿐만 아니라 여러가지 언어버전으로 라이브러리를 제공하고 있다. 그리고 크롬, 인터넷익스플로러 등을 지원하기 때문에 활용할 수 있는 분야가 많이 있는데, 특히 크롬과 사용시 활용도가 높다.

 

그리고 Selenium에서는 일반적인 브라우저 action과 Dom Element에 대한 접근 외에, Javascript 실행이 가능한 excute_script 메소드를 제공하는데, 이 메소드를 활용하면 일반적인 브라우저 action만으로 자동화하기 어려운 것들도 자동화가 가능하다.

 

예를 들어 페이지에 특정 element를 새로 만든다던가, 보이지 않게 숨긴다던가. javascript로 할수 있는 모든 것이 가능해진다. 즉, Selenium만으로는 화면을 읽고 정해진 이벤트만 발생시킬 수 있다면, javascript를 같이 활용하면 화면 자체를 마음대로 조작할수가 있어진다. 

 

JQuery Injection

다만, 순수한 javascript는 스크립트를 작성하기 매우 비효율적이라 jquery를 사용하는 편이 훨씬 수훨한데, 대상 페이지가 jquery를 사용하지 않는다면 당연히 selenium에서도 jquery를 사용할 수가 없다. 이때는 jquery injection이 필요하다. Jquery Injection은 javascript로 대상 페이지에 script 태그 element를 생성해서 jquery.js 파일을 외부에서 불러오도록 하는 방법이다. 이 방법으로 jquery를 사용하지 않는 페이지에서도 jquery 사용이 가능해진다. 

(Jquery Event Method)

 

<Jquery Injection 코드>

script_jquery_injection = '''
    javascript:(function() {
        function l(u, i) {
            var d = document;
            if (!d.getElementById(i)) {
                var s = d.createElement('script');
                s.src = u;
                s.id = i;
                d.body.appendChild(s);
            }
        }
        l('//code.jquery.com/jquery-3.2.1.min.js', 'jquery')
    })();
'''
driver.execute_script(script_jquery_injection)

 

Jquery를 통한 웹자동화 예시

예를 들어 네이버 검색창에 특정 키워드를 입력하는 것을 자동화한다고 예를 들어 보자.

 

Selenium에서 send_keys 메소드를 사용하면 아래와 같다.

driver.find_element_by_css_selector("input#query.input_text").send_keys("블라블라")

 

그리고 jquery를 사용하면 아래와 같다.

driver.execute_script('$("input#query.input_text").val("블라블라");')

 

둘다 아래와 같이 검색창에 "블라블라"를 동일하게 입력하는 모습을 보여준다.

 

execute_script 메소드가 특히 유용하게 쓰일 때 : 화면 스크롤

개인적인 경험상 execute_script를 가장 유용하게 쓰는 경우는 화면을 스크롤할 때이다.  Selenium에서는 마우스 스크롤 메소드를 지원하지 않는다. win32api를 사용하면 가능은 하지만 이 또한 제약 사항이 많이 발생한다.

(stackoverflow.com/questions/9543397/creating-a-mouse-scroll-event-using-python)

 

이 때 jquery에서 제공하는 animate effect 메소드를 사용하면 간단하게 스크롤 효과를 구현할 수 있다.

(www.w3schools.com/jquery/jquery_animate.asp)

 

아래는 화면 끝까지 스크롤하는 jquery 스크립트와 이 스크립트를 Selenium에서 실행하는 코드이다.

script_scroll_to_bottom = '$("html, body").animate({ scrollTop: $(document).height()-$(window).height()});'
driver.execute_script(script_scroll_to_bottom)

 

최근에는 스크롤에 따라서 동적으로 element를 생성하는 웹페이지들이 많아져서 selenium만으로 웹자동화를 하기에 어려운 상황이 종종 발생한다. 위의 코드처럼 스크롤을 구현해도 되고, 해당 페이지의 javascript 코드를 분석해서 element를 동적으로 생성하는 javascript 함수를 execute_script롤 직접 호출해도 된다.

 

효과적인 웹자동화를 위해서는 javascript 공부도 필요

앞의 예제에서 봤듯이 selenium의 한계를 보완하기 위해서는 어느정도 javascript를 사용할 필요가 있고, 순수 javascript가 어렵다면, 최소한 jquery injection을 통해서 jquery를 사용하는 방법은 익히는 것이 좋다. selenium과 javascript를 자유자재로 다룰 수 있어야, 어느 정도 고수의 반열에 오르지 않을 까 싶다.

반응형