[연구 자동화 #10] 고급 크롤링: Selenium으로 브라우저를 직접 조종하여 로그인 및 자동 클릭 마스터하기
연구를 하다 보면 국책 과제 포털, 사내 인트라넷, 혹은 데이터 다운로드를 위해 로그인이 필수인 학술 사이트에 접속해야 할 때가 많습니다. 이런 사이트들은 보안이나 기술적인 이유로 단순히 주소(URL)만 입력해서는 정보를 주지 않습니다.
이때 필요한 것이 바로 Selenium입니다. Selenium은 파이썬 코드를 통해 실제 크롬이나 엣지 같은 브라우저를 실행시키고, 마우스를 클릭하거나 키보드로 타이핑하는 과정을 '인간인 것처럼' 흉내 냅니다. 마치 내 컴퓨터 안에 나를 대신해 밤새 작업해주는 '투명 인간 운전사'를 고용하는 것과 같습니다.
1. Selenium이 필요한 결정적인 순간
BeautifulSoup으로 해결되지 않는 페이지들은 보통 다음과 같은 특징이 있습니다.
로그인 장벽: 아이디와 비밀번호를 입력하고 '로그인' 버튼을 눌러야만 접근 가능한 경우.
자바스크립트 실행: 페이지를 열자마자 데이터가 보이는 게 아니라, 1~2초 뒤에 혹은 클릭 후에야 나타나는 경우.
팝업창 대처: 공지사항이나 팝업창을 닫아야 본문이 보이는 경우.
2. 환경 구축: 웹드라이버와 라이브러리 세팅
Selenium은 브라우저를 조종하기 때문에, 브라우저와 파이썬을 연결해주는 '드라이버'가 필요합니다.
설치: 터미널에서
pip install selenium을 입력하세요.WebDriver: 예전에는 사용자가 직접 크롬 버전과 맞는 드라이버를 다운로드해야 했지만, 최근에는
webdriver_manager라는 도구를 사용하여 이 과정을 자동화할 수 있습니다. (pip install webdriver-manager추가 설치 권장)
3. 실전 코드: 로그인부터 데이터 확인까지
아래 코드는 브라우저를 켜고, 특정 사이트에 접속해 로그인 정보를 입력하고 버튼을 클릭하는 전 과정을 보여줍니다.
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
import time
# 1. 브라우저 실행 및 설정
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
# 2. 목표 사이트 접속
driver.get('https://example-portal.com/login')
# 3. 아이디/비밀번호 입력 (요소 찾기)
driver.find_element(By.NAME, 'user_id').send_keys('my_id_123')
driver.find_element(By.NAME, 'password').send_keys('my_password_456')
# 4. 로그인 버튼 클릭
driver.find_element(By.ID, 'login_btn').click()
# 5. 페이지 로딩 기다리기
time.sleep(3)
# 6. 로그인 후 나타난 텍스트 수집
content = driver.find_element(By.CLASS_NAME, 'data_box').text
print(content)
# 7. 브라우저 종료
# driver.quit()
4. 기다림의 미학: Implicit Wait와 Explicit Wait
웹 데이터 수집 자동화에서 가장 자주 발생하는 에러는 "아직 화면이 다 안 떴는데 데이터를 찾으라고 할 때" 발생합니다.
time.sleep(): 무조건 지정한 시간만큼 멈춥니다. 가장 쉽지만 효율이 떨어집니다.
Implicit Wait: 브라우저가 요소를 찾을 때까지 최대 N초 동안 기다려줍니다. 한 줄만 써두면 전체 코드에 적용됩니다.
Explicit Wait: "특정 버튼이 화면에 나타날 때까지만 기다려라"는 식의 더 정교한 대기가 가능합니다.
안정적인 자동화 프로그램을 만들고 싶다면, 네트워크 속도에 따라 유동적으로 대처하는 대기(Wait) 기술이 필수적입니다.
5. 헤드리스(Headless) 모드 활용하기
매번 브라우저 창이 뜨는 게 번거롭거나, 서버 환경에서 자동화를 돌려야 할 때는 Headless 모드를 사용해 보세요. 브라우저 창을 화면에 띄우지 않고 메모리상에서만 조용히 작동하게 할 수 있습니다.
options = webdriver.ChromeOptions()
options.add_argument('--headless')
이렇게 설정하면 겉으로는 아무 일도 일어나지 않는 것 같지만, 파이썬은 백그라운드에서 수천 페이지를 돌아다니며 데이터를 긁어모으고 있을 것입니다.
6. 마치며: 자동화의 끝은 무한한 가능성입니다
Selenium은 강력한 만큼 리소스를 많이 소모하고 속도가 느리다는 단점도 있습니다. 따라서 9편에서 배운 BeautifulSoup으로 가능한 곳은 최대한 가볍게 처리하고, 로그인이 필요하거나 동적인 제어가 필수인 구간에서만 Selenium을 섞어 쓰는 것이 고수의 전략입니다.
이제 여러분은 인터넷상의 어떤 정보라도 가져올 수 있는 마스터 키를 쥐게 되었습니다. 수천 번의 클릭과 타이핑으로 지쳐가던 손가락에게 이제 자유를 줄 시간입니다.
## 핵심 요약
Selenium은 실제 웹 브라우저를 파이썬 코드로 원격 제어하여 동적인 웹페이지를 정복하는 도구입니다.
find_element와click,send_keys명령어를 통해 로그인, 버튼 클릭, 텍스트 입력 등의 인간 행위를 완벽히 재현합니다.웹페이지 로딩 속도 차이로 인한 에러를 방지하기 위해 Wait(대기) 전략을 적절히 사용하는 것이 자동화의 핵심입니다.
## 다음 편 예고
자동화 코드를 잘 짰는데, 갑자기 "왜 안 되지?" 하고 막히는 순간이 옵니다. 다음 시간에는 [트러블슈팅: 초보 연구자가 가장 많이 하는 실수와 에러 메시지 대처법]을 다룹니다. 내 코드를 스스로 진단하고 고치는 법을 배워보겠습니다.
## 소통 질문
브라우저를 직접 조종한다면, 매일 반복하는 작업 중 어떤 것을 가장 먼저 자동화하고 싶으신가요? (예: 특정 사이트 로그인 후 매일 데이터 파일 다운로드 등) 댓글로 여러분의 아이디어를 들려주세요!
댓글
댓글 쓰기