본격적인 파이썬 셀레니움 크롤링에 앞서, [지난 19편 파이썬 셀레니움 자동 로그인 기초]에서는 내 손을 대신해서 아이디와 비밀번호를 타이핑하고 로그인 버튼까지 뚫어내는 마법 같은 자동 로그인 기능을 구현했습니다. 화면이 스르륵 열리며 로그인되는 모습을 볼 때의 그 짜릿함은 코딩해 본 사람만 알죠.
하지만 실무는 여기서부터가 진짜 시작입니다. 로그인을 했으면 ‘금일 방역 스케줄’ 메뉴를 클릭해서 들어가고, 화면에 있는 데이터를 긁어와야(크롤링) 진짜 업무 자동화니까요.
그런데 기세 좋게 클릭 코드를 짰더니 화면에 시뻘건 에러가 쏟아졌습니다. 오늘 20편에서는 본격적인 파이썬 셀레니움 크롤링의 첫 관문이자, 초보자들의 무덤이라 불리는 ‘페이지 로딩 속도 에러’ 해결 과정을 실전 경험을 담아 공유합니다.

1. 잘되던 코드가 왜 로그인 직후에 뻗어버릴까?
로그인 버튼을 누르고 난 뒤, 곧바로 ‘일일 스케줄 현황’이라는 메뉴(버튼)를 클릭하라고 코드를 짰습니다. F12를 눌러 버튼의 위치(XPath)도 완벽하게 따왔는데 코드는 자꾸 NoSuchElementException(그런 요소를 찾을 수 없습니다)을 뱉어냈습니다.
“분명히 내 눈앞에 버튼이 있는데 왜 컴퓨터는 못 찾는다는 거지?”
이유는 허무하게도 ‘파이썬의 속도가 너무 빨라서’였습니다. 파이썬은 로그인 버튼을 누르자마자 0.001초 만에 다음 메뉴 버튼을 찾으려고 덤벼듭니다. 하지만 우리의 인터넷 창은 로그인 처리 후 다음 페이지가 로딩되기까지 1~2초의 딜레이가 발생하죠. 즉, 화면에 메뉴 버튼이 아직 그려지지도 않았는데 파이썬이 허공에 클릭질을 하려다 뻗어버린 것입니다.
2. 실무 해결책: 컴퓨터에게 ‘기다려!’ 명령하기
이 문제를 해결하려면 헐레벌떡 뛰어가는 파이썬의 뒷덜미를 잡고 “인터넷 창이 다 뜰 때까지 조금만 기다려!”라고 명령해야 합니다. 여기에는 두 가지 실전 기술이 있습니다.
① 무식하지만 확실한 방법: time.sleep()
가장 직관적인 방법입니다. 파이썬 자체를 지정한 시간만큼 아예 멈춰버리는 겁니다.
Python
import time
# 로그인 버튼 클릭하는 코드 (이전 편 참고)
driver.find_element(By.XPATH, '로그인버튼위치').click()
# 페이지가 넘어갈 때까지 무조건 3초 멈춰서 대기!
time.sleep(3)
# 3초 뒤에 다음 메뉴 클릭
driver.find_element(By.XPATH, '다음메뉴위치').click()
초보 시절에는 이 코드를 애용했습니다. 하지만 실무에서 여러 사이트를 돌리다 보니 답답해졌습니다. 인터넷이 빨라서 0.5초 만에 페이지가 떴는데도 무조건 3초를 멍하니 기다려야 했기 때문입니다. 자동화의 생명인 ‘스피드’가 죽어버리는 느낌이었죠.
② 똑똑하고 유연한 방법: implicitly_wait() (강력 추천)
그래서 셀레니움 고수들이 쓴다는 코드를 찾아냈습니다. 바로 [셀레니움 공식 문서의 Waits 가이드]에서 권장하는 ‘유연한 대기’ 기능입니다.
Python
# 파이썬 셀레니움 크롤링 세팅 부분에 이 한 줄을 추가합니다.
driver.implicitly_wait(10)
# 로그인 버튼 클릭
driver.find_element(By.XPATH, '로그인버튼위치').click()
# 다음 메뉴 클릭 (기다릴 필요 없이 바로 다음 코드 작성)
driver.find_element(By.XPATH, '다음메뉴위치').click()
이 implicitly_wait(10)은 정말 마법 같은 코드입니다. 파이썬에게 이렇게 지시하는 것과 같습니다. “앞으로 요소를 찾을 때 최대 10초까지는 기다려줄게. 하지만 1초 만에 화면에 버튼이 나타나면, 10초 꽉 채우지 말고 지체 없이 바로 클릭하고 넘어가!”
이 코드 한 줄을 스크립트 맨 위에 세팅해 두니, 에러도 싹 사라지고 억지로 3초씩 멈춰있던 답답함도 완전히 해결되었습니다.

3. 실전 적용: 로그인 후 방역 스케줄 메뉴 클릭하기
이제 에러를 해결했으니, 실제로 제가 매일 아침 접속하는 협력사 포털에 로그인하여 ‘스케줄 현황’ 메뉴를 클릭하고 텍스트를 가져오는 뼈대 코드를 공개합니다.
Python
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
# 똑똑한 대기 시간 설정 (최대 10초)
driver.implicitly_wait(10)
driver.get('협력사 로그인 페이지 주소')
# 1. 로그인 진행 (아이디/비번 입력 후 클릭)
driver.find_element(By.ID, 'userId').send_keys('내아이디')
driver.find_element(By.ID, 'userPw').send_keys('내비밀번호')
driver.find_element(By.XPATH, '//*[@id="loginBtn"]').click()
# 2. 로딩 에러 없이 바로 '일일 스케줄 현황' 메뉴 클릭
# (implicitly_wait 덕분에 페이지가 뜰 때까지 알아서 기다렸다가 클릭합니다)
driver.find_element(By.XPATH, '//*[@id="menu_schedule"]').click()
# 3. 화면에 뜬 스케줄 제목(텍스트) 가져오기
schedule_title = driver.find_element(By.CLASS_NAME, 'board-title').text
print("오늘의 업무:", schedule_title)
F5 키를 눌러 코드를 실행해 보니, 크롬 창이 스스로 열리며 로그인을 하더니 재빠르게 스케줄 메뉴로 넘어가서 제목을 긁어옵니다. 드디어 40대 아저씨의 컴퓨터에 ‘나만의 비서’가 출근한 기분입니다.
4. 마치며
오늘은 파이썬 셀레니움 크롤링을 할 때 누구나 한 번은 명치를 맞게 되는 ‘페이지 로딩과 클릭 에러’를 implicitly_wait라는 우아한 코드로 해결해 보았습니다.
코딩을 전혀 몰랐던 40대 직장인도 차근차근 따라 하다 보면 누구나 파이썬 셀레니움 크롤링으로 업무를 자동화할 수 있습니다. 에러가 나더라도 포기하지 마시고 하나씩 해결해 보세요.”
마우스 클릭과 페이지 이동을 완벽하게 통제하게 되었으니, 다음 21편에서는 드디어 화면에 띄워진 수백 줄짜리 고객 데이터와 표를 파이썬으로 박박 긁어와서 엑셀 파일로 얌전하게 저장하는 ‘진짜 크롤링’ 기술을 다뤄보겠습니다.
아침마다 협력사 사이트에 들어가서 스케줄표를 엑셀로 다운로드하고 계신 직장인이라면, 다음 포스팅을 무조건 기대해 주세요! 퇴근 시간이 훌쩍 앞당겨질 것입니다.
