AutoReservation/README.md at main · rlacodls3109/AutoReservation
스크린 골프장 아르바이트하면서 수동으로 해야하는 예약 업무를 Selenium을 이용한 자동화 시스템을 구축하여 간편화 하였다. - rlacodls3109/AutoReservation
github.com
필요성
스크린골프 데스크 아르바이트를 하기 시작했다. 업무 중 하나가 사이트에 들어가 운영시간에 맞추어서 타석을 미리 예약해놓는 것이었다. 보통 오늘로부터 일주일치 정도 예약해놓았었다. 지금까지는 수동으로 하다보니 오래걸리고, 그래서 하루에 1일씩 혹은 근무 중 시간이 많이 남으면 틈틈히 근무자들이 예약하면서 운영해왔다.
나는 예전에 크롤링강의를 들었을 때 공부했던 사이트 자동화 프레임워크인 셀리니움을 이용하여 업무를 간편화할 수 있을 것이라고 생각했다. 그래서 자동 예약 프로그램을 만들었다.
구현하고자 한 것은
1. 오늘날짜로부터 다음달의 모든 날을 예약하는 프로그램을 만든다. 공휴일이 아닌 날에는 운영시간 전체를 예약한다.
2. 공휴일 등으로 인한 단축운영 시 운영시간 전체가 아닌 10~22 로 예약한다.
3. 휴일에는 예약을 하지 않는다.
구현
처음으로 막힌 구간은 로그인 구간이었다. 셀레니움을 통해 프로그램을 실행하고 카카오톡 로그인을 진행하면 기존의 브라우저에서 안뜨던 카카오톡 2단계 인증 요청이 떴다. 로그인까지도 자동으로 실행하고자 하였기 때문에 2차 로그인이 뜨는 것을 방지하기 위해 기존의 크롬 브라우저로 자동화하는 방법을 찾아 구현하였다.
(Selenium) 기존 브라우저 자동화하기
셀레니움을 통해 자동화 프로그램을 작성하고 실행하면, 실행할 때 마다 새로운 브라우저 창이 생성된다. 그러나, 매번 브라우저를 새로 띄워 작업을 진행하게 되면, 중간에 인증절차 (예를 들
ins-life.tistory.com
셀레니움을 통해 화면 조작하는 코드는 위키독스 문서를 참고하였다.
7) 동적 웹크롤링 - selenium으로 화면 조작하기
# Selenium으로 화면 조작하기 selenium은 원하는 화면 상태에 도달할 수 있도록 웹 브라우저를 조작 가능합니다. 예를 들어서, 네이버 메일을 확인하기 위해서 로그…
wikidocs.net
특히 웹사이트 html 코드에 명확히 구분되는 class 나 id가 없는 경우가 많아 Xpath를 카피해서 요소를 찾는 방식을 많이 사용하였다.
구현하면서, Xpath의 규칙성을 찾아 반복문에 적용하는 등 효율적으로 활용해보려고 했다.
for i in range(1,7):
for j in range(1,8):
try:
date = driver.find_element(By.XPATH, f"//*[@id=\"ui-datepicker-div\"]/table/tbody/tr[{i}]/td[{j}]/a")
except:
print("날짜없음")
프로그램이 실행되면서 팝업창이 뜨는 경우가 발생했는데, 이때 팝업창을 끄는 코드를 작성해도 꺼지지않고 프로그램이 종료되었다. 아마도 팝업창이 나타나기 전에 팝업창을 끄는 코드가 먼저 실행되어 그런 오류가 발생하는 것 같았다. time.sleep 명령어로 코드 실행을 조금 미루니 팝업이 정상적으로 닫히고 프로그램이 잘 실행되었다. 팝업창이 나타날 때에 sleep을 적절히 사용하여 혹시 모르는 오류를 방지하는 것이 중요할 것 같다.
driver.find_element(By.XPATH, "//*[@id=\"reservationCancel\"]/div/div[3]/a[2]").click()
time.sleep(0.5)
driver.find_element(By.XPATH, "//*[@id=\"commonAlert\"]/div/div[3]/a").click()
구현 결과
1. 타석예약 프로그램을 실행하면 자동으로 로그인되며, 다음달 1일부터 말일까지, 1번부터 23번의 타석을 운영시간에 맞춰 예약한다.
2. 휴무 시 예약취소 프로그램을 사용하면, 현재 페이지의 날짜에 자동예약으로 예약되어 있던 예약들이 모두 취소된다.
3. 공휴일 지정 프로그램을 사용하면, 현재 페이지의 날짜(평일)에 예약되어 있던 06~23의 운영시간이 10~22로 변경된다.
다른 근무자들도 사용이 쉽도록 사용방법을 작성해놓았다.
지금도 한번씩 프로그램을 작동시켜보면서 발생하는 변수를 확인하여 유지보수하고 있다. 업무가 하나 줄어 근무시간을 효율적으로 사용할 수 있게 되었다는게 내가 하고자했던 목표에 도달한 것 같아 뿌듯했다.
아쉬운 점은 날짜 데이터를 받아 공휴일인지 아닌지 확인하고 공휴일에는 예약을 아예 하지 않는 방식으로 구현하고 싶었다.
비록 구현하고자 했던 것을 한 프로그램으로 통합하지는 못했으나, 개인사업장이다보니 특정 공휴일에만 쉬는 것이 아니라 프로그램을 각각 만든 것도 좋은 생각인 것 같다.
만약 나중에 발전시킬 수 있다면, 미리 단축운영, 휴무의 스케줄을 물어본 후, 처음부터 그에 맞게 예약하도록 프로그램을 구현해보고 싶다.
'프로젝트 및 활동 > Project' 카테고리의 다른 글
[2023-2 스터디] 두 달 간의 웹 스터디 미니프로젝트 회고록 (0) | 2024.05.27 |
---|