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의 자세한 내용은 아래 참조
Upgrade to Selenium 4
Are you still using Selenium 3? This guide will help you upgrade to the latest release!
www.selenium.dev
블로그 인기글
폐업 신고 절차와 부가가치세 신고하는 방법
폐업 신고 시 세무서 안 가고 온라인으로 신고하는 방법인 '국세청 홈택스를 이용하여 폐업 신고하는 절차와 폐업 후 해야 하는 부가가치세 신고, 인건비 저리, 종합소득세 신고 등에 대해 포스팅합니다. 폐업 신고 시 홈택스 이용하는 방법과 부가가치세 등 신고 절차 여러가지 사유로 폐업을 해야 할 때, 예전에는 세무서를 방문해야 했지만 국세청 홈택스가 생긴 이후에는 사업자 등록이나 폐업 등을 인터넷으로 할 수가 있게 되었습니다. 특히, 코로나 시국인 요즘은 더더욱 온라인 신청 업무가 더 활성화되었죠. 폐업을 한다는 것 자체가 우울한 일인데, 발품을 파는 것보다는 커피 한잔 하면서 인터넷으로 간단하게 처리하는 게 좋을 듯하여 그 절차를 올려봅니다. 폐업은 폐업 신고와 함께 폐업 후 절차까지 모두 마쳐야 불이익이..
goodthings4me.tistory.com
엑셀 시트 분리 저장 - 엑셀 파일의 시트를 분리하여 저장하기
엑셀을 사용하다 보면 엑셀 시트를 분리해서 저장해야 할 때가 있다. 최근에도 이런 경우가 발생하여 구글링 후 엑셀 시트 분리 업무를 수행하고 내친김에 다른 사람들도 사용할 수 있도록 파이썬 tkinter로 프로그램으로 만들어 보았다. Excel Sheets 분리 저장하는 프로그램(with 파이썬 Tkinter) ※ 프로그램 다운로드(네이버 MYBOX에서 공유) : ExcelSeparateSheets.zip ▶ 프래그램을 실행하면 다음과 같이 초기 화면이 보인다. 찾아보기 : 엑셀 파일이 있는 폴더를 선택한다. (프로그램이 있는 최상위 디렉터리가 열린다) 실행하기 : 프로그램 실행 버튼 상태 변경 순서 : 실행전 → 실행 중 → Sheet "OOO" 분리 저장 중 → 실행 완료 실행 결과 확인 : 엑셀 파..
goodthings4me.tistory.com
[엑셀] 근무연수 및 근무 개월수 계산하는 함수
직장을 다니다 보면 몇 년 몇 개월 또는 전체 며칠을 다니고 있는지 궁금할 때가 있다. 아니면, 총무나 인사 일을 할 때 직원들의 근속연수 또는 근속개월수 등을 계산하고 싶을 때도 있다. 이런 경우 엑셀 함수를 활용하면 어떨까!! 근무연수 및 근무 개월수 계산 함수 알아보기 엑셀에서 근무연수 또는 근무 개월수 계산하는 것은 datedif() 함수를 사용하면 간단하게 해결할 수 있다. 아래 이미지를 보면서 설명하면, 셀 E1에 기준일자를 입력하고, 근무연수를 구할 때는 =datedif(B3,$E$1,"Y")&"년" 을 입력한다. 근무개월수는 =datedif(B3,$E$1,"M")&"개월" 처럼 입력한다. 일수까지 파악할 때문 별로 없지만, 심심풀이로 구해보고 싶을 때 =datedif(B3,$E$1,"D")..
goodthings4me.tistory.com
'코딩 연습 > 코딩배우기' 카테고리의 다른 글
로또 당첨번호 회차별 엑셀 저장(파이썬 크롤링) (0) | 2022.03.30 |
---|---|
동행복권 로또 당첨번호 추출하는 파이썬 크롤링 코딩 (0) | 2022.03.29 |
네이버 지식인 명예의전당 질문 키워드 추출(with 파이썬 크롤링) (0) | 2022.03.23 |
폴더 파일리스트 추출하여 엑셀에 저장하고, 파일명 바꾸기(파일이름 일괄변경 포함) (0) | 2022.03.15 |
국민 내일배움카드 'K-디지털 기초역량훈련' 내용과 파이썬으로 과정명 크롤링하기 (0) | 2022.03.11 |
댓글