티스토리 뷰
개발환경 : 윈도우 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 |
---|
댓글