본문 바로가기
Develop/Python

[Python/셀레니움/크롤링] 고려대학교 학식 식단표 알리미 만들기 - 1

by favorcat 2023. 9. 7.
반응형

동기

  • 학식 식단표를 볼 수 있는 페이지가 있으나, 오늘의 식단표를 보려면 오늘 날짜를 찾아서 스크롤을 해야하는 번거로움
  • 호잇 어플에서도 식사 탭을 클릭하면 볼 수 있으나, 위와 마찬가지로 스크롤을 해야하는 번거로움

학부를 다니며 수많은 크롤링을 해봤으니.. 간단하게 식단표 크롤링 하는 것은 금방 만들 수 있었다.

식단표 주소: https://www.korea.ac.kr/user/restaurantMenuAllList.do?siteId=university&id=university_050402000000 

 

대학생활|시설이용|식당안내

식당안내  인쇄하기 글자크기 확대 축소 수당삼양패컬티하우스 송림 위치 : 수당삼양패컬티하우스 3층 이용시간 : 점심 : 11:30~14:00(라스트오더 13:30) 저녁 : 17:00~21:00(라스트오더 (19:30), 3층 석식

www.korea.ac.kr

1. selenium 드라이버 설정

셀레니움이 원래 크롬드라이버를 다운받고 드라이버 경로를 설정해 주어야 했는데, 최근 버전에서는 드라이버 경로 없이 `webdriver.Chrome()`만 하면 된다. 

from selenium import webdriver  # 웹수집 자동화를 위한 크롬 드라이버 호출
from selenium.webdriver.common.by import By

options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ["enable-logging"])
driver = webdriver.Chrome()  # 크롬 드라이버 경로 설정

driver.get("https://www.korea.ac.kr/user/restaurantMenuAllList.do?siteId=university&id=university_050402000000")

2. XPATH 확인하기

나는 자연계 학생식당을 이용하므로 애기능만 크롤링 했다.

full xpath를 가져오면 `/html/body/div[4]/div[2]/div[2]/div[2]/div/ul/li[2]/ol[1]/li/div`를 확인할 수 있다.
여기서 빨간색으로 표기된 곳의 배열을 수정하면 요일별로 선택이 된다.

2. 요일에 따른 식단표 불러오기

오늘 날짜에 맞는 식단표를 가져오기 위해서 datetime 패키지를 이용했다.
datetime을 통해 요일을 가져오면 월요일부터 0을 반환한다.
xpath에서 월요일을 뜻하는 것은 1부터 시작하니 +1을 해주면 오늘 날짜에 맞는 식단표를 가져올 수 있게 된다.

today = datetime.today().weekday()

path = f'/html/body/div[4]/div[2]/div[2]/div[2]/div/ul/li[2]/ol[{today+1}]/li/div'

3. 메뉴 긁어오기

식단표가 학생식당과 교직원식당으로 구분되어 있어서 이를 자르기 위해서 '['을 기준으로 split 했다.
그리고 조식,중식,석식에 따른 구분은 '▶'로 split 했다.

학생식당과 교직원식당의 운영시간이 다르므로 각 배열의 길이만큼 반복해서 문자열을 만들었다.
그리고 최종적으로 보낼 메세지를 만들었다.

결국에 만들어지는 문자열은 처음 메뉴를 긁어온 상태와 거의 똑같은데 이렇게 한 이유는, 나중에 보내질 메세지를 다듬어서 시간대별로(조식, 중식, 석식) 보내기 위해서 이렇게 했다.

menulist = driver.find_element(By.XPATH,path).text.split('[')
studnet_menu = menulist[1].split('▶')
staff_menu = menulist[2].split('▶')

#학생식당
student_menulist = '[학생식당] - 5,000원\n'
for i in range(1, len(studnet_menu)):
  student_menulist += "\n▶" + studnet_menu[i]

#교직원식당
staff_menulist = '[교직원식당]\n'
for i in range(1, len(staff_menu)):
  staff_menulist += "\n▶" + staff_menu[i]

sendText = student_menulist + "\n" + staff_menulist

전체 코드: https://github.com/favorcat/KU-menu-chatbot/blob/master/crawler.py

다음 편에서는 카카오톡 메시지 API를 이용해 동기들에게 카톡으로 알림을 주는 챗휴먼이 되는 방법을 포스팅..

 

[카카오톡/챗봇/API] 고려대학교 학식 식단표 알리미 만들기 - 2

[Python/셀레니움/크롤링] 고려대학교 학식 식단표 알리미 만들기 - 1 동기 학식 식단표를 볼 수 있는 페이지가 있으나, 오늘의 식단표를 보려면 오늘 날짜를 찾아서 스크롤을 해야하는 번거로움

blog.favorcat.dev

 

반응형

Comment