본문 바로가기
Data Science/문과생도 할 수 있는 웹크롤링

문과생도 할 수 있는 웹 크롤링 (3) - Selenium 실습 기초

by 싸코 2017. 9. 30.

지난 포스팅에서는 Selenium 사용해 크롤링 할 준비를 끝냈다. 이제는 Selenium으로 간단하게 구글 검색을 해보는 것으로 Selenium을 살펴 보고 Selenium 사용할 때 기본적으로 알아야 하는 내용들을 정리하는 것으로 Selenium 포스팅은 마치려고 한다.


2017/09/29 - [Data Science/Python] - 문과생도 할 수 있는 웹 크롤링 (1) - 웹 데이터 크롤링 준비

2017/09/29 - [Data Science/Python] - 문과생도 할 수 있는 웹 크롤링 (2) - Selenium 사용 준비


구글은 크롤링을 막기 위한 조치가 아주아주 잘 되어 있어서 파이썬으로 url의 request나 태깅을 통한 정보 접근 등의 일반적인 크롤링 방법으로는 어렵고 설령 만들었다고 하더라도 구조가 금방 바뀌기 때문에 계속 새로 만들어야 한다. Selenium은 우리가 직접 구글 검색을 하는 것과 같은 방법으로 브라우저를 제어해줄 것이기 때문에 유용하게 쓰일 수 있을 것이다.



Selenium 실습 기초

문과생도 할 수 있는 웹 크롤링 (3)


1. 간단 실습 예제 - 구글 검색
2. Selenium으로 할 수 있는 일



1. 간단 실습 예제 - 구글 검색

먼저 우리가 실습할 코드는 다음과 같다. Windows 환경의 Python 3.5>= 를 사용하고 있다. 아나콘다를 사용하는 사람은 IPython에서 쉽게 실습해 볼 수 있다. 


2017/09/27 - [Data Science/Python] - 파이썬으로 데이터 분석하자 (2) - IPython 사용하기



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from selenium import webdriver
 
#selenium의 webdriver로 크롬 브라우저를 실행한다
driver = webdriver.Chrome("chromedriver.exe 파일 위치")
 
#"Google"에 접속한다
driver.get("http://www.google.co.kr")
 
#페이지의 제목을 체크하여 'Google'에 제대로 접속했는지 확인한다
assert "Google" in driver.title
assert "Naver" in driver.title
 
#검색 입력 부분에 커서를 올리고
#검색 입력 부분에 다양한 명령을 내리기 위해 elem 변수에 할당한다
elem = driver.find_element_by_name("q")
 
#입력 부분에 default로 값이 있을 수 있어 비운다
elem.clear()
 
#검색어를 입력한다
elem.send_keys("Selenium")
 
#검색을 실행한다
elem.submit()
 
#검색이 제대로 됐는지 확인한다
assert "No results found." not in driver.page_source
 
#브라우저를 종료한다
driver.close()
cs


위의 실행을 한 줄 씩 실행하면서 selenium의 webdriver API로 어떻게 브라우저를 제어하는지 확인해 볼 것이다.



In [1]: from selenium import webdriver


In [2]: driver = webdriver.Chrome("C:/work/chromedriver.exe")



webdriver API로 Chrome 브라우저를 열었다. 필자의 크롬은 새창에서 새로 실행되었으며 "Chrome이 자동화된 테스트 소프트웨어에 의해 제어되고 있습니다."는 알림 메시지가 떠 있다. 사용하는 컴퓨터마다 실행 시간에 차이가 있기 때문에 조금만 기다려 보도록 하자.




In [3]: driver.get("http://www.google.com")



위에서 볼 수 있듯이 구글로 성공적으로 접속했다. 인터넷 환경에 따라 접속에 걸리는 시간은 조금씩 차이가 있겠지만 구글 검색이니만큼 금방 접속할 것으로 보인다.





In [4]: assert "Google" in driver.title


In [5]: assert "Naver" in driver.title

---------------------------------------------------------------------------

AssertionError                            Traceback (most recent call last)

<ipython-input-5-1d1d16c3c71a> in <module>()

----> 1 assert "Naver" in driver.title


AssertionError:


위의 코드를 통해서 페이지의 제목에 "Google"이 들어가 있으면 아무 반응이 없고 "Naver"로 해보니 AssertionError가 발생한 것을 알 수 있다. 우리는 현재 Google로 성공적으로 접속했음을 다시 확인했다. 나중에 프로그램을 만들 때는 이런 구문을 활용해서 에러가 생겼을 때의 문제를 고려하여 프로그램을 만들 것이다.




In [8]: elem = driver.find_element_by_name("q")


현재 열려 있는 창의 element의 name이 "q"인 것을 찾아서 elem 변수에 할당하라는 코드이다. 쉽게 말해서 우리가 구글에서 검색할 때 검색어를 입력하기 위해 검색창에 마우스를 클릭하는 것과 같은 행위를 코드로 하는 것이다. elem을 통해서 우리는 검색창을 마음대로 쓸 수 있다.




In [9]: elem.clear()


검색창에 default로 내용이 있는 경우가 많기 때문에 clear해주는 습관을 들이는 것이 좋다.




In [10]: elem.send_keys("Selenium")



검색창에 "Selenium"을 입력하도록 명령한 결과, 검색어가 잘 입력됐다. send_keys()에서 keys()는 Keyboard를 가리키는 말로 보통 webdriver 안에 있는 키보드를 가리키는 Keys라는 객체를 활용해서 브라우저에서 키보드를 사용할 수 있도록 한다. 이 부분은 다음에 다뤄보도록 하겠다.




In [11]: elem.submit()



짜잔! 1초 정도 기다렸더니 검색 결과가 나타났다.




In [12]: assert "No results found." not in driver.page_source


In [13]: driver.close()


검색결과가 성공적으로 나타나서 에러는 발생하지 않았다. 실습을 모두 했으니 close()로 브라우저를 종료한다.





2. Selenium으로 할 수 있는 일

Selenium을 사용하면 우리가 웹 크롤링할 때 자주 맞딱드리는 문제, "OOO 카페에 접속해서 정보를 크롤링하고 싶은데 어떻게 하죠?"를 해결할 수 있는 힌트를 제공했다. 직접 브라우저를 제어해서 포탈에 로그인할 수도 있다. 이 방법을 사용하지 않고도 할 수 있는 방법이 많지만 JavaScript와 서버 언어(php)에 대한 이해가 많이 필요하기 때문에 문과생인 우리들은 조금 느려도 Selenium으로 하는 게 좋다. HTTP와 Network에 대한 이해가 높은 문과생은 편한 방법을 사용하면 된다.


또 뭘 할 수 있을까? 특정 사이트에서 제공하는 출석체크 같은 일들을 매일매일 자동으로 해줄 수도 있을 것이다. JavaScript를 직접 동작시켜야만 출석체크 기능이 활성화되는 사이트들에 접속해서 알아서 출석체크도 매일하는 방법으로 응용해볼 수도 있다.


크롤링을 위해서 Selenium을 소개하고 있지만 Selenium의 본래 목적은 "웹 테스트의 자동화"에 있었음을 잊지 않는다면 이 개념을 이용해서 다른 많은 일들에 응용해서 다양한 작업들을 (특히 반복적으로 수행하는 작업들..)을 편하게 대신 해 줄 것이다.






여기까지 왔으면 Selenium으로 브라우저를 어떻게 제어하는지 그리고 정보에 어떻게 접근할 수 있는지 감이 왔을 것이다. 이렇게 첫 조각은 무사히(?) 맞추었다. 다음 포스트에서는 Selenium의 웹 브라우저의 제어 방법에 대해서 좀더 상세하게 설명해서 여러 상황에 응용할 수 있도록 레퍼런스를 정리하도록 하겠다.


버튼을 찾아서 클릭도하고 드래그도 하는 등의 조작 방법 말이다. 자동차로 따지면 이제 시동걸고 엑셀을 밟는 방법만을 했을 뿐이다. 후진도 하고 백미러도 조정하고 해보는 방법을 알아보는 것이다.



댓글