반응형
셀레니움(selenium)은 웹 애플리케이션 테스트를 위한 도구이다.
특히 웹 브라우저를 제어하여 웹페이지상에서 동작하는 테스트를 자동화 할 수 있다.
웹 상에서 정적인 페이지를 탐색하는데 사용하던 beautifulSoup 같은 패키지가 하지 못하는 동적인 크롤링을 지원한다.
동적으로 HTML을 만드는 경우
- 스크롤하거나 클릭 시 데이터가 생성되는 경우
- URL 주소가 변경되지 않았는데 데이터가 변하는 경우
- 표, 테이블 형태의 데이터
셀레니움 동작 방식
웹 페이지를 헤더 등을 가지고 HTTP 프로토콜로 통신하는 리퀘스트(requests) 방식과 달리 webdriver API를 사용해 운영체제에 설치한 크롬(Chrome) 등 브라우저를 직접 띄워 HTML 문서를 가져오는 방식으로 제어한다.
따라서 로그인이 필요한 서비스나 어떤 것을 클릭해야 보이는 정보도 웹 페이지에서 가져올 수 있다.
웹 페이지를 만들고 정상적으로 동작하는지 디버깅 자동화용으로 사용하기도 한다.
셀레니움 동작 예제
네이버 -> 네이버쇼핑 이동-> 검색어 입력 ->네이버쇼핑 상품정보 가져오기
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
import time
# 브라우저 꺼짐 방지
chrome_options = Options()
chrome_options.add_experimental_option("detach", True)
# 불필요한 에러 메시지 없애기
chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"])
# 브라우저 생성
browser = webdriver.Chrome(options=chrome_options)
# 웹 사이트 열기
browser.get('https://www.naver.com')
# 쇼핑 메뉴 클릭하기
browser.find_element(By.CSS_SELECTOR, ".service_icon.type_shopping").click()
time.sleep(2)
# 새창을 바라보게 만들기
new_window = browser.window_handles[1]
browser.switch_to.window(new_window)
# 화면 최대화
browser.maximize_window()
# 검색창 클릭
search = browser.find_element(By.CSS_SELECTOR, "input._searchInput_search_text_3CUDs")
search.click()
# 검색어 입력
search.send_keys("아이폰14")
search.send_keys(Keys.ENTER)
# 스크롤 전 높이 / window.scrollY : 현재 스크롤된 높이를 알 수 있는 자바스크립트 명령어
before_h = browser.execute_script("return window.scrollY")
# 무한 스크롤
while True:
# 맨 아래로 스크롤을 내린다. /send_keys : END 키 클릭
browser.find_element(By.CSS_SELECTOR, "body").send_keys(Keys.END)
# 스크롤 사이 페이지 로딩 시간
time.sleep(1)
# 스크롤 후 높이 after: 10 before: 0
after_h = browser.execute_script("return window.scrollY")
if after_h == before_h:
break
before_h = after_h
# 상품 정보 불러오기
items = browser.find_elements(By.CSS_SELECTOR, ".product_item__MDtDF")
for item in items:
# 상품명 가져오기
name = item.find_element(By.CSS_SELECTOR, ".product_title__Mmw2K").text
# 상품가격 가져오기
try:
price = item.find_element(By.CSS_SELECTOR, ".price_num__S2p_v").text
except:
price = "판매중단"
# 상품URL 가져오기
link = item.find_element(By.CSS_SELECTOR, ".product_title__Mmw2K > a").get_attribute('href')
print(name,price,link)
반응형
댓글