웹크롤링 - Selenium 과 PhantomJS를 활용한 크롤링 이해 및 실습

8. Selenium 과 PhantomJS를 활용한 크롤링 이해 및 실습

  • 브라우저를 제어해서 크롤링을 하는 방법

8.1 Selenium & PhantomJS

8.1.1 Selenium

사전준비 (Selenium 설치)
1. Selenium 인스톨: pip install selenium
2. 웹드라이버 인스톨: 웹 테스트 자동화를 위해 제공되는 툴(각 browser및 os 별로 존재)
- selenium - 테스트 코드를 사용하여 브라우져에서의 액션을 테스트할 수 있게 해주는 툴
- Firefox, chromedriver 등 각 브라우져마다 웹드라이버 다운로드 가능
+ https://sites.google.com/a/chromium.org/chromedriver/ (Chrome 브라우저용)
+ https://github.com/mozilla/geckodriver/releases (Firefox 브라우저용)

확인: 설치 디렉토리를 알아두어야 함
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

# 드라이버 생성
# chromedriver 설치된 경로를 정확히 기재해야 함
# chromedriver = 'C:/dev_python/Webdriver/chromedriver.exe' # 윈도우 
chromedriver = '/usr/local/Cellar/chromedriver/chromedriver' # 맥
driver = webdriver.Chrome(chromedriver)

# 크롤링할 사이트 호출
driver.get("http://www.python.org")

# Selenium은 웹테스트를 위한 프레임워크로 다음과 같은 방식으로 웹테스트를 자동으로 진행함 (참고)
assert "Python" in driver.title

# <input id="id-search-field" name="q" 검색창 name으로 검색하기
# 태그 name으로 특정한 태그를 찾을 수 있음
elem = driver.find_element_by_name("q")

# input 텍스트 초기화 
# elem.clear()

# 키 이벤트 전송가능함
# 태그가 input 태그이므로 입력창에 키이벤트가 전달되면, 입력값이 자동으로 작성됨
elem.send_keys("pycon")

# 태그가 input 태그이므로 엔터 입력시 form action이 진행됨
elem.send_keys(Keys.RETURN)

# Selenium은 웹테스트를 위한 프레임워크로 다음과 같은 방식으로 웹테스트를 자동으로 진행함 (참고)
assert "No results found." not in driver.page_source

# 명시적으로 일정시간을 기다릴 수 있음 (10초 기다림)
time.sleep(10)

# 크롬 브라우저 닫기 가능함
driver.quit()

8.1.2 PhantomJS

  • WebTesting을 위해 나온 화면이 존재하지 않는 브라우저
  • 터미널환경에서 동작하는 크롤러의 경우 PhantomJS 브라우저 사용 권장
사전준비 (PhantomJS 설치)
1. 윈도우: PhantomJS 다운로드 후 절적한 디렉토리에 압축을 품 (http://phantomjs.org/download.html)
2. 맥: brew install phantomjs 또는 윈도우에서 사용한 웹사이트를 활용
3. 리눅스: suto apt-get install phantomjs (한글폰트가 없다면, 추가로 sudo apt-get install -y fonts-nanum* )

확인: 설치 디렉토리를 알아둬야 함

확인 사항

다음 코드부터는 Selenium을 사용할지, PhantomJS를 사용할지를 정해서
드라이버를 생성하는 코드를 자신의 로컬 환경에 맞게 넣어주신 후에
실행을 하셔야 합니다.

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

# 드라이버 생성 방법1 (selenium)
# chromedriver = 'C:/dev_python/Webdriver/chromedriver.exe' # 윈도우 
# chromedriver = '/usr/local/Cellar/chromedriver/chromedriver' # 맥
# driver = webdriver.Chrome(chromedriver)

# 드라이버 생성 방법2 (phantomJS)
# driver = webdriver.PhantomJS('C:/dev_python/phantomjs-2.1.1-windows/bin/phantomjs.exe') # 윈도우
driver = webdriver.PhantomJS('/usr/local/Cellar/phantomjs/2.1.1/bin/phantomjs') # 맥

driver.get("http://www.python.org")

print (driver.current_url)
print (driver.title)

elem = driver.find_element_by_name("q")

# input 텍스트 초기화 
elem.clear()

# 키 이벤트 전송
elem.send_keys("python")

# 엔터 입력
elem.send_keys(Keys.RETURN)

# 스크린샷도 찍을 수 있습니다.
driver.set_window_size(1400, 1000)
elem.screenshot("pycon_event.png")
assert "No results found." not in driver.page_source

driver.quit()
https://www.python.org/
Welcome to Python.org

8.2 Selenium & PhantomJS 태그 검색 주요 함수

  • 주요 함수 - find_element_by_tag_name(), find_elements_by_tag_name()
    • find_element_by_tag_name(): 최초 발견한 태그만 가져오기
    • find_elements_by_tag_name(): 모든 태그 리스트로 가져오기
from selenium import webdriver

# driver = webdriver.PhantomJS('C:/dev_python/phantomjs-2.1.1-windows/bin/phantomjs.exe') # 윈도우
driver = webdriver.PhantomJS('/usr/local/Cellar/phantomjs/2.1.1/bin/phantomjs') # 맥
driver.get('http://v.media.daum.net/v/20170202185812986')

# 최초 발견한 태그만 검색
title = driver.find_element_by_tag_name('h3')
print (title.text)

# 모든 태그 검색
h3s = driver.find_elements_by_tag_name('h3')

for h3 in h3s:
    print (h3.text)
    
driver.quit()
'포켓몬고' 상륙 1주일.. 대한민국 곳곳이 들썩
'포켓몬고' 상륙 1주일.. 대한민국 곳곳이 들썩
많이본 뉴스
포토&TV
실시간 이슈
이 시각 추천뉴스
실시간 주요이슈
실습 (함께 작성해보는 코드)
  • 주요 함수 - find_element_by_id(), find_elements_by_id()
    • find_element_by_id(): 최초 발견한 아이디를 가진 태그만 가져오기
    • find_elements_by_id(): 아이디를 가진 모든 태그 리스트로 가져오기
from selenium import webdriver

# driver = webdriver.PhantomJS('C:/dev_python/phantomjs-2.1.1-windows/bin/phantomjs.exe') # 윈도우
driver = webdriver.PhantomJS('/usr/local/Cellar/phantomjs/2.1.1/bin/phantomjs') # 맥
driver.get('http://v.media.daum.net/v/20170202185812986')

body = driver.find_element_by_id('harmonyContainer')
print (body.text)
    
driver.quit()
지난달 24일 출시된 모바일게임 '포켓몬고'가 출시 1주일여만에 우리나라 거리 풍경을 크게 바꿔놨다. 번화가나 공원 등 거리 곳곳에서 손에 스마트폰을 들고 '포켓몬'을 사냥하는 모습을 손쉽게 찾아볼 수 있게 된 것이다.다른 국가에 비해 반년 가량 늦게 출시됐음에도 불구, 이용자 수가 700만명에 육박한 것으로 알려졌다. 우리나라 국민 10명 중 1명은 지난 1주일 사이에 한번은 포켓몬고 게임을 해봤다는 얘기다.

지역경제 활성화에도 도움이 되고 있다. 포켓몬이 자주 출몰하는 지역으로 입소문을 탄 지역 편의점 매출이 급증하는 현상도 나타났다. 지난해 여름, 강원도 속초가 '포켓몬고' 특수를 톡톡히 누린 것과 비슷한 현상이 전국 곳곳에서 나타나고 있는 것이다.

■우리 국민 10명 중 1명은 '포켓몬고' 게이머

애플리케이션(앱) 분석업체 와이즈앱은 2일 전국 2만3000명의 안드로이드 스마트폰 사용자 표본조사를 바탕으로 추정한 지난 1주일간 '포켓몬고' 이용자는 698만명이라고 발표했다. 특히 10대와 20대 이용자들이 '포켓몬고'에 열광하고 있는 것으로 나타났다. 전체 이용자의 65% 이상이 10대와 20대다.

이 게임 개발사인 나이언틱랩스가 설 연휴 직전에 출시한 전략도 제대로 맞아 떨어졌다. 지난 설 연휴, 고향에서 가족과 친지들이 모여 '포켓몬고'를 즐기는 모습이 곳곳에서 눈에 띄였다. 고속도로 휴게소 등에서도 포켓몬고 이용자들도 많았다.

전국 번화가와 공원 등 게임 내 주요 장소인 '포켓스톱'으로 지정된 곳이 많은 지역은 '포켓몬고' 게이머들로 붐볐다. 서울 노원역, 이수역, 강남역, 잠실역 등 번화가와 부산 시민공원, 대전 오월드, 제천 의림지 등 전국 주요 장소로 '포켓몬'을 찾는 이들이 몰려들었다.

지역 명소를 찾는 이들도 부쩍 늘었다. 주로 교회나 절, 조형물 등이 '포켓스톱'으로 지정돼 있기 때문에 평소에는 그냥 지나쳤던 명소를 다시 한번 돌아보게 되는 계기가 됐다는 게이머들도 많다.

업계 관계자는 "포켓스톱은 포켓몬고를 즐기기 위해 반드시 지나쳐야 하는 곳이기 때문에 평소엔 그냥 지나쳤더라도 요즘엔 멈춰서서 다시 한번 보는 경우가 많다"며 "겨울철이라 집안에만 있기 쉽지만 포켓몬고를 하기 위해 밖으로 걸어다니기 때문에 건강에도 긍정적"이라고 언급했다.

■'포켓몬고' 인기에 지역 상권도 '후광효과'

포켓몬고는 지역 상권에도 영향을 주고 있다. '포켓몬'이 자주 출몰하는 이른바 '포세권'의 편의점은 후광효과를 톡톡히 보고 있다. 포켓몬을 쫓아온 게이머들이 대거 몰리면서 휴대폰 충전기와 핫팩은 물론 음료,간식 등의 매출이 쑥쑥 오르는 상황이다.

세븐일레븐의 경우 포켓몬고 게임이 출시된 지난달 24일 이후 지난 1일까지 9일간 매출이 게임 출시 직전 9일에 비해 휴대폰 관련 용품 매출이 61.3%, 핫팩은 66.2%증가했다. 탄산음료와 컵라면,스낵과자도 같은 기간 매출이 33.5%,22%,16.3% 올랐다.

'포세권'으로 입소문을 탄 부산시민공원점도 휴대용용품과 핫팩 매출이 각각 54%, 60.5% 늘었고 간식류 매출도 10~20% 증가했다. GS25의 대전오월드점은 같은 기간 커피와 차는 매출이 420%, 휴대폰 용품과 핫팩은 각각 271%, 268% 급증했다. 라면(46%)을 비롯한 간식류 매출도 크게 늘었다.

세븐일레븐 관계자는 "포켓몬고 이용자들이 많이 몰리는 지역 점포들의 관련 상품 매출이 크게 오르고 있다"면서 "수요가 높은 상품군 위주로 재고를 늘리고 진열도 확대하는 등 포켓몬고 특수에 대응하고 있다"고 말했다.

■일부 부작용도 있어 '주의'

게임이 인기를 끌면서 일부 부작용도 나타나고 있어 이용자들의 주의가 요구된다. 출입이 금지된 구역에 등장하는 '포켓몬'을 획득하기 위해 금지구역을 넘어서거나 운전하면서 포켓몬고를 즐기는 사례가 잇따라 보고되고 있다. 해외에서도 '포켓몬고' 출시 당시 이런 부작용이 속출했는데 우리나라도 비슷한 현상을 겪고 있는 것이다.

나이언틱랩스는 특정 속도 이상 빠르게 움직이면 '포켓몬'을 사냥할 수 없도록 하고 게임 도중 출입금지 구역에 가지 말라고 여러차례 공지하고 있다.

jjoony@fnnews.com 허준 이환주 기자
※ 저작권자 ⓒ . 무단 전재-재배포 금지
  • 주요 함수 - find_element_by_name(), find_elements_by_name()
    • find_element_by_name(): 최초 발견한 태그 안에 name 값이 같은 태그 가져오기
    • find_elements_by_name(): 태그 안에 name 값이 같은 태그 모두 리스트로 가져오기