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

본 자료를 온라인 강의로도 익힐 수 있습니다. (Scrapy와 Selenium 정복)

보강된 자료로, 쉽게, 필요한 배경지식까지 빠르게 익힐 수 있도록 만들었습니다.

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 브라우저용)

확인: 설치 디렉토리를 알아두어야 함
In [1]:
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를 사용할지를 정해서
드라이버를 생성하는 코드를 자신의 로컬 환경에 맞게 넣어주신 후에
실행을 하셔야 합니다.

본 자료를 온라인 강의로도 익힐 수 있습니다. (Scrapy와 Selenium 정복)

보강된 자료로, 쉽게, 필요한 배경지식까지 빠르게 익힐 수 있도록 만들었습니다.

In [7]:
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(): 모든 태그 리스트로 가져오기
In [19]:
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(): 아이디를 가진 모든 태그 리스트로 가져오기
In [ ]:
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()
  • 주요 함수 - find_element_by_name(), find_elements_by_name()
    • find_element_by_name(): 최초 발견한 태그 안에 name 값이 같은 태그 가져오기
    • find_elements_by_name(): 태그 안에 name 값이 같은 태그 모두 리스트로 가져오기