시작에 앞서
해당 내용은 <파이썬으로 데이터 주무르기> -민형기 저, BJPUBLIC 출판사 의 내용을 토대로 작성되었습니다.
보다 자세한 내용은 해당 교재를 확인하여 주시기 바랍니다.
Selenium 라이브러리 사용하기
<Selenium 이란?>
파이썬의 Selenium은 웹 애플리케이션을 자동화하기 위한 도구로, 주로 웹 브라우저를 제어하고 웹 페이지 상의 요소를 조작하는 데 사용됩니다. Selenium은 웹 애플리케이션의 테스트 자동화, 웹 스크래핑 등 다양한 목적으로 활용됩니다.
Selenium을 사용하면 다음과 같은 작업을 수행할 수 있습니다:
- 웹 브라우저 제어: Selenium을 사용하여 웹 브라우저(예: Chrome, Firefox)를 제어하고 원하는 동작을 실행할 수 있습니다.
- 웹 페이지 요소 접근: 웹 페이지에서 텍스트, 링크, 버튼 등의 요소를 식별하고 조작할 수 있습니다.
- 사용자 이벤트 시뮬레이션: 마우스 클릭, 키보드 입력 등과 같은 사용자 이벤트를 시뮬레이션하여 웹 페이지 상호작용을 자동화할 수 있습니다.
- 웹 페이지 스크래핑: 웹 페이지의 데이터를 추출하고 필요한 정보를 수집할 수 있습니다.
Selenium은 주로 웹 테스트 자동화를 위해 사용되지만, 웹 스크래핑이나 데이터 수집 등 다양한 작업에 유용하게 활용될 수 있습니다.
Selenium은 웹 브라우저의 개발자 도구를 활용하여 웹 페이지의 요소를 식별하고 조작합니다. 필요한 경우 웹 드라이버(예: ChromeDriver, GeckoDriver)를 설치하고 설정하여 Selenium을 사용할 수 있습니다.
[출처: 챗gpt]
Selenium 설치하기
Selenium은 Anaconda 에 포함된 모듈이 아니기 때문에 별도로 설치해야 한다.
pip install selenium
Selenium은 설치만으로 동작하지 않기 때문에, 사용하는 브라우저에 맞춰 웹 드라이버를 다운 받아야 한다
(크롬일 경우, 크롬 웹 드라이버를 다운)
나는 그냥 가장 최신 버전으로 다운 받았다.
코드를 이용하여 테스트 해보기
다시 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
아래의 세 가지를 import 한다
import time
import pyautogui
import pyperclip
그리고나서
pyperclip.copy("네이버 아이디") #send_keys가 빠르게 입력되기 때문에 bot 으로 보기 때문
pyautogui.hotkey("ctrl", "v")
time.sleep(2) #id 입력 후 2초 정도 유지
이것마저 막아놨는지 여전히 자동입력 방지로 로그인이 안된다... 0_0;;
그래도 여기까지 온 것만으로도 80% 만족!
자세한 내용과 코드는 아래 링크를 통해 확인 바란다.
※ 자동입력 방지가 계속 떠서 다른 코드를 받았는데, 그 코드도 계속 떠서 이거는 다음에 해보는 걸로 하겠다.
[새로 받은 코드]
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)
'[파이썬 Projects] > <파이썬 기초>' 카테고리의 다른 글
[파이썬] 넘파이(NumPy) - 2 (0) | 2024.05.25 |
---|---|
[파이썬] 넘파이(NumPy) - 1 (0) | 2024.05.25 |
[파이썬] 크롬 개발자 도구를 이용해서 원하는 태그 찾기 (0) | 2024.04.16 |
[파이썬] Beautiful Soup 익히기 (1) | 2024.04.16 |
[파이썬] 지도 시각화 도구 - Folium (0) | 2024.04.16 |