반응형

파이썬을 이용한 selenium 사용법 및 동적 웹 스크래핑

반응형

| selenium(셀레늄)이란


selenium은 주로 웹앱을 테스트하는 웹 프레임워크입니다. 또한 webdriver의 API를 통해 브라우저를 제어하기 때문에 자바스크립트에 의해 동적으로 생성되는 사이트의 데이터를 크롤링할 때 매우 유용하게 사용되는 스크래핑 도구입니다.


| selenium 사용법


selenium은 크롬이나 파이어폭스같은 각 브라우져의 webdriver API를 통해 브라우져를 제어합니다. 따라서 자신이 쓰고자 하는 브라우져의 driver를 다운로드받아서 Java나 C#, Python 같은 프로그래밍 언어를 통해 제어하는 것이 일반적입니다. 여기서는 크롬을 기준으로 사용법을 설명할 예정입니다.


driver를 다운로드 받을 수 있는 곳은 아래와 같습니다. 여기서 주의해야 할 점은 크롬 브라우져의 버전에 맞는 driver를 다운로드 받아야 한다는 것입니다. 브라우져 버전은 메뉴 => 도움말 => Chrome 정보에서 확인할 수 있습니다.


https://chromedriver.chromium.org/downloads


| 파이썬을 통한 selenium 사용법 및 동적 사이트 크롤링 방법


자바스크립트에 기반인 동적 사이트인 네이버 데이터랩의 데이터를 크롤링하는 것을 보여드리겠습니다. 여기서 크롤링할 데이터는 현재 패션의류 검색어 TOP20인 리스트들입니다.



위 TOP20 리스트들은 아래와 같은 자바스크립트에 의해 동적으로 생성된 페이지의 요소에 위치해 있습니다.




프로젝트 구조

|   chromedriver.exe
| selenium-example.py

프로젝트 구조는 어떻게 파이썬을 통해 동적 사이트를 크롤링 할 지 보여주기 위해 단순히 하나의 파이썬 파일과 크롬 드라이버만 가지고 있습니다.


selenium-example.py

import time

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.wait import WebDriverWait

options = Options()
options.headless = True
browser = webdriver.Chrome(executable_path="./chromedriver.exe", options=options)
browser.get("https://datalab.naver.com/shoppingInsight/sCategory.naver")

time.sleep(3)
tag_names = browser.find_element_by_css_selector(".rank_top1000_list").find_elements_by_tag_name("li")
for tag in tag_names:
print(tag.text.split("\n"))

  • 위 코드를 실행하기 위해서는 chromedriver가 설치되어 있어야함 과 동시에 selenium 패키지가 설치되어 있어야 합니다.
  • Options() 객체를 생성하고 그 정보를 Chrome 드라이버 옵션에 넣는 것을 보실 수 있을 겁니다. 주목해야할 점은 options.headless 옵션입니다. 이것은 브라우져를 렌더링하지 않고 메모리 상에서만 작업이 이루어지도록 하기 위한 옵션입니다. 이 옵션이 추가되지 않았을 때는 PhantomJS를 통해 작업을 했었지만 selenium이 이 옵션을 지원하기 시작함에 따라 PhantomJS는 사장되었습니다.
  • time.sleep(3) 코드는 자바스크립트에 의해 페이지 로딩이 완전히 이루어질 때까지 기다리기 위해 삽입하였습니다. 이 방법 외에 WebDriverWait 객체의 expected_conditions 메서드를 통해 해당 요소가 완전히 로딩될때까지 기다리는 방법이 있습니다. 하지만 이 방법은 우아하지만 웹페이지마다 이 조건을 충족시키기가 굉장히 까다로울 때가 있습니다. 따라서 time.sleep 메서드로 잠깐 로딩될 때까지 멈추는 것도 투박하지만 심플한 솔루션이 될 수 있습니다. expected_condition을 통한 방법은 추후에 다른 포스팅에서 다루도록 하겠습니다.
  • find_element_by_css_selector 메서드 및 find_elements_by_tag_name 메서드를 통해 선택하고자 하는 TOP 리스트들이 모여있는 <li>들을 선택하는 것을 볼 수 있습니다. webdriver를 통해서 selenium은 css 및 tag를 통해 해당 요소들을 선택할 수 있는 메서드를 제공합니다.


| 결과화면

['1', '원피스']
['2', '가을원피스']
['3', '블라우스']
['4', '후드집업']
['5', '롱원피스']
['6', '나이키바람막이']
['7', '맨투맨']
['8', '나이키맨투맨']
['9', '트렌치코트']
['10', '하객원피스']
['11', '셔츠원피스']
['12', '트위드자켓']
['13', '나이키후드집업']
['14', '후리스']
['15', '니트원피스']
['16', '가디건']
['17', '셀프웨딩드레스']
['18', '레오파드스커트']
['19', '라쉬반']
['20', '써스데이아일랜드원피스']


반응형

이 글을 공유하기

댓글

Designed by JB FACTORY