Selenium 라이브러리의 본래 목적은 웹 사이트의 기능들이 정상적으로 작동하는지 테스트하기 위함입니다.
그 과정에서 명령어들을 실행함으로써 특정 이벤트를 발생시키는데 이러한 기능들은 데이터를 크롤링 할 때 사용될 수 있습니다.
자세한 내용은 공식문서를 통해 확인하고 그렇다면 지금부터 Selenium을 사용해보겠습니다.
pip install selenium
Chrome 웹 드라이버 생성하기
from selenium import webdriver
# 크롬 드라이버 객체 인스턴스화
driver = webdriver.Chrome()
driver.get('https://www.naver.com')
driver.quit()
- get 메서드 (인수로 전달받은 URL 주소를 갖는 웹 사이트에 접속)
- quit 메서드 (드라이버의 동작을 종료)
우선 크롬 드라이버 객체를 인스턴스화 합니다.
인스턴스화 한 객체에 URL 주소를 전달하면 해당 웹 세이트에 원격으로 접속합니다.
드라이버 객체를 통해 크롬 브라우저를 제어할 수 있게 되는 것입니다.
작업이 끝나면 반드시 드라이버의 실행을 종료해야 합니다.
(리소스가 낭비될 수 있기 때문입니다 😅)
코드를 실행하면 브라우저 창에 'Chrome이 자동화된 테스트 소프트웨어에 의해 제어되고 있습니다.' 문구가 표시됩니다.
기본 동작
✅ 브라우저 창 크기 설정
# 화면 최대 크기 설정
driver.maximize_window()
# 화면 최소 크기 설정
driver.minimize_window()
# 화면 크기 직접 설정
driver.set_window_size(600, 600)
✅ 페이지 새로고침
driver.refresh()
✅ 페이지 이동
# 뒤로 가기
driver.back()
# 앞으로 가기
driver.forward()
✅ 요소 선택 & 클릭
from selenium.webdriver.common.by import By
target_element = driver.find_element(By.CSS_SELECTOR, '<선택자>')
target_element.click()
- find_element 메서드 (웹 페이지 요소를 선택)
- click 메서드 (선택한 웹 페이지 요소를 클릭)
By 클래스를 반드시 import 해야합니다.
✅ 새 탭 생성
driver.execute_script('window.open("https://www.naver.com")')
- execute_script 메서드 (인수로 전달한 자바스크립트 코드를 실행)
새로운 탭을 열기 위해서는 자바스크립트 코드를 실행하는 메서드인 execute_script 메서드를 사용합니다.
인수로 특정 사이트의 URL을 전달하면 새로운 탭에서 해당 사이트가 열립니다.
✅ 탭 이동
# 인덱스가 0인 탭으로 이동
driver.switch_to.window(driver.window_handles[0])
# 인덱스가 1인 탭으로 이동
driver.switch_to.window(driver.window_handles[1])
브라우저에 열려 있는 서로 다른 탭으로 이동이 가능합니다.
✅ 탭 닫기
# 현재 브라우저에 열려 있는 탭 닫기
driver.close()
# 브라우저의 모든 탭 닫기
driver.quit()
모든 작업을 마치면 quit 메서드를 사용해 모든 탭을 닫는 것이 좋습니다.
화면 스크롤
✅ 스크롤 높이
driver.execute_script('return document.body.scrollHeight')
자바스크립트 코드를 위와 같이 execute_script 메서드에 전달하면 현재 열려 있는 페이지에서 스크롤 가능한 총 높이(길이)를 확인할 수 있습니다.
✅ 화면 이동
# 화면 최상단으로 이동
driver.execute_script('window.scrollTo(0, 0)')
# 화면 최하단으로 이동
driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')
window.scrollTo() 웹 API를 사용하는 자바스크립트 코드를 전달하면 페이지 내 특정 위치로 이동이 가능합니다.
위 코드를 실행하면 화면 최하단으로 스크롤 이동합니다.
from selenium.webdriver import ActionChains
target = driver.find_element(By.CSS_SELECTOR, <CSS selector>)
action = ActionChains(driver)
action.move_to_element(target).perform()
HTML 파일 내 특정 태그의 위치로 이동하는 방법도 있습니다.
다음의 단계를 따르면 됩니다.
- 우선 find_element 메서드로 기준 태그를 선택합니다.
- 인스턴스화를 마친 action 객체의 move_to_element 메서드를 사용해 기준 태그가 위치한 지점으로 이동합니다.
✅ 화면 캡쳐
driver.save_screenshot(<저장 경로>)
save_screenshot 메서드를 사용하면 현재 화면을 캡쳐해 스크린샷을 생성합니다.
검색어 입력
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('https://www.naver.com')
# 네이버 검색창에 검색어 입력
input_element = driver.find_element(By.CSS_SELECTOR, '#query')
input_element.clear()
input_element.send_keys('파이썬')
# 검색 수행
search_btn = driver.find_element(By.CSS_SELECTOR, '#sform > fieldset > button')
search_btn.click()
네이버 홈페이지에서 검색어를 입력하고 이를 검색하는 예제입니다.
다음 과정을 마치면 검색 결과 페이지로 이동합니다.
- 검색창을 선택한 뒤에 send_keys 메서드를 사용해 검색어를 입력합니다.
- 검색을 수행하기 위해 검색 버튼을 클릭해야 하므로 click 메서드를 실행합니다.
참고로 clear 메서드는 input 태그에 값이 입력되어 있는 경우 해당 값을 지우는 역할을 합니다.
위 코드는 CSS 선택자를 사용해서 태그를 선택하지만 XPATH를 사용하는 방법도 존재합니다.
마치며
Beautiful Soup에 이어 Selenium을 사용해서 웹 데이터를 수집하는 방법에 대해 알아봤습니다.
프론트엔드 개발을 하며 지겹도록 함께 했던 CSS 개념이 등장해서 반가웠습니다.
수집 대상인 웹 데이터를 표시하는 HTML 태그가 뷰포트 내에 존재해야 한다는 점을 언급하고 이번 포스팅을 마무리 하겠습니다.
'파이썬・ML' 카테고리의 다른 글
파이썬 딕셔너리 함수 총정리 (0) | 2023.07.26 |
---|---|
파이썬 collections 모듈 Counter 사용하기 (0) | 2023.07.26 |
Selenium 크롬드라이버 location 에러 (0) | 2023.07.06 |
파이썬 Folium으로 지도 시각화하기 (0) | 2023.07.04 |
파이썬 random 모듈 사용하기 (0) | 2023.06.14 |