[데이터 크롤링] Selenium with Python
이 글은 파이썬에서 셀레니움(Selenium)을 사용하는 방법에 관한 기록입니다.
1. Import Library
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait
2. Settings
from selenium import webdriver
path = 'chromedriver가 존재하는 경로'
url = '크롤링 하고자 하는 웹사이트 url'
# 브라우저 생성
driver = webdriver.Chrome(path)
# 브라우저에 url 호출
driver.get(url)
# 현재 url 반환
driver.current_url
# 브라우저 종료
drver.quit()
3. Locating Elements : 요소 선택
find_element_by_XXXX
메소드는 조건과 일치하는 요소 한 개를, find_elements_by_XXXX
메소드는 조건과 일치하는 요소 여러 개를 선택합니다.
driver.find_element_by_id
:id
속성으로 일치하는 요소 선택하기driver.find_element_by_name
:name
속성으로 일치하는 요소 선택하기driver.find_element_by_tag_name
: 태그명으로 일치하는 요소 선택하기driver.find_element_by_class_name
: 클래스명으로 일치하는 요소 선택하기driver.find_element_by_xpath
: XPath로 일치하는 요소 선택하기driver.find_element_by_css_selector
: CSS Selector로 일치하는 요소 선택하기driver.find_element_by_link_text
: 태그<a>
내href
속성으로 일치하는 요소 선택하기-
driver.find_element_by_partial_link_text
: 태그<a>
내href
속성으로 일치하는 요소 선택하기 driver.find_elements_by_name
:name
속성으로 일치하는 모든 요소 선택하기driver.find_elements_by_tag_name
: 태그명으로 일치하는 모든 요소 선택하기driver.find_elements_by_class_name
: 클래스명으로 일치하는 모든 요소 선택하기driver.find_elements_by_xpath
: XPath로 일치하는 모든 요소 선택하기driver.find_elements_by_css_selector
: CSS Selector로 일치하는 모든 요소 선택하기driver.find_elements_by_link_text
: 태그<a>
내href
속성으로 일치하는 모든 요소 선택하기driver.find_elements_by_partial_link_text
: 태그<a>
내href
속성으로 일치하는 모든 요소 선택하기
4. Interacting with the page : 상호작용
키보드 입력
키보드를 입력하고자 할 때에는 send_keys()
메소드를 사용할 수 있습니다. send_keys()
메소드는 문자열 또는 Keys
모듈을 활용한 것을 입력으로 받습니다.
from selenium.webdriver.common.keys import Keys
element.send_keys('QUERY')
element.send_keys(Keys.RETURN)
Keys
모듈은 키보드 자판에서 텍스트 이외의 특수문자를 입력할 수 있도록 지원합니다. 사용할 수 있는 키보드 자판 특수문자는 다음과 같습니다.
- Keys.NULL = ‘\ue000’
- Keys.CANCEL = ‘\ue001’ # ^break
- Keys.HELP = ‘\ue002’
- Keys.BACKSPACE = ‘\ue003’
- Keys.BACK_SPACE = BACKSPACE
- Keys.TAB = ‘\ue004’
- Keys.CLEAR = ‘\ue005’
- Keys.RETURN = ‘\ue006’
- Keys.ENTER = ‘\ue007’
- Keys.SHIFT = ‘\ue008’
- Keys.LEFT_SHIFT = SHIFT
- Keys.CONTROL = ‘\ue009’
- Keys.LEFT_CONTROL = CONTROL
- Keys.ALT = ‘\ue00a’
- Keys.LEFT_ALT = ALT
- Keys.PAUSE = ‘\ue00b’
- Keys.ESCAPE = ‘\ue00c’
- Keys.SPACE = ‘\ue00d’
- Keys.PAGE_UP = ‘\ue00e’
- Keys.PAGE_DOWN = ‘\ue00f’
- Keys.END = ‘\ue010’
- Keys.HOME = ‘\ue011’
- Keys.LEFT = ‘\ue012’
- Keys.ARROW_LEFT = LEFT
- Keys.UP = ‘\ue013’
- Keys.ARROW_UP = UP
- Keys.RIGHT = ‘\ue014’
- Keys.ARROW_RIGHT = RIGHT
- Keys.DOWN = ‘\ue015’
- Keys.ARROW_DOWN = DOWN
- Keys.INSERT = ‘\ue016’
- Keys.DELETE = ‘\ue017’
- Keys.SEMICOLON = ‘\ue018’
-
Keys.EQUALS = ‘\ue019’
- Keys.NUMPAD0 = ‘\ue01a’
- Keys.NUMPAD1 = ‘\ue01b’
- Keys.NUMPAD2 = ‘\ue01c’
- Keys.NUMPAD3 = ‘\ue01d’
- Keys.NUMPAD4 = ‘\ue01e’
- Keys.NUMPAD5 = ‘\ue01f’
- Keys.NUMPAD6 = ‘\ue020’
- Keys.NUMPAD7 = ‘\ue021’
- Keys.NUMPAD8 = ‘\ue022’
- Keys.NUMPAD9 = ‘\ue023’
- Keys.MULTIPLY = ‘\ue024’
- Keys.ADD = ‘\ue025’
- Keys.SEPARATOR = ‘\ue026’
- Keys.SUBTRACT = ‘\ue027’
- Keys.DECIMAL = ‘\ue028’
-
Keys.DIVIDE = ‘\ue029’
- Keys.F1 = ‘\ue031’
- Keys.F2 = ‘\ue032’
- Keys.F3 = ‘\ue033’
- Keys.F4 = ‘\ue034’
- Keys.F5 = ‘\ue035’
- Keys.F6 = ‘\ue036’
- Keys.F7 = ‘\ue037’
- Keys.F8 = ‘\ue038’
- Keys.F9 = ‘\ue039’
- Keys.F10 = ‘\ue03a’
- Keys.F11 = ‘\ue03b’
-
Keys.F12 = ‘\ue03c’
- Keys.META = ‘\ue03d’
- Keys.COMMAND = ‘\ue03d’
입력한 것을 지우고자 할 때에는 clear()
메소드를 사용할 수 있습니다.
element.clear()
Click
어떠한 요소를 클릭하고자 할 때에는 click()
메소드를 사용합니다.
element.click()
Select box
Select
를 통해 select box를 다룰 수 있습니다.
from selenium.webdriver.support.ui import Select
selectbox = Select(driver.find_element_by_xpath('SELECT_BOX_XPATH'))
# 선택하기
selectbox.select_by_index('INDEX')
selectbox.select_by_value('VALUE')
selectbox.select_by_visible_text('TEXT')
# 선택해제하기
selectbox.deselect_by_index('INDEX')
selectbox.deselect_by_value('VALUE')
selectbox.deselect_by_visible_text('TEXT')
selectbox.deselect_all()
Drag and Drop
ActionChains
모듈의 drag_and_drop
메소드는 source 요소에서 target 요소로 drag 및 drop을 할 수 있도록 합니다.
from selenium.webdriver import ActionChains
source = driver.find_element_by_name('SOURCE')
target = driver.find_element_by_name('TARGET')
action_chains = ActionChains(driver)
action_chains.drag_and_drop(source, target).perform()
5. Handling Webpage
웹페이지에서 가능한 다음 페이지로 이동, 이전 페이지로 이동, 웹페이지 내 스크롤 등의 작업을 수행할 수 있습니다.
driver.forward()
: 다음 페이지로 이동하기 (앞으로 가기)driver.back()
: 이전 페이지로 이동하기 (뒤로 가기)driver.execute_script('window.scrollTo(0, document.body.scrollHeight);')
: 웹페이지 내 최하단까지 스크롤 하여 맨 밑으로 내려가기ActionChains(driver).move_to_element(element).perform()
: 웹페이지 내element
까지 스크롤 하여 특정 요소까지 내려가기
6. Chrome Options
브라우저에 관하여 여러가지 옵션을 설정할 수 있습니다. 사용할 수 있는 옵션들은 다음과 같습니다.
# 옵션 생성
options = webdriver.ChromeOptions()
# 옵션 추가
options.add_argument('headless') # 크롬 브라우저를 띄우지 않도록 설정
options.add_argument('window-size=1920x1080') # 브라우저 창 크기 설정
options.add_argument('lang=ko_KR') # 언어 설정
options.add_argument('disable-gpu') # GPU를 사용하지 않도록 설정
options.add_argument('disable-infobars')
options.add_argument('--disable-extensions')
options.add_experimental_option('excludeSwitches', ['enable-automation'])
options.add_experimental_option('useAutomationExtension', False)
options.add_argument('--disable-blink-features=AutomationControlled')
options.add_experimental_option('debuggerAddress', '127.0.0.1:9222')
# 브라우저 옵션을 적용하여 드라이버 생성
driver = webdriver.Chrome(path, options=options)
댓글남기기