[Python/MacOS] Selenium 크롤러 - 네이버 자동 로그인 (캡차 해결 버전)
** MacOS의 경우 네이터 자동 로그인 (캡차 해결)을 위해서는
Selenium + FireFox Driver 조합을 사용하셔야 합니다. **
<< 목표 >>
python프로그램을 통해서 네이버 자동 로그인을 수행하고자 합니다.
네이버 로그인의 경우, 다양한 웹사이트에서 연동하여 사용하고 있죠?
그러니, 네이버 자동 로그인 프로그램을 만들어 놓으면, 네이버 계정 연동을 해 놓은 사이트들 모두 사용가능하다는 의미입니다^^
<< 사전 준비 >>
ㅁ 라이브러리 설치
$ pip install selenium
$ pip install pyperclip
ㅁ FireFox Driver 설치
$ cd /etc
$ wget github.com/mozilla/geckodriver/releases/download/v0.25.0/geckodriver-v0.25.0-macos.tar.gz
$ tar geckodriver-v0.25.0-macos.tar.gz
$ chmod +x geckodriver
<< 구현 순서 >>
Step 1 | FireFox 드라이버 경로 설정 |
Step 2 | FireFox 드라이버로 URL 접속 |
Step 3 | 네이버 로그인 창에 아이디와 비밀번호 입력 |
Step 4 | 네이버 로그인 버튼 클릭 |
Step 5 | 네이버 캡차 우회하여 로그인 하기 |
Step 6 | 브라우저 등록 버튼 클릭 |
Step 1) FireFox 드라이버 경로 설정
# 자동화 테스트를 위해 셀리니움을 불러옵니다.
from selenium import webdriver
import time
# FireFox 드라이버의 경로를 설정합니다.
driver = webdriver.Firefox(executable_path='/etc/geckodriver')
Step 2) FireFox 드라이버로 URL 접속
# 접속할 url
url = "https://nid.naver.com/nidlogin.login"
# 접속 시도
driver.get(url)
FireFox를 통해서 자동 실행되는 화면을 볼 수 있습니다.
Step 3) 네이버 로그인 창에 아이디와 비밀번호 입력
아이디와 비밀번호 정보를 알기 위해서
입력창에서 오른쪽마우스 클릭 > [검사] 를 클릭하면, 오른쪽에 화면이 생깁니다.
Elements란을 클릭하면, id="id", name="id" 라고 되어 있네요.
동일한 방법으로 비밀번호란도 확인을 해보면, id="pw", name="pw"라고 되어 있습니다.
테스트하고 싶은 계정의 id와 pw를 dictionary에 담은 후, 해당 값을 보내보겠습니다.
login = {
"id" : "<이곳에 ID를 입력하세요>",
"pw" : "<이곳에 PW를 입력하세요>"
}
# 아이디와 비밀번호를 입력합니다.
time.sleep(0.5) ## 0.5초
# driver.find_element_by_name('id').send_keys('아이디') # "아이디라는 값을 보내준다"
driver.find_element_by_name('id').send_keys(login.get("id"))
time.sleep(0.5) ## 0.5초
driver.find_element_by_name('pw').send_keys(login.get("pw"))
저는 id로 test, pw는 abcd를 보냈는데요. 화면에 이렇게 보이네요^^ 신기합니다!
Step 4) 네이버 로그인 버튼 클릭
동일하게, [로그인]버튼 > 오른쪽 마우스 > 검사 > Elements를 보면, type이 submit 임을 알 수 있습니다.
XPath를 복사 합니다.
: 오른쪽 마우스 > Copy > Copy XPath
driver.find_element_by_xpath('//*[@id="log.login"]').click()
안타깝게도 사용자 입력이 아닌 소프트웨어적으로 로그인을 시도하는 것이 발각(?) 되어 캡차 입력창이 열렸습니다.
Step 5) 네이버 캡차 우회하여 로그인 하기
> 참고 : https://hyrama.com/?p=693
참고한 내용에 따르면,
Selenium을 이용하고 있는 대부분의 이용자들은 element.send_keys() 메서드를 이용하여 로그인을 시도했습니다. 그러나 Selenium의 driver를 이용하여 아이디 및 비밀번호를 element.send_keys()메서드를 이용하여 로그인 시도 시 비정상적인 접근 방식으로 네이버 Captcha가 탐지하게 됐습니다.
<< 해결방법 : Key 조합>>
Ctrl+V 키 조합을 element에 보낼 경우 네이버 Captcha가 비정상적인 로그인 시도를 탐지하지 못하고 정상적인 로그인에 성공합니다. Clipboard 기능을 이용하여 아이디 및 비밀번호를 복사한 후에 로그인창에 붙여넣기를 하면 쉽게 네이버 Captcha를 뚫을 수 있습니다.
해당 웹사이트에 소스코드도 오픈되어 있습니다. 이 포스팅에서는 소스코드를 조금 수정하여 사용하였습니다.
** MacOS의 경우는 Ctrl + V => Command+V로 동작하므로, 키 맵을 변경하였습니다.
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
import pyperclip
def clipboard_input(user_xpath, user_input):
temp_user_input = pyperclip.paste() # 사용자 클립보드를 따로 저장
pyperclip.copy(user_input)
driver.find_element_by_xpath(user_xpath).click()
ActionChains(driver).key_down(Keys.COMMAND).send_keys('v').key_up(Keys.COMMAND).perform()
pyperclip.copy(temp_user_input) # 사용자 클립보드에 저장 된 내용을 다시 가져 옴
time.sleep(1)
=> Ctrl+V 조합으로 키를 추가해서 보내는 코드입니다. 함수로 되어 있으니 id/pw를 입력할 때, 해당함수를 호출 하겠습니다.
웹브라우저는 새로고침을 하여 입력이 없는 상태로 만들고, 아래 코드를 수행합니다.
clipboard_input('//*[@id="id"]', login.get("id"))
clipboard_input('//*[@id="pw"]', login.get("pw"))
driver.find_element_by_xpath('//*[@id="log.login"]').click()
로그인이 되었네요!!
Step 6) 브라우저 등록 버튼 클릭
보안을 위해서 로그인등록이 되어 있지 않은 브라우저에서 로그인을 시도하면, 아래와 같은 화면이 나옵니다.
이제 셀리니움을 통해서 [등록] 버튼을 클릭하게 하면 되겠죠?
xpath를 구하는 방법은 step4와 동일합니다. 다시 한번 반복해보시죠~!!
[등록] 버튼 오른쪽 마우스 클릭 > 검사 > Eelements
회색bar에서 오른쪽 마우스 클릭 > Copy > Copy XPath
# 브라우저 등록 클릭
driver.find_element_by_xpath('//*[@id="new.save"]').click()
로그인 성공~~~~
<< 참고 >>
- 웹크롤링이 필요한 이유 : https://ndb796.tistory.com/120
- 셀리니움을 활용한 네이버 자동 로그인 : https://youtu.be/UenvOvag0B4
- 네이버 로그인시 캡차 우회하는 방법 : https://hyrama.com/?p=693
- Selenium API 문서 : https://selenium-python.readthedocs.io/index.html
저작물의 저작권은 작성자에게 있습니다.
공유는 자유롭게 하시되 댓글 남겨주세요~
상업적 용도로는 무단 사용을 금지합니다.
끝까지 읽어주셔서 감사합니다^^