안녕하세요 펭귄 교수입니다.
이번이 웹과 파이썬 강의 마지막 편이 되겠네요.
이번에는 동적 크롤링을 위한 라이브러리, Selenium에 대한 강의입니다.
Selenium
Selenium은 2004년 시카고에서 처음 개발이 시작된 자동화 프레임워크입니다.
아파치 라이센스를 가지고 있고, 자바, C#, R, 파이썬 등 다양한 언어를 지원합니다.
브라우저 플랫폼을 사용하여 자동화를 진행하고, 지원하는 브라우저는 크롬, 인터넷 익스플로러, 마이크로소프트 엣지, 사파리, 오페라가 있습니다.
설치
저희는 크롬 드라이버를 사용해보겠습니다.
그러기 위해 먼저 크롬의 버전을 확인합니다.
우측 3개 점을 클릭, 도움말 -> Chrome 정보 에 들어갑니다.
버전에 맞는 다운로드 링크
다운로드된 드라이버는 사용할 파이썬 파일과 같은 경로에 넣습니다.
파이썬 라이브러리 설치
pip install selenium
사용법
기초 사용법
from selenium import webdriver
driver = webdriver.Chrome()
url = 'https://www.google.com'
driver.get(url)
페이지 정보
title = driver.title # 페이지 타이틀
url = driver.current_url # 현재 URL
# 창 크기 설정
width = 1920
height = 1080
driver.set_window_size(width, height)
원하는 태그 찾기
이전 Beautiful Soup과 동일하게 Css Selector 방식, XPath 방식 등으로 요소, 태그들을 찾을 수 있습니다.
from selenium.webdriver.common.by import By
# 단일 요소 찾기 (find_element)
driver.find_element(By.CSS_SELETOR, 'SELECTOR')
driver.find_element(By.XPATH, 'SELECTOR')
# 여러 개 찾기 (find_elements)
driver.find_elements(By.CSS_SELETOR, 'SELECTOR')
driver.find_elements(By.XPATH, 'SELECTOR')
이전 자료들을 보면
find_element_by_css_selector, find_element_by_xpath 와 같은 메서드를 사용했는데 현재 버전에서는 해당 메서드들이 삭제된 것으로 보입니다.
그래서 By 객체를 사용해서 해당 기능을 구현했습니다.
By객체에 있는 요소는 다음과 같습니다.
- ID
- XPATH
- LINK_TEXT
- PARTIAL_LINK_TEXT
- NAME
- TAG_NAME
- CLASS_NAME
- CSS_SELECTOR
적재적소에 잘 사용하는 것이 필요합니다.
로딩 대기
몇몇 페이지들은 로드하는 데 시간이 걸려 대기할 필요가 있습니다.
암묵적 대기, 명시적 대기에 대해 알려드리겠습니다.
# Implicit Waits (암묵적 대기)
driver.implicitly_wait(time_ti_wait=5) # seconds
# Explicit Waits (명시적 대기)
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get(url='https://www.google.com/')
try:
element = WebDriverWait(driver, 5).until(
EC.presence_of_element_located((By.CLASS_NAME, 'class_name'))
)
print(element)
finally:
driver.quit()
키 입력하기
input 등 입력이 필요할 때는 아래와 같은 방식으로 사용하면 됩니다.
driver.find_element(By.CLASS_NAME, "class_name").send_keys("key")
화면 조작
# 클릭
driver.find_element(By.CLASS_NAME, "class_name").click()
# 옵션 선택
from selenium.webdriver.support.ui import Select
select = Select(driver.find_element(By.NAME, 'select_name'))
## 선택
select.select_by_index(index=2)
select.select_by_visible_text(text="option_text")
select.select_by_value(value='고리오')
## 선택 해제
select.deselect_by_index(index=2)
select.deselect_by_visible_text(text="option_text")
select.deselect_by_value(value='고리오')
## 제출
submit_btn.submit()
# 드래그 앤 드랍
from selenium.webdriver import ActionChains
action_chains = ActionChains(driver)
action_chains.drag_and_drop(source, target).perform()
# Javascript 코드 실행
driver.execute_script("alert('창 실행')")
# 뒤로 가기, 앞으로 가기
driver.forward()
driver.back()
# 스크린샷 저장
driver.save_screenshot('screenshot.png')
# 특정 요소 스크린샷 저장
map = driver.find_element(By.CLASS_NAME, 'class_name')
map.screenshot('map.png')
쿠키 (Cookie)
driver.add_cookie({"name": "cookie"}) # 쿠키 설정
cookie = driver.get_cookie("test1") # 쿠키 가져오기
all = driver.get_cookies() # 모든 쿠키 가져오기
driver.delete_cookie("test1") # 쿠키 삭제
driver.delete_all_cookies() # 모든 쿠키 삭제
크롬 옵션 (Chrome Option)
options = webdriver.ChromeOptions()
options.add_argument("headless") # 백그라운드 실행 옵션
options.add_argument('--window-size= x, y') #브라우너 크기 지정
options.add_argument('--start-maximized') # 크기 최대화
options.add_argument('--blink-settings=imagesEnabled=false') # 이미지 로딩 하지 않음
options.add_argument('incognito') # 시크릿 모드
driver = webdriver.Chrome(options=options)
참조
'프로그래밍 > Python' 카테고리의 다른 글
[파이썬 코딩 강의] 데이터베이스와 파이썬 : 기본 개념 (0) | 2024.10.16 |
---|---|
[파이썬 코딩 강의] 웹과 파이썬 (Beautiful Soup 편) (1) | 2024.10.03 |
[파이썬 코딩 강의] 웹과 파이썬 (requests 편) (0) | 2024.09.28 |
[파이썬 코딩 강의] 객체 지향 언어 (1) | 2024.09.26 |
[파이썬 코딩 강의] 클래스와 메서드 (0) | 2024.09.21 |