webdriver를 이용하면 특정 페이지를 프로그램으로 동작시킬 수 있습니다. 그 과정을 설명합니다.

 

우선 webdriver가 사용할 브라우저를 가져와야합니다.

 

Chrom : sites.google.com/a/chromium.org/chromedriver/downloads

 

Downloads - ChromeDriver - WebDriver for Chrome

WebDriver for Chrome

sites.google.com

다운 받은 chromedriver.exe 파일을 적당한 곳에 복사해둡니다. 향후 프로그램에서 chromedriver.exe가 있는 곳의 path를 사용하여야 하므로 위치를 꼭 기억해두어야 합니다.

 

웹드라이버를 이용하여 네이버 로그인을 자동으로 하는 파이썬 예제가 많이 있습니다. 이 중 하나를 기반으로 동작하는지 확인해보겠습니다.

 

# -*- coding: utf-8 -*-

from bs4 import BeautifulSoup

from selenium import webdriver

import time

 

driver = webdriver.Chrome("C:\\my\\chromedriver.exe")

if 1:

   driver.get("https://nid.naver.com/nidlogin.login")

   elem = driver.find_element_by_name("id")

   elem.clear()

   elem.send_keys("myid")

   pw = driver.find_element_by_name("pw")

   pw.send_keys("mypasswd")

   time.sleep(1)

   form = driver.find_element_by_id('frmNIDLogin')

   form.submit()

   time.sleep(3)

 

결과는 아래와 같습니다. 정상적으로 동작을 하지만 naver에서 프로그램으로 로그인한 것을 인지합니다. 그래서 추가로 자동입력방지 문자를 입력하는 창이 뜹니다. 

 

 

user id와 암호를 입력하는 부분을 찾는 방법입니다.

크롬 개발자도구로 들어가면 해당 페이지의 소스를 볼 수 있습니다. 소스를 보면 아래 그림과 같이 'id', 'pw'라는 id를 사용하는 것을 알 수 있습니다.

 

 

아래 함수를 이용하여 원하는 객체를 얻을 수 있습니다. user id 창을 우선 비운 후 send_key라는 함수로 본인의 id를 전송하면 화면에 해당 id가 보입니다.

 

   elem = driver.find_element_by_name("id")

   elem.clear()

   elem.send_keys("myid")

 

같은 방식으로 암호도 전송합니다. 

 

다음은 로그인 버튼을 찾아봅니다. html 소스에서 로그인에 해당하는 부분을 찾습니다. form 형태로 구성이 되어 있군요. form id에 해당하는 form을 찾은 후 submit() 함수를 이용하면 클릭한 효과가 나옵니다.

 

form = driver.find_element_by_id('frmNIDLogin')

form.submit()

 

앞에서 언급한 것과 같이 네이버 정책상 자동 로그인은 막아놓았습니다. 그래서 로그인을 하려면 추가로 이미지에 나오는 문자를 입력하여야 합니다. 이건 자동으로 하기는 어려운 부분이니 수동으로 해야합니다.

 

다음에는 네이버 주식 정보 중 일일 데이터를 얻어오는 방법에 대하여 설명합니다. 

 

 

반응형

설정

트랙백

댓글

command line 형태로 프로그램을 개발하다보면 사용자가 입력을 하여야 다음으로 넘어가게 됩니다. 대부분의 경우에는 이렇게 개발하면 됩니다. 그런데 경우에 따라 일정기간 사용자 입력이 없으면 다음으로 넘어가야하는 경우도 있습니다. 예를들어 자동으로 trading하는 프로그램의 경우에 사용자 입력이 없으면 trading할 대상이 있는지 확인하는 부분으로 넘어가는 기능이 필요합니다.

파이썬에서 제공하는 기본 입력함수는 input() 입니다. 아래와 같이 사용하는데, 사용자가 입력하고 enter를 칠때 까지 멈춰있습니다.

 

사용자가 입력할 때 까지 계속 기다리는 input()

 

제가 필요한 것은 일정 시간동안 입력이 없으면 자동으로 default 입력 값으로 이 줄을 실행하는 것입니다. 열심히 구굴링을 해보니, 역시나 좋은 예제 코드가 있더군요.

 

방법은 msvcrt.kbhit() 라고 하는 keyboard 입력 여부를 확인할 수 있는 함수를 이용하는 것입니다. 동작방식은 간단합니다. 무한정 loop를 돌면서 keyboard 입력이 있었다면 한 글자 읽어옵니다. 이걸 반복하다가 enter키가 들어오면 모아서 돌려줍니다. 만약 keyboard 입력이 없었다면 기다리는 시간이 지났는지 확인하여 만약 대기 시간이 지났으면 default 값을 돌려줍니다.

이러한 일을 수행하는 코드를 만들기 위해서는 아래 함수를 사용하여야 합니다.

 

msvcrt.kbhit() : 키보드가 눌리어졌는지 확인

msvcrt.getche() : 눌리어진 한 문자 받아오기

 

일정 시간 동안 입력이 없으면 자동으로 default 값을 돌려주는 input 함수는 아래 github에 있습니다.

 

https://github.com/multizone-quant/system-trading/blob/master/get_default_input_after_limited_waiting_time

반응형

설정

트랙백

댓글