[Python] 네이버 매크로 selenium 본문
네이버에서 xx을 예약을 하기 위해 매크로를 만들다가 한 번 올려봐야겠다는 생각을 했다.
그러면서 한편으로는.. 개발자 분들은 이런 매크로 막으려고 고생이 많으시겠구나. 생각이 들었습니다요. 지송합니다요.
부르트 포스로 서버 부하 걸리지 않게 패킷은 한 번만 짧게 보내는 것으로 할게요.
selenium이라는 모듈을 사용하면 아주 아주 편하다.
여러 브라우저의 WebDriver API를 제공하는데 나는 크롬을 주로 쓰니까 크롬으로 해보자.
우선 크롬 웹 드라이버를 다운로드한다.
https://chromedriver.chromium.org/downloads
자신의 컴퓨터에 깔린 크롬과 버전이 동일한 웹 드라이버를 받아야 하는데 현재 자신의 크롬 버전을 알려면
[크롬 -> 환경설정 -> Chrome 정보]로 확인하면 된다.
버전에 맞는 크롬 드라이버를 받았으면 파이썬을 설치한 경로에 bin 디렉터리 안에 넣어 주면 된다.
그럼 이제 본격적으로 코드 작성을 해보자
#!/usr/bin/env python3
# -*- coding: utf8 -*-
from selenium import webdriver
웹 드라이버 임포트부터 한다.
driver = webdriver.Chrome('chromedriver')
driver.execute_script('window.open("about:blank, _blank");')
login(driver)
타이밍을 맞추기 위해 로그인을 한 다음 탭을 하나 더 열어서 예약 페이지에 접속하는 방식을 사용하기로 했다.
탭을 하나 더 여는 것은 두 번째 라인처럼 window.open을 사용해서 탭을 하나 더 열어 주면 된다.
login 함수를 호출했다.
def login(wd):
tabs = wd.window_handles
wd.switch_to_window(tabs[0])
wd.get('http://nid.naver.com/nidlogin.login')
wd.implicitly_wait(3)
wd.find_element_by_name('id').send_keys('id')
wd.find_element_by_name('pw').send_keys('pw')
wd.find_element_by_xpath('//*[@id="log.login"]').click()
reservation(wd)
login 함수는 위와 같이 정의되어 있다. id, pw를 넣는 곳의 element를 찾아서 실제 id와 pw를 send_keys로 값을 넣어주고 로그인 버튼을 클릭해 주면 된다.
** 현재 send_keys로 값을 보내는 게 자동 로그인에서 막혀 있는데 copy, paste로 우회하는 방법을 다음에 올려보자..**
로그인 버튼을 찾을 때는 xpath(XML Path Language)라는 걸 사용했다.
우선 F12를 눌러 개발자 도구를 연다.
개발자 도구 맨 왼쪽에 보면 화살표 모양의 element를 선택하면 소스코드를 찾아주는 기능이 있다.
클릭하고 화면으로 돌아와 xpath가 알고 싶은 곳 위에 마우스를 올린 후 클릭한다.
그러면 마우스를 따라 움직이던 소스코드가 고정된다.
소스 코드 위에서 마우스 우클릭을 눌러 XPath를 복사해주면 끝.
def reservation(wd):
tabs = wd.window_handles
wd.switch_to_window(tabs[1])
wd.get('네이버 예약 사이트 주소')
wd.implicitly_wait(3)
wd.find_element_by_xpath('').click()
wd.find_element_by_xpath('').click()
wd.find_element_by_xpath('').click()
이런 식으로 reservation함수에서는 이전에 열어두었던 탭에서 예약하고자 하는 곳의 페이지를 열어 xpath를 클릭 클릭해주면 매크로 작성이 끝난다.
'프로그래밍 > Python' 카테고리의 다른 글
[python] pyinstaller 로 windows 실행파일 만들기 (0) | 2021.12.15 |
---|---|
[Python] PyCharm 플러그인 설치 (0) | 2020.09.19 |
[Python] 함수 정의 _ argument / parameter (0) | 2020.02.03 |
[Python] 함수 정의하기 (0) | 2020.01.31 |
[Python] 제어문(if 문), 반복문(for 문, while 문) (0) | 2020.01.28 |