ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 카카오톡 인천대학교 학식봇 만들기 - 1
    App 2021. 6. 29. 21:23

    학교 학식 메뉴들을 크롤링 해온 후 카카오톡 채팅봇에 적용시켜 관련내용 확인 및 히스토리 저장기능을 기본적으로 가지고 있는 봇을 만들고자한다.

    어제부터 시작한 토이프로젝트로, 어제 작성한 코드를 포함하고있다.

     

    사용언어 : Python

    사용할 기술 스택들 : AWS, Pycharm

     

    1. 파이썬으로 코딩 후, AWS를 이용해 서버에 올림

     

    2. DynamoDB를 이용한 사용자별 과거 선택한 학식 기록

     

    3. 위의 기능들을 카카오 오픈 빌더의 스킬에 적용시켜 봇 형태로 서비스 제공

     

     

     

    첫날에는, 먼저 크롤링 기능을 구현하는 코드를 작성했다.

     

    from bs4 import BeautifulSoup # 크롤링을 위해 bs4 라이브러리 사용
    from urllib.request import urlopen
    from tqdm.notebook import tqdm # 반복문의 진행 상태를 디스플레이해줄 tqdm 라이브러리 사용
    
    menu_list = []
    is_Today = False # 학식 메뉴를 제공하는 웹페이지에 게재된 표에서, 당일 메뉴의 td만 클래스명이 다르기 때문에 이용 할 Boolean 변수
    
    for i in tqdm(range(2)):
        url = "https://www.uicoop.ac.kr/main.php?mkey=2&w=2&l=1"
        html = urlopen(url)
        soup = BeautifulSoup(html, "html.parser") # 원하는 태그 정보를 뽑아줄 bs4 인스턴스 생성
    
        for tr_menu in soup.find(id='menuBox').find_all('tr'): # menuBox라는 이름을 가진 테이블에서 한줄씩 뽑아냄
            if is_Today is False: # 당일 메뉴와, 이번주 메뉴들을 모두 제공하기위해 클래스명을 조정
                menu = tr_menu.find(class_ = 'din_lists')
                is_Today = True
            else:
                menu = tr_menu.find(class_ = 'din_list')
    
            if menu: # 찾은 내용이 있을 경우
                menu_sub_list = menu.get_text().split('\n') # 한칸에 모든 메뉴가 \n으로 나누어져있음
                for i in range(len(menu_sub_list)):
                    if(menu_sub_list[i] is '\r' or # 메뉴가 게재된칸에는 가격정보와 제공시간이 적혀있으므로, 메뉴만 얻기위해 예외처리
                        menu_sub_list[i][0] is '*' or
                        menu_sub_list[i][0] is '[' or
                        menu_sub_list[i][0] is '('
                    ):
                        break
                    elif menu_sub_list[i][0] is '<': # <즉석조리기기>칸의 라면 메뉴들을 가져오기위한 예외처리
                        continue
                    else:
                        if '국밥' in menu_sub_list[i]: # 국밥칸에서 칼로리 정보를 제외하고 메뉴 이름만 가져오기위한 예외처리
                            print(menu_sub_list[i][:4])
                        else:
                            print(menu_sub_list[i])

     

    학식 메뉴 테이블 한칸 예시 사진

     

     

    좌측 사진에서 볼 수 있듯이, \n으로 각각의 메뉴가 나누어져 있다.

    하단의 가격 정보와 식사 제공 시간은 쓸모가 없으므로, 모두 예외처리를 해주었다.

     

     

     

     

     

     

     

    완성된 코드는 아니며, 당일 정보만 받아올 수 있는 상태에서 종료했다. 지금은 크롤링이 제대로 되는지 확인하기위해 임시로 print 함수를 이용해 출력했다.

Designed by Tistory.