본문 바로가기
코딩 연습/코딩배우기

크롤링 도구 셀레니움(selenium) 업그레이드

by good4me 2022. 3. 25.

goodthings4me.tistory.com

웹 크롤링에서 많이 사용하는 도구인 셀레니움(selenium)이 수개월 전에 업그레이드되었고 HTML 요소를 찾는 부분이 변경되었다고 하는데... 

 

 

크롤링 도구 셀레니움(selenium) 4 알아보기

파이썬으로 크롤링할때 자주 사용하고 있었던 selenium이 버전 3에서 버전 4로 한 단계 기능 향상을 이루었다고 한다.

 

그에 맞추어서 파이썬 크롤링에서 자주 사용하는 selenium 드라이버의 설치와 HTML 요소 추출 메서드의 변경 내역, 그리고 크롬 드라이버를 생성하여 간단하게 구글 검색을 해보는 방법으로 변경 내역을 정리해본다.

 

셀레니움 설치는 기존과 같이 하면 되고,

설치는
pip install selenium 또는 pip install selenium==4.0.0

업그레이드는
pip install --upgrade selenium

 

 

HTML 요소를 찾는 메서드 변경

o 셀레니움 버전3 메서드

selenium 버전3
selenium 버전3

 

o 셀레니움 버전4 메서드

selenium 버전4
selenium 버전4

- 사용하는 방법상 크게 변경된 것이 없어서 불편하지는 않을 것 같다

 

 

 

크롬 드라이버 생성하여 구글 검색해보기(예시)

 

구글 검색 화면에 키워드(selenium) 입력하도록 자동화하는 코드

구글 검색
구글 검색

- 개발자 도구(F12)에서 구글의 검색란의 코드를 확인해보면, name="q"이고

개발자도구

 

- 검색란 밑에 있는 검색 버튼은 name="btnk"이다

개발자도구
개발자도구

 

소스 코드

from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By


def chromeWebdriver():
    chrome_service = ChromeService(executable_path=ChromeDriverManager().install())
    options = Options()
    options.add_experimental_option('detach', True)
    options.add_experimental_option('excludeSwitches', ['enable-logging'])
    # options.add_argument('--headless')

    driver = webdriver.Chrome(service=chrome_service, options=options)

    return driver


driver = chromeWebdriver()
driver.get("http://www.google.com")

print(driver.current_url)  # http://www.google.com/

driver.implicitly_wait(2)
# driver.maximize_window()

# 웹 페이지(html) 요소 찾기 및 가져오기
search_box = driver.find_element(By.NAME, "q")
search_box.send_keys("Selenium")
search_button = driver.find_element(By.NAME, "btnK")
search_button.click()
res = driver.find_element(By.NAME, "q").get_attribute("value")
print(res)  # Selenium


driver.quit()

 

good4me.co.kr

 

o 위에서 크롬 드라이버 생성을 함수로 안 만들고 바로 코딩해도 되지만, 다른 곳에서 사용할 때를 대비해 저렇게 함수로 만들어서 사용하면 편리하다. (사용자 모듈로 만들어서 사용하는 방법도 가능)

o 이번 버전에서 변화된 것은 'from selenium.webdriver.chrome.service import Service' 부분이다. Service 객체의 매개변수 executable_path에 드라이버 패스를 주어 인스턴스를 만들고, Chrome()의 매개변수에 대입을 하여 드라이버를 생성한다.

o 그런데, 크롬 드라이버를 버전에 맞게 다운로드 후 path를 지정하는 불편함을 해소하고자 크롬 드라이버를 자동으로 설치하는 모듈이 있는데, 이것을 Service 객체의 매개변수로 전달하여 사용할 수도 있다. 

 

chrome_service = ChromeService(executable_path=ChromeDriverManager().install())

- 이 부분이 크롬 드라이버를 자동 설치하는 부분으로 서비스 객체를 만들어서 변수에 저장한다.

- ChromeDriverManager 설치 명령 : pip install webdriver_manager

 

o 옵션 부분을 살펴보면,

options = Options()
options.add_experimental_option('detach', True)  # 브라우저 바로 닫힘 방지
options.add_experimental_option('excludeSwitches', ['enable-logging'])  # 불필요한 메시지 제거 
# options.add_argument('--headless')  # 백그라운드 작업

- 브라우저가 열렸다가 바로 닫히는 증상 또는 불필요한 오류 메시지(시스템에 부착된 장치가 작동하지 않습니다.) 등을 제거하기 위해 옵션, 그리고 브라우저를 안 띄우고 백그라운드에서 실행하게 하는 옵션 등 여러 옵션이 있다.

※ 에러 메시지 (예)

(venv) D:\pythonDev>[6672:11044:0324/215830.570:ERROR:device_event_log_impl.cc(214)] [21:58:30.569] USB: usb_device_handle_win.cc:1049 Failed to read 
descriptor from node connection: 시스템에 부착된 장치가 작동하지 않습니다. 
(0x1F)

 

o 설치된 크롬 드라이버 객체를 받아서 드라이버 생성하는 코드

driver = webdriver.Chrome(service=chrome_service, options=options)

 

o 크롬 드라이버 생성 함수의 리턴 값인 드라이버를 받아서 브라우저를 띄우는 코드

driver = chromeWebdriver()
driver.get("http://www.google.com")

 

o 셀레니움(드라이버)으로 브라우저의 현재 상태와 코드를 동기화(크롤링에 필요한 HTML 요소가 페이지 내 있는지 확인하고 상호 작용이 가능한 상태인지 확인)하는데 필요한 시간 확보를 위해 driver.implicitly_wait(2) 사용한다.(암묵적 지연 시간 설정)

 

o 웹 페이지(html) 요소 찾기 및 가져오기

search_box = driver.find_element(By.NAME, "q")  # 구글 검색란 name="q"
search_box.send_keys("Selenium")  # 검색란에 키워드 입력
search_button = driver.find_element(By.NAME, "btnK")  # 구글 검색 버튼 name="btnK"
search_button.click()  # 버튼 클릭
res = driver.find_element(By.NAME, "q").get_attribute("value")  # 검색란 값을 가져옴
print(res)  # Selenium

- 버전 4의 메서드 사용방법을 확인할 수 있다. 

 

 

※ 셀레니움 버전 4의 자세한 내용은 아래 참조

 

Upgrade to Selenium 4

Are you still using Selenium 3? This guide will help you upgrade to the latest release!

www.selenium.dev

 

댓글