반응형
기존 확장프로그램으로 쓰던 SRT 예매 매크로가 막혀서 손크로를 할 수 밖에 없다.
하지만 그러기에는 너무 귀찮기때문에 파이썬과 셀레니움을 통해서 만들어 보도록 하자.
개발공부하는 겸해서 겸사겸사 만들어 보도록 하겠다.
이것은 어떻게 개발을 했는지 흔적을 남기기 위해서 작성하는 글이다.
잘 만들어져가지고 완성되면 나 혼자 잘 써야겠다.ㅎㅎㅎ
먼저 개발했던 사람이 있어서 해당 분의 소스코드를 기반으로 커스터마이징을 진행할 것이다.
위 블로거의 소스코드를 기반으로 커스터마이징을 진행할 것이다.
(초반 설계가 힘든데 다 해주셔서 공수를 많이 줄일 수 있을거 같다.. 위 블로그도 들려주길 바란다)
해당 블로그의 소스코드를 하나 하나씩 타이핑하여 적었다. 앞으로 수정할 부분을 이번 글에 나열해보겠다.
더보기
# -*- coding: utf-8 -*-
import os
import sys
import datetime
import requests
from time import sleep
from random import randint
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.support.ui import Select
def open_browser():
options = webdriver.ChromeOptions()
#option.add_argument('headlees')
options.add_argument('window-size=1920x1080')
options.add_argument("disable-gpu")
driver = webdriver.Chrome("C:\selenium\chromedriver", chrome_options=options)
return driver
def run():
driver = open_browser()
driver.get('https://etk.srail.co.kr/cmc/01/selectLoginForm.do')
driver.implicitly_wait(15)
driver.find_element_by_id('srchDvNm01').send_keys("SRT 회원번호") #아이디
driver.find_element_by_id('hmpgPwdCphd01').send_keys("SRT 비밀번호") #비번
driver.find_element_by_xpath('//*[@id="login-form"]/fieldset/div[1]/div[1]/div[2]/div/div[2]/input').click()('//*[@id="login-form"]/fieldset/div[1]/div[1]/div[2]/div/div[2]/input').click()
# 보내기
driver.implicitly_wait(4)
sleep(0.4)
driver.find_element_by_xpath('//*[@id="search-form"]/fieldset/div[1]/a').click() # 도착, 시간 등
driver.implicitly_wait(1)
driver.find_element_by_id("ui-id-{}".format(dpt_locs[dpt])).click() #도착지
sleep(0.4)
driver.find_element_by_xpath('//*[@id="search-form"]/fieldset/div[2]/a').click()
driver.implicitly_wait(1)
driver.find_element_by_id("ui-id-{}".format(avl_locs[avl])).click() #출발지
date_ele = driver.find_element_by_xpath('//*[@id="search-form"]/fieldset/div[3]/div/input[1]')
driver.execute_script("arguments[0].setAttribute('value','{}')".format(dpt_date), date_ele)
driver.find_element_by_xpath('//*[@id="search-form"]/fieldset/div[4]/a').click()
driver.find_element_by_xpath('//*[@id="search-form"]/fieldset/a').click()
driver.implicitly_wait(4)
sleep(0.4)
counter =1
while True:
soup = BeautifulSoup(driver.page_source,'html.parser')
trlist = soup.select('#result-form > fieldset > div.tbl_wrap.th_thead > table > tbody > tr')
index=0
done=False
for tdl in trlist:
if done ==False:
index += 1
for train_no in train_nums:
if tdl.select('.trnNo')[0].text.strip() == str(train_no):
if '예약하기' in tdl.select("td")[6].find_all(text='예약하기'):
t = "#result-form > fieldset > div.tbl_wrap.th_thead > table > tbody > tr:nth-child(" + str(index) + ") > td:nth-child(7) > a"
driver.find_element_by_css_selector(t).click()
print("예약완료----------------------------------------------------------")
done=True
break
else:
sleep(0.3)
else:
break
print("loop done. count : {}".format(counter))
sleep(randint(5,10))
if done == False:
elm = driver.find_element_by_xpath('//*[@id="search_top_tag"]/input')
driver.execute_script("arguments[0].click();", elm)
driver.implicitly_wait(2)
counter+=1
else:
driver.quit()
break
if counter > 240:
print("loop 2004 done")
break
if __name__ == "__main__":
dpt = input("출발지 입력 (ex 동탄, 울산, 동대구, 수서, 천안아산) : ")
avl = input("도착지 입력 - 출발지랑 마찬가지")
dpt_date = input("날짜 입력. 반드시 2019.12.31 형태 : ")
when = input("6시 or 16시 둘중 하나 : ")
train_nums = list(map(int,input("기차 번호 입력 스페이스바로 구분 : ").strip().split()))
run()
1. SRT 회원번호가 아닌 이메일주소로 로그인 및 이메일 주소,비밀번호 입력받아서 처리(run,25 / main)
1-1. 로그인 실패시 다시 진행할 수 있도록
2. 출발지 및 도착지를 바로 확인해서 입력할 수 있도록 처리
3. 출발지 및 도착지 에러나는거 수정(33,37)
4. 예약하기 및 예약대기 부분 바뀐거 맞춰서 찾을 수 있도록 하기
5. 6시 or 16시 형태를 바꿀 수 있는거 고민
6. 예매가 되면 트럼펫이나 아무거나 소리나게 만들기
7. 접근성 좋게 exe나 이거저것으로 고치기
8. 이거를 기반으로 각 기능별로 포스팅하면 좋을 듯
반응형
'Develop > Python' 카테고리의 다른 글
Python3(파이썬3) Selenium(셀레니움) 환경에서 자동로그인 만들기(제작) (0) | 2021.02.02 |
---|---|
Python3(파이썬3) Selenium(셀레니움) 크롬(Chrome) 실행 (0) | 2021.02.02 |
파이참(Pycharm)에서 pip 대신 패키지 설치하기(feat. 셀레니움/Selenium) (0) | 2021.01.23 |
파이참(Pycharm)으로 파이썬3(Python3) 환경 구축하기 (0) | 2021.01.23 |
Python AttributeError: module 'random' has no attribute 'choice' 해결방법 (0) | 2017.06.03 |
최근댓글