TOP
class="layout-aside-left paging-number">
본문 바로가기
[파이썬 Projects]/<파이썬 기초>

[파이썬] Selenium 라이브러리 사용하기

by 기록자_Recordian 2024. 4. 18.
728x90
반응형
시작에 앞서
해당 내용은 <파이썬으로 데이터 주무르기> -민형기 저, BJPUBLIC 출판사 의 내용을 토대로 작성되었습니다.
보다 자세한 내용은 해당 교재를 확인하여 주시기 바랍니다.

 


Selenium 라이브러리 사용하기

 
<Selenium 이란?>
파이썬의 Selenium은 웹 애플리케이션을 자동화하기 위한 도구로, 주로 웹 브라우저를 제어하고 웹 페이지 상의 요소를 조작하는 데 사용됩니다. Selenium은 웹 애플리케이션의 테스트 자동화, 웹 스크래핑 등 다양한 목적으로 활용됩니다.

Selenium을 사용하면 다음과 같은 작업을 수행할 수 있습니다:

- 웹 브라우저 제어: Selenium을 사용하여 웹 브라우저(예: Chrome, Firefox)를 제어하고 원하는 동작을 실행할 수 있습니다.
- 웹 페이지 요소 접근: 웹 페이지에서 텍스트, 링크, 버튼 등의 요소를 식별하고 조작할 수 있습니다.
- 사용자 이벤트 시뮬레이션: 마우스 클릭, 키보드 입력 등과 같은 사용자 이벤트를 시뮬레이션하여 웹 페이지 상호작용을 자동화할 수 있습니다.
- 웹 페이지 스크래핑: 웹 페이지의 데이터를 추출하고 필요한 정보를 수집할 수 있습니다.

 
Selenium은 주로 웹 테스트 자동화를 위해 사용되지만, 웹 스크래핑이나 데이터 수집 등 다양한 작업에 유용하게 활용될 수 있습니다.

Selenium은 웹 브라우저의 개발자 도구를 활용하여 웹 페이지의 요소를 식별하고 조작합니다. 필요한 경우 웹 드라이버(예: ChromeDriver, GeckoDriver)를 설치하고 설정하여 Selenium을 사용할 수 있습니다.
[출처: 챗gpt]
 


Selenium 설치하기

 
Selenium은 Anaconda 에 포함된 모듈이 아니기 때문에 별도로 설치해야 한다.

pip install selenium

selenium 설치

 
Selenium은 설치만으로 동작하지 않기 때문에, 사용하는 브라우저에 맞춰 웹 드라이버를 다운 받아야 한다
(크롬일 경우, 크롬 웹 드라이버를 다운)

 

ChromeDriver - WebDriver for Chrome - Downloads

Current Releases If you are using Chrome version 115 or newer, please consult the Chrome for Testing availability dashboard. This page provides convenient JSON endpoints for specific ChromeDriver version downloading. For older versions of Chrome, please se

chromedriver.chromium.org

 
나는 그냥 가장 최신 버전으로 다운 받았다.

chrome webdriver
chrome webdriver downloads
윈도우는 win32.zip 다운 받으면 됨


코드를 이용하여 테스트 해보기

 
다시 jupyter notebook으로 돌아가서, webdriver를 import 하고, 네이버에 접속해본다.

from selenium import webdriver
driver = webdriver.Chrome('../driver/chromedriver')
driver.get("http://naver.com") 

라고 입력하였으나, 이번엔 'AttributeError: 'str' object has no attribute 'capabilities'
에러메시지를 받게 되어 다시 챗gpt에 검색하여 다시 코드를 받았으나, 이마저도 같은 오류

[챗 gpt 코드]
from selenium import webdriver

# 올바른 방법: WebDriver 객체 생성
driver = webdriver.Chrome('../driver/chromedriver')  # 경로 문자열 대신 실제 드라이버 객체 사용
driver.get("http://naver.com")


그래서 구글링을 해보니, 이런 답변을 발견했다.

셀레니움 해결책

 
해당 의견대로 실행해본 결과,

driver = webdriver.Chrome()
driver.get("http://naver.com")

감사합니다!

해결이 되었다! (새로운 크롬 창이 켜지면서 네이버에 접속되고, 'Chrome이 자동화된 테스트 소프트웨어에 의해 제어되고 있습니다' 라는 문구가 뜨면 성공.)
 
※ 주의: 저 웹 브라우저는 우리가 코드로 움직일 브라우저이며, 저기서 보이는 내용을 이제 가져오는 것. 그래서 가급적 크롬 드라이버에 의해 생성된 브라우저는 손으로 조작해서는 안된다. (코도를 작성할 때 혼선이 생길 수 있기 때문)
만약, 개발자도구를 실행하는 경우 (XPath 확보 또는 태그 확인 등을 이유로)
동일 화면을 별도로 실행하여 작업하는 것이 좋음.


(Selenium 을 이용하여) 네이버에 로그인 하기

 
새로 켠 크롬 창에서 개발자 도구를 켜고 ctrl+shitf+c 누른 후 네이버 로그인 정보를 입력하는 곳의 html 소스 코드를 확인해보면 id= 이라는 항목은 pw 라고 되어 있다.

네이버 로그인 창 개발자 도구

 
Selenium이 제공하는 명령 중 find_element_by_id 를 이용해서 id를 찾고,
send_key 명령으로 자신의 ID와 비밀번호를 입력하면 됨.
(다른 글자가 입력되어 있을수도 있기 때문에 clear() 명령으로 해당 id가 위치한 입력창의 내용 지움)

# 아이디 입력
elem_login = driver.find_element_by_id("id")  # id 속성으로 요소 찾기
elem_login.clear()  # 입력 필드 내용 지우기
elem_login.send_keys("a1231412")  # 아이디 입력(로그인하고자 하는 네이버 id)

# 비밀번호 입력
elem_pw = driver.find_element_by_id("pw")  # pw 속성으로 요소 찾기
elem_pw.clear()  # 입력 필드 내용 지우기
elem_pw.send_keys("*******")  # 비밀번호 입력 (로그인하고자 하는 네이버 pw)

 

그러나 이번엔
'WebDriver' object has no attribute 'find_element_by_id'
라는 에러 메시지를 받았다.
역시, 챗 gpt에게 다시 sos
 
[챗gpt says]
해당 오류인 'WebDriver' object has no attribute 'find_element_by_id'는 Selenium WebDriver 객체에 find_element_by_id() 메서드가 없기 때문에 발생한 AttributeError입니다.
 
하지만... 챗gpt에게 다시 받은 코드도 해당 에러를 없애기에는 역부족이라 다시 구글링을 해본다.
 
구글링을 통해 찾은 내용은

from selenium.webdriver.common.by import By
pip install webdriver_manager
from selenium import webdriver
from selenium.webdriver.chrome.service
 import Service
from selenium.webdriver.chrome.options
 import Options
from webdriver_manager.chrome import ChromeDriverManager # Chrome driver 자동 업데이트

# 브라우저 꺼짐 방지
chrome_options = Options()
chrome_options.add_experimental_option("detach", True)

# 불필요한 에러메시지 노출 방지
chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"])

# Chrome driver Manager를 통해 크롬 드라이버 자동 설치
service = Service(excutable_path=ChromeDriverManager().install()) 
driver = webdriver.Chrome(service=service, options = chrome_options)

# 이동하려는 해당 웹페이지 주소
driver.get("https://nid.naver.com/nidlogin.login?mode=form&url=https://www.naver.com/")
# 아이디 입력창
id = driver.find_element(By.CSS_SELECTOR, "#id")

# 클릭하도록 설정
id.click()

# 키보드 입력 설정
id.send_keys("네이버아이디")  # 입력 필드에 값 입력(본인 네이버 id 입력)
# 비밀번호 입력창 찾기
pw = driver.find_element(By.CSS_SELECTOR, "#pw")
# 클릭하도록 설정
pw.click()
# 키보드 입력 설정
pw.send_keys("********") # "네이버 비밀번호"에는 본인 네이버 비밀번호 입력

 

여기까지 코드를 실행하고 나면

네이버 로그인 화면

 

# 로그인 버튼 클릭
login_btn = driver.find_element(By.CSS_SELECTOR, "#log\.login")
login_btn.click()


단, 로그인 속도가 너무 빨라서 네이버에서 bot으로 착각해 자동입력방지문자를 입력하라고 한다
 

자동입력 방지

 
그래서 anaconda prompt 창을 켜고 아래 두 가지를 설치하고

pip install pyautogui
pip install pyperclip

pip install pyautogui

 
아래의 세 가지를 import 한다

import time
import pyautogui
import pyperclip

 
그리고나서

pyperclip.copy("네이버 아이디") #send_keys가 빠르게 입력되기 때문에 bot 으로 보기 때문
pyautogui.hotkey("ctrl", "v") 
time.sleep(2) #id 입력 후 2초 정도 유지

 
이것마저 막아놨는지 여전히 자동입력 방지로 로그인이 안된다... 0_0;;
그래도 여기까지 온 것만으로도 80% 만족!
자세한 내용과 코드는 아래 링크를 통해 확인 바란다.

 

Selenium으로 네이버 자동 로그인

기본 설정 1. 네이버 로그인창 URL copy 2. drive.get()에 URL paste 추가적으로, 웹페이지가 켜진 후 해당 페이지에서 5초간 확인할 수 있게 하는 옵션과 화면을 최대화 사이즈로 보여주는 옵션을 추가 URL

velog.io

 
 자동입력 방지가 계속 떠서 다른 코드를 받았는데, 그 코드도 계속 떠서 이거는 다음에 해보는 걸로 하겠다.

 

[새로 받은 코드]

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.select import Select
import pyperclip
import time

user_id = '네이버아이디' #자기 아이디와 비밀 번호 넣어주세요
user_pw = '비밀번호'

driver = webdriver.Chrome()
driver.get('https://nid.naver.com/nidlogin.login?mode=form&url=https://www.naver.com/')
driver.implicitly_wait(5)
pyperclip.copy(user_id)
driver.find_element(By.ID, 'id').send_keys(Keys.CONTROL, 'v')
time.sleep(1)
pyperclip.copy(user_pw)
driver.find_element(By.ID, 'pw').send_keys(Keys.CONTROL, 'v') 
time.sleep(1)
driver.find_element(By.ID, 'log.login').click()
driver.implicitly_wait(5)
728x90
반응형