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 메서드
o 셀레니움 버전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()
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의 자세한 내용은 아래 참조
'코딩 연습 > 코딩배우기' 카테고리의 다른 글
로또 당첨번호 회차별 엑셀 저장(파이썬 크롤링) (0) | 2022.03.30 |
---|---|
동행복권 로또 당첨번호 추출하는 파이썬 크롤링 코딩 (0) | 2022.03.29 |
네이버 지식인 명예의전당 질문 키워드 추출(with 파이썬 크롤링) (0) | 2022.03.23 |
폴더 파일리스트 추출하여 엑셀에 저장하고, 파일명 바꾸기(파일이름 일괄변경 포함) (0) | 2022.03.15 |
국민 내일배움카드 'K-디지털 기초역량훈련' 내용과 파이썬으로 과정명 크롤링하기 (0) | 2022.03.11 |
댓글