티스토리 뷰

개발환경  : 윈도우 10

파이썬 : Python 3.10.5

셀레니움 : 4.3.0

 

자주 이용하는 사이트들의 로그인을 위해 셀레니움으로 처리하고 윈도우 스케줄러에 등록해서 하루한번 처리

셀레니움 버전 변경에 따라 기존에 사용하던 코드들이 좀 변경됨

 

from selenium import webdriver as wd
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.common.alert import Alert
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

import sys
import time
import logging
import datetime
import traceback

크롤링에 필요한 모듈 호출

 

logger = logging.getLogger()
logger.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
stream_hander = logging.StreamHandler()
stream_hander.setFormatter(formatter)
logger.addHandler(stream_hander)

nowdate = datetime.datetime.now().strftime("%Y%m%d%H%M")
file_handler = logging.FileHandler("nowdate+".log")
logger.addHandler(file_handler)

실행 중 오류 기록을 위한 로그 세팅

 

chrome_options = Options()
chrome_options.add_argument("--incognito") #시크릿모드
chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"]) #USB 출력 관련 오류 안보이게 처리

driver = wd.Chrome(service=Service(ChromeDriverManager().install()), chrome_options=chrome_options)

# 기존에 크롬버전에 맞춰 webdriver를 다운받아서 파일경로를 입력했어야했는데 위 명령어로 알아서 불러옴 다만 속도차이가 있음
driver.set_window_size(1080,800) #화면사이즈
driver.implicitly_wait(3)

 

그냥 기본(아이디, 비번, 버튼) 로그인 창

try:
	driver.get('https://도메인명/login')
	time.sleep(1)
	driver.find_element('name','id').send_keys('아이디')
	time.sleep(0.5)
	driver.find_element('name','pw').send_keys('비밀번호')
	time.sleep(0.5)
	driver.find_element('xpath','버튼의xpath').click()
	time.sleep(3)
except:
	logging.error(traceback.format_exc())

셀레니움 이전버전에 find_element_by~~~ 명령어들이 find_element, find_elements로 변경됨

 

경고창 처리(alert)

result = Alert(driver)
result.accept()

셀레니움 버전이 변경되면서 경고창 처리 방식도 변경됨

 

로그인창이 레이어팝업인경우

driver.get('로그인페이지주소')
time.sleep(1)
driver.find_element('xpath','로그인버튼경로').click()
time.sleep(1)
WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.ID,"userid"))).send_keys('아이디')
WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.ID,"password"))).send_keys('비밀번호')
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, 'button'))).click()
time.sleep(1)
driver.switch_to.default_content() #본창으로 이동
time.sleep(0.5)

 

아이프레임 처리

WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@title='reCAPTCHA']")))
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.recaptcha-checkbox-border"))).click()
time.sleep(1)
driver.switch_to.default_content()

위 코드는 reCAPTCHA에 활용 가능 다만 로봇이 아닙니다 체크만 가능하며 이미지선택박스 뜨면 에러남

 

코드 에러 로그 처리

logging.error(traceback.format_exc())

 

try: except: 를 활용해서 except에 에러 로그 처리

'serverSide > Python' 카테고리의 다른 글

[python]파이썬 unexpected indent 들여쓰기 에러  (0) 2019.10.17
댓글