0%

Selenium 설치하기 및 크롤링 예제

들어가기

python으로 크롤링을 할 때, 크롤링 대상인 웹 페이지에 동적인 동작을 곁들여서 크롤링을 할 수 있게 도와주는 라이브러리가 있는데, 그것이 selenium 이다.

selenium 장점

  • 웹 드라이버를 사용해서 웹 페이지를 동적크롤링 할 수 있다. 크롤링 결과의 특정 html 엘리먼트에 마우스 클릭를 발생시키거나 , input 엘리먼트에 텍스트를 채워넣기 등이 가능하다.

beautifulsoup, scrapy로는 특정 페이지에 동적인 이벤트를 가해서 크롤링을 할 수 없다.

예를 들어 10페이지 게시판을 크롤링 하려면, beautifulsoup에서는 페이지당 각각 url을 사용해서 크롤링 해야 하지만, selenium은 게시판 페이지를 크롤링 한 뒤, 다음 페이지 버튼을 찾아서 마우스 클릭하여 다음페이지로 이동해서 크롤링을 할 수 있다.

사실 selenium만으로 동적으로 크롤링을 하는 것은 아니다.

web driver라는 가상의 브라우저 프로그램(원래는 일종이 웹 테스트 도구라고 한다.)과 연동해서 위 기능을 구현 할 수 있다.

대충 아래와 비슷한 구조이다.

Selenium에 Chrom web driver를 연동해서 크롤링을 하면, Selenium는 가상 브라우저인 Chrom web driver를 통해 웹서버 응답을 받는다.

Selenium는 web driver를 제어 할 수 있으므로, 코드를 통해서 렌더링 결과물에 이벤트를 발생 시키고, 그에 대한 응답 결과를 받아 볼 수 있다.

Selenium%20c103ada3648f4a389a9322d760ad1e9a/Untitled.png

web driver종류가 여러개 있는것 같지만, 난 Chrome web driver를 사용할 예정이다.

Selenium을 windows10환경에 설치해보자.

실습환경

  • windows10(64bit)
  • anaconda(32bit)

Selenium 설치

셀레니움 설치 명령어

아래 두가지 방법 중 원하는 방법으로 설치하자.

1
2
pip install selenium     # pip 로 설치하는 방법
conda install selenium # conda로 설치하는 방법

난 conda를 사용해서 설치해보겠다.

Selenium%20c103ada3648f4a389a9322d760ad1e9a/Untitled%201.png

selenium을 설치는 간단하게 진행 될 것이다.

이제 앞서 언급한 webdirver를 설치해보자.

Chrome web driver 설치

브라우저에서 아래 페이지를 열자.

1
https://sites.google.com/a/chromium.org/chromedriver

Selenium%20c103ada3648f4a389a9322d760ad1e9a/Untitled%202.png

Current stable release링크를 클릭하자.

아래 페이지로 이동하는데, win32 버전 zip 파일을 클릭해서 다운 받자.

Selenium%20c103ada3648f4a389a9322d760ad1e9a/Untitled%203.png

압축파일을 다운로드 하고, 파일 압축을 풀어보면 아래처럼 chromedirver.exe라는 실행 파일이 보일 것이다.

크롤링을 할때 selenium에서 chromedirver.exe파일을 가져와서 사용하게 된다.

따라서 파이썬 스크립트에서 chromedirver.exe파일의 경로를 입력하게 된다.

Selenium%20c103ada3648f4a389a9322d760ad1e9a/Untitled%204.png

위 파일을 스크립트에서 반복적으로 사용하므로 관리하기 쉽게, C 드라이브에 옮겨놓다.

1
C:\dev_python\Webdriver\chromedirver.exe

Selenium%20c103ada3648f4a389a9322d760ad1e9a/Untitled%205.png

크롬 웹 드라이버 까지 셋팅을 마쳤다.

이제 간단한 예제를 이용해서 selenium으로 크롤링을 해보자.

Selenium 크롤링 실습(chromedriver사용)

일단 기본적인 코드를 보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from selenium import webdriver

# selenium에서 사용할 웹 드라이버 절대 경로 정보
chromedriver = 'C:\dev_python\Webdriver\chromedriver.exe'
# selenum의 webdriver에 앞서 설치한 chromedirver를 연동한다.
driver = webdriver.Chrome(chromedriver)
# driver로 특정 페이지를 크롤링한다.
driver.get('https://auto.naver.com/bike/mainList.nhn')

print("+" * 100)
print(driver.title) # 크롤링한 페이지의 title 정보
print(driver.current_url) # 현재 크롤링된 페이지의 url
print("바이크 브랜드 크롤링")
print("-" * 100)

긱본적인 구조는 위와 같다. 파이썬 답게 아주 간결하고 이해하기 쉽다.

어떤 페이지를 크롤링 하더라도 위 코드는 반복적으로 사용하게 될 것이다.

실습으로 크롤링 할 페이지는 네이버의 바이크 페이지이다.

왼쪽 상단의 바이크 제조사 정보를 크롤링 한다고 가정해보자.

그런데 지금 화면에 보이는 것은 6개이다. 전체 제조사를 클릭해야 모든 바이크 정보를 추출 할 수 있다.

Selenium%20c103ada3648f4a389a9322d760ad1e9a/Untitled%206.png

일단 전체 제조사 버튼을 클릭해보자.

아까 보다는 많은 제조사 리스트가 나오지만, 다음 페이지가 존재한다.

다음 페이지도 눌러보자.

Selenium%20c103ada3648f4a389a9322d760ad1e9a/Untitled%207.png

두번째 패이지도 둘러보자. 아래를 보니 두번째 페이지가 끝이다.

Selenium%20c103ada3648f4a389a9322d760ad1e9a/Untitled%208.png

위의 페이지를 확인 했을 때, 모든 바이크 제조사 정보를 크롤링 하기 위해서는 다음과 같은 절차가 필요하다.

  1. 일단 https://auto.naver.com/bike/mainList.nhn 로 이동한다.
  2. 크롤링 결과에서 전체 제조사 엘리멘트를 찾아서 마우스 클릭하고 그 결과물을 받아온다.
  3. 바이크 제조사 정보를 크롤링 한다.
  4. 다음 페이지 버튼이 활성화 되어 있다면 클릭하고 그 결과물을 받아온다.(추가 제조사 정보 있음)
  5. 다음 페이지 버튼이 비 활성화 되어 있다면 크롤링을 중지한다.(더이상 제조사 정보 없음)

위와 같은 크롤링을 하기에는 beautifulsoup, scrapy 만으로는 무리가 있다.

selenium은 webdriver라는 일종의 테스트 가상 브라우저를 사용해서 위와 같은 일련의 프로그래밍 동작을 수행함으로, 동적으로 페이지를 크롤링 할 수 있다.

네이버 바이크에서 바이크 제조사 크롤링 예제

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
from selenium import webdriver
import time

chromedriver = 'C:\dev_python\Webdriver\chromedriver.exe'
driver = webdriver.Chrome(chromedriver)

driver.get('https://auto.naver.com/bike/mainList.nhn')

print("+" * 100)
print(driver.title)
print(driver.current_url)
print("바이크 브랜드 크롤링")
print("-" * 100)

# 바이크 제조사 전체 페이지 버튼 클릭
bikeCompanyAllBtn = driver.find_element_by_css_selector("#container > div.spot_main > div.spot_aside > div.tit > a")
bikeCompanyAllBtn.click()

time.sleep(3)

# 바이크 제조사 1번 페이지 진입해서 바이크 리스트 추출
allBikeCompanyElement = driver.find_elements_by_css_selector(
"#_vendor_select_layer > div > div.maker_group div.emblem_area > ul > li")

# 바이크 첫 페이지 크롤링
for item in allBikeCompanyElement:
bikeComName = item.find_element_by_tag_name("span").text
if (bikeComName != ''):
print("바이크 회사명:" + bikeComName)
ahref = item.find_element_by_tag_name("a").get_attribute("href")
print('네이버 자동차 바이크제조사 홈 sub url:', ahref)
imgUrl = item.find_element_by_tag_name("img").get_attribute("src")
print('바이크 회사 엠블럼:', imgUrl)

time.sleep(3)

# 바이크 제조사 리스트의 다음 페이지 버튼을 찾아서 클릭하자.
nextBtn = driver.find_element_by_css_selector(
"#_vendor_select_layer > div > div.maker_group > div.rolling_btn > button.next")
# 다음 바이크 제조사 페이지 버튼이 활성화 여부
isExistNextPage = nextBtn.is_enabled()

if (isExistNextPage == True):
print("다음 페이지 존재함=======================================>")
nextBtn.click()
allBikeCompanyElement = driver.find_elements_by_css_selector(
"#_vendor_select_layer > div > div.maker_group div.emblem_area > ul > li")
for item in allBikeCompanyElement:
bikeComName = item.find_element_by_tag_name("span").text
if (bikeComName != ''):
print("바이크 회사명:" + bikeComName)
ahref = item.find_element_by_tag_name("a").get_attribute("href")
print('네이버 자동차 바이크제조사 홈 sub url:', ahref)
imgUrl = item.find_element_by_tag_name("img").get_attribute("src")
print('바이크 회사 엠블럼:', imgUrl)

# 크롤링이 끝나면 webdriver 브라우저를 종료한다.
# driver.quit()

위 스크립트는 완벽하게 동작하는 전체 코드이다. 코드가 워낙 쉬어서 대충 보면 어떻게 동작하는지 이해가 될 것이다.

selenium api를 찾아보면 다양하게 엘리먼트를 추출하는 방법과, 추출한 엘리멘트에 어떠한 이벤트를 날릴수 있는 알 수 있다.(이글에서는 생략한다. 나도 잘 모르고, 구글링이 왕도이다)

위 코드의 실행 결과는 아래 와 같다.

아래처럼 크롤링 결과물이 출력된다.

특의 한 점은 webdriver라는 것이 일종의 웹 테스트 자동화 도구라고 말했듯이, webdriver가 제어하는 브라우저가 아래처럼 뜨고, 이벤트에 대한 동작이 해당 브라우저에 반영되어 실시간 관찰 할 수 있다. 위 코드 마지막 주석 driver.quit() 를 해제하면 크롤링이 끝난 뒤 해당 브라우저를 자동으로 종료 할 수 있다.

Selenium%20c103ada3648f4a389a9322d760ad1e9a/Untitled%209.png

마무리

간단하게 selenium, webdriver를 사용해서 동적으로 웹페이지를 크롤링 해보았다.

사실 위 실습에서 사용한 네이버 바이크 페이지를 개발자 도구로 보면, 위 처럼 버튼을 굳이 찾아서 클릭하고 크롤링 할 필요가 없다. (위 예제를 돌리고 나서 알게 되었다. 그냥 화면에 안보일 뿐 첫 페이지의 모든 제조사 정보가 있었음. 멍청한…)

위 예제를 돌려보면, webdriver에 의해 열리는 브라워창이 좀 애매하다.

만약 디버깅 용도라면, 괜찮지만 실제 크롤링 서비스를 돌릴 때 저렇게 브라우저가 열릴 필요가 없기 때문이다.

selenium에서는 headless 방식으로 브라우저가 실제 열리지 않고 크롤링이 가능하다고 한다.(phantomJS라는 비슷한 기술도 있다고 한다.)

이 것도 나중에 시간이 되면 한번 공부해 봐야 겠다.