일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- Spectral method
- 기저 함수
- 셀레니움
- 페로니 양조장
- 첸트랄레역 가성비 맛집
- Burgers Equation
- PIDoN
- Anaconda
- physics informed deeponet
- WPT
- 콜로세움 티켓 예약
- 영어 pdf 번역
- HFSS
- 판테온 신전 티켓 예약
- Physics Informed Neural Operator
- 영어 pdf 한글 번역
- 밀라노 중앙역 양식 맛집
- pizzeria dal 1999
- 연산자 학습
- 학사 취업
- jax
- selenium request 차이
- Pino
- pdf 번역 사이트
- 판테온 신전 티켓 카드 오류
- 첸트랄레역 파스타
- 첸트랄레역 맛집
- 트레비 분수 맛집
- 판테온 신전 티켓 신용카드
- 물리 지식 기반 인공지능
- Today
- Total
잡다구리 너구리
[블로그 자동화] 셀레니움(Selenium) 기초 문법 및 자동 로그인 본문
학부 때는 연구한다고 하루가 멀다 하고 코드를 봤었는데, 막상 취업하고 나니 하게 될 일이 없게 되었다. 이제 코딩을 놓은 지 1년이 다 되어가, 뭔가를 해봐야겠다고 생각하던 와중 DNN 코드를 짜기에는 너무 무거워지는 느낌이라 가볍게 할 수 있는(?) 블로그 자동화를 해보기로 하였다. 찾아보니 유튜브에도 잘 나와있긴 하지만, 재생목록 시간 자체가 너무 길기도 하고, 이런 거 유료강의는 얼마나 잘 나와있나 궁금하기도 하고, 좀 체계적이겠지 하는 기대 반으로 수강하였다. 아직 듣는 중이긴 하지만, 생각과 달리 방법론만 알려주고 코드 자체를 알려주는 느낌은 아니지만, 이런 거에 대한 개념을 잡아두면 추후 써먹을 일이 있지 않을까 싶어 하나씩 써볼까 한다.
한 번씩 키보드를 잘못 누르면, F12가 눌러 개발자 모드가 켜지는 경우가 있다. 여기 있는 정보들을 바탕으로 코드를 짜면 원하는 데이터들을 추출해 올 수 있는데, 이를 웹 크롤링이라고 한다. 크롤링 기법은 동적 크롤링과 정적 크롤링으로 구분되는데, 이번에 다룰 Selenium(셀레니움)은 그중 동적 크롤링 방법이다. 데이터를 추출할 뿐만 아니라 브라우저를 자동으로 조작할 수 있는 자동화 기능까지도 코드화할 수 있다. 웹사이트 자동 로그인, 데이터 수집(크롤링), 자동 게시글 작성 등을 할 수 있다. 지금 생각해보면 자동 로그인 방지가 없을 시절, 단순하게 무작위 조합을 통해 아이디와 비밀번호를 생성하여 해킹하는 것은 그렇게 어려운 코드가 아니었을 것 같다.
셀레니움 기초 사용법
어디까지나 나는 찍먹 상태이기 때문에, 다양한 라이브러리들이 있겠지만, 내가 봤던 라이브러리들이 기초적으로 사용하는 라이브러리라고 믿고 추가로 찾아보진 않았다. 시작하기 앞서, 개인적으로 라이브러리 버전 충돌 등의 문제로 인해 로컬에 환경 구축하는 것을 안 좋아하기 때문에 아나콘다 가상환경 상에서 셀레니움 환경을 구성하였다. 아마 해당 글을 일부러 찾아볼 경우 알고 있겠지만 다음과 같이 라이브러리를 설치할 수 있다.
pip install 라이브러리명(ex. selenium)
본 포스팅은 티스토리 자동 로그인 코드를 기반으로 작성 예정이며, 해당 코드에 들어가는 라이브러리는 다음과 같다.
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import pyperclip
import time
webdriver : 웹 브라우저를 제어하는 용도, 브라우저를 제어하는 동작을 코드로 수행 가능하게 함.
options : 브라우저의 실행 옵션 설정
by : HTML 요소를 찾는 방법 지정 (ex. CSS_SELECTOR, XPATH 등 기준으로 검색)
keys : 키보드 키 입력 제어
pyperclip : 텍스트를 클립보드에 복사하는 용도
time : 시간 관련 함수 제어, 코드 실행 속도를 조절할 수 있다.
개인적으로 초반에 헷갈렸던 개념을 하나 꼽자면, Class와 ID를 구분하는 것이다. 선택하려는 객체가 Class인지, ID인지 입력 방법이 달라진다. 아래 코드와 같이 객체가 Class라면 앞에 .이 붙고, ID일 경우 #이 붙는다.
# Class일 경우
driver.find_element(By.CSS_SELECTOR, ".(Class 명)")
# ID일 경우
driver.find_element(By.CSS_SELECTOR, "#(ID 명)")
셀레니움 기반 티스토리 자동 로그인 코드
먼저 전체 코드는 아래와 같다.
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import pyperclip
import time
# 옵션 부여
options = Options()
options.add_experimental_option("detach", True)
# 아이디와 패스워드 입력
ID = input("아이디를 입력하세요")
PW = input("비밀번호를 입력하세요.")
# 크롬창 열기
driver = webdriver.Chrome(options=options)
# 티스토리 링크로 이동
driver.get("https://www.tistory.com/")
# 홈페이지에서 로그인 창 클릭
driver.find_element(By.CSS_SELECTOR,".my_tistory.box_mylogin .btn_login.link_kakao_id").click()
driver.find_element(By.CSS_SELECTOR,".login_tistory .btn_login.link_kakao_id").click()
# 아이디 입력
driver.find_element(By.CSS_SELECTOR, "#loginId--1").click()
pyperclip.copy(ID)
driver.find_element(By.CSS_SELECTOR, "#loginId--1").send_keys(Keys.CONTROL + 'v')
# 비밀번호 입력
driver.find_element(By.CSS_SELECTOR, "#password--2").click()
pyperclip.copy(PW)
driver.find_element(By.CSS_SELECTOR, "#password--2").send_keys(Keys.CONTROL + 'v')
# 로그인 버튼 클릭
driver.find_element(By.XPATH,"//button[contains(@class, 'submit')]").click()
time.sleep(60)
위의 코드와 주석을 달아 놓은 부분을 보면 상당히 코드 순서가 직관적인 것을 볼 수 있다. 우리가 실제로 로그인을 하는 것처럼 브라우저를 켜고, 링크로 이동한 뒤에 로그인 버튼을 클릭하고 아이디와 비밀번호를 입력하면 되니까 말이다. 셀레니움의 사용 방법을 직관적으로 알 수 있는 선에서 코드를 뜯어보도록 하자.
# 홈페이지에서 로그인 창 클릭
driver.find_element(By.CSS_SELECTOR,".my_tistory.box_mylogin .btn_login.link_kakao_id").click()
driver.find_element(By.CSS_SELECTOR,".login_tistory .btn_login.link_kakao_id").click()
find_element는 선택 요소를 찾는 방법으로 뒤에 s를 붙여 find_elements로 입력할 경우 해당 이름의 전체 객체를 찾아 리스트를 반환하지만, element로 하게 되면 단일 요소만을 반환한다. 그렇다면 연두색 글씨의 객체 명은 어떻게 찾을까? 티스토리 홈페이지에서 개발자 도구(F12)를 누르게 되면 아래와 같이 오른쪽 화면에 무엇인가가 뜬다.
사진이 조금 작은 감이 있지만, 우측 위의 첫 번째 빨간 네모를 클릭하고 왼쪽 화면에 커서를 가져다 되면 화면에 있는 객체별 아이디명이 뜬다. 우리는 "카카오 계정으로 시작하기"를 클릭해야 로그인 화면으로 이동할 수 있기 때문에 커서를 올리고 클릭하면 우측 빨간 네모와 같이 바로 이동할 수 있다. 여기 있는 class인 bin_login.link_kakao_id를 가져와서 입력한 것인데, 코드 상에는 앞에 뭔가가 더 붙은 이유는 해당 버튼을 누르면 또 다른 로그인 창이 뜬다. 한 번 티스토리 홈페이지에서 눌러보면 무슨 뜻인지 알 것이다. 이를 구분해 주기 위함인데, class명에 있는 div class 뒤에 있는 이름을 추가로 붙인 것이다. 상위 요소까지 지정해 주는, 경로 설정의 느낌 정도로 이해하면 될 것 같다. div는 division(영역)의 줄인 말로 각 영역 별로 class를 구분한 것이기에, 그중 대장 class를 적어준 것이다.
이제 코드를 이해할 수 있을 것이다. CSS selector로 연두 글씨의 이름을 가진 객체를 찾아서 클릭한다는 코드이다. 상당히 직관적인 것 같다.
# 아이디 입력
driver.find_element(By.CSS_SELECTOR, "#loginId--1").click()
pyperclip.copy(ID)
driver.find_element(By.CSS_SELECTOR, "#loginId--1").send_keys(Keys.CONTROL + 'v')
다음은 아이디를 입력하는 코드이다. 전체 코드를 보면, 코드 실행 후 input 함수를 이용하여 입력한 아이디와 비밀번호를 변수로 받아준 모습을 확인할 수 있다. 위의 코드를 보면 ① 아이디 창을 클릭하고 ② ID를 복사 후 ③ 아이디 창에 control v를 보낸다 의 구성을 취하는 것을 알 수 있다. 이때 pyperclip은 변수를 클립보드에 복사하는 코드로 바로 키 자체를 보내는 것이 아닌, 번거롭게 복사 붙여 넣기 느낌으로 코드를 짜는 이유는 자동 입력(로그인) 방지를 피하기 위해서이다. 근데 네이버의 경우는 해당 방법으로 자동 로그인을 피해서 로그인이 되던데, 티스토리는 자동 로그인 방지가 뜨기는 하더라. 이것까지 해결하기는 귀찮아서 실행되는 것만 보고 놔뒀다. send_keys는 키보드 키를 실행시켜 주는 명령어. 사용 방법은 보기만 해도 쉽게 이해할 수 있다. find_element로 선택한 객체에 지정한 키를 send_keys 하는 구성이다.
# 로그인 버튼 클릭
driver.find_element(By.XPATH,"//button[contains(@class, 'submit')]").click()
# driver.find_element(By.CSS_SELECTOR, ".btn_g highlight submit").click()
마지막은 로그인 버튼을 클릭하는 코드이다. 해당 글을 통해 내가 이해한 수준으로 셀레니움 코드에 대해 이해했다면 다음과 같은 의문을 가질 수 있다. 바로 주석 처리 해둔 것과 같은 코드 구성을 취해도 되지 않는가이다. 정답은 Yes이다. 그냥 다른 방법으로 코드를 짜봤다. XPATH 방식으로 찾는 방식인데, //button은 HTML 문서 어디서든 button 태그를 찾는 것이고, contains(@class, 'submit")은 class 속성에 submit이란 단어가 포함된 것(button)을 찾는 것이다. 이런 방식으로 짜면 class 이름 순서에 대한 영향을 안 받는다곤 하는데, 그렇게 좋은 건진 잘 모르겠다.
글을 마치며
언제나 그렇듯, 글을 쓰기 전에는 엄청 상세하게 쓰려고 하지만, 막상 쓰다 보면 양이 생각보다 길어질 것 같아 상당히 간추린 글이 나오게 되는 것 같다. 본 코드는 네이버 자동 로그인 방지 코드를 기반으로 만들어 봤는데, 네이버는 send_keys 방식으로 먹히던데, 티스토리는 계속 자동 로그인 방지 창이 떴다. 티스토리 보안이 조금 더 좋은 것일까... 개발자 도구를 기반으로 코드를 짜는 것은 어려울 줄 알았는데, 막상 해보니 그렇게 어렵진 않은 것 같다. 코드 짜임새가 직관적이라 그런가, 업무에 적용할 여지가 있는지를 고민해 보면 좋을 것 같다.
'개인 프로젝트' 카테고리의 다른 글
[블로그 자동화] Request vs Selenium, Request 정의 및 성능 비교 (3) | 2025.06.07 |
---|---|
[블로그 자동화] 셀레니움 응용 : 주식 상위 종목명 자동 추출 (2) | 2025.06.04 |