-
카카오톡 인천대학교 학식봇 만들기(크롤링) - 3App 2021. 7. 1. 21:23
td 찾는 부분 함수화 + 버그 픽스
거의 완성되었다. 지난번에 발생한 같은 요일의 식단만 계속해서 크롤링해오는 버그를 픽스하고, 대대적으로 코드를 정리했다.
from bs4 import BeautifulSoup # 크롤링을 위해 bs4 라이브러리 사용 from urllib.request import urlopen from tqdm.notebook import tqdm # 반복문의 진행 상태를 디스플레이해줄 tqdm 라이브러리 사용 today_menu_list = [[]] # 하루당 총 메뉴 개수 24개, 1일 not_today_menu_list = [] # 당일 메뉴를 제외한 6일 for i in range(6): line = [] not_today_menu_list.append(line) def find_td(selected_menu, result_list, index): for menu_sub_list in selected_menu: # select는 상단의 코드에서 복수의 td들을 ResultSet(일종의 List형태)로 가져오므로, 반복문을 통해서 각각의 요소들을 get_text()로 처리해줘야함 oneday_menuplan = menu_sub_list.get_text().split('\n') # 한칸에 모든 메뉴가 \n으로 나누어져있음 for j in range(len(oneday_menuplan)): if (oneday_menuplan[j] is '\r' or # 메뉴가 게재된칸에는 가격정보와 제공시간이 적혀있으므로, 메뉴만 얻기위해 예외처리 oneday_menuplan[j][0] is '*' or oneday_menuplan[j][0] is '[' or oneday_menuplan[j][0] is '(' or oneday_menuplan[j][0] is '❝' ): break elif oneday_menuplan[j][0] is '<': # <즉석조리기기>칸의 라면 메뉴들을 가져오기위한 예외처리 continue else: if '국밥' in oneday_menuplan[j]: # 국밥칸에서 칼로리 정보를 제외하고 메뉴 이름만 가져오기위한 예외처리 result_list[index].append(oneday_menuplan[j][:4].strip()) else: result_list[index].append(oneday_menuplan[j].strip()) url = "https://www.uicoop.ac.kr/main.php?mkey=2&w=2&l=1" html = urlopen(url) soup = BeautifulSoup(html, "html.parser") # 원하는 태그 정보를 뽑아줄 bs4 인스턴스 생성 temp = 0 for tr_menu in soup.find(id='menuBox').find_all('tr'): # menuBox라는 이름을 가진 테이블에서 한줄씩 뽑아냄 not_today_menu = tr_menu.select('.din_list') today_menu = tr_menu.select('.din_lists') if not_today_menu: # 찾은 내용이 있을 경우 find_td(not_today_menu, not_today_menu_list, temp) temp += 1 if today_menu: find_td(today_menu, today_menu_list, 0) for i in range(len(not_today_menu_list)): # 토,일 메뉴 제거 ❝ 해당 기호 처리 안됨 if not_today_menu_list[i]: not_today_menu_list[i].pop() not_today_menu_list[i].pop() for i in range(len(not_today_menu_list)): for j in range(len(not_today_menu_list[i])): print(not_today_menu_list[i][j], end=' ') print(' ') print('오늘 메뉴', today_menu_list)
오늘 메뉴를 가진 today_menu_list, 다른 날의 메뉴를 가진 not_today_menu_list로 따로 나누어서 저장했다.
각 리스트의 첫번째 인덱스 : 중식, 석식, 라면 등 메뉴 종류
두번째 인덱스 : 메뉴
리스트에 정상적으로 저장되긴 했지만, 인덱싱이 요일별로 되어있지 않으므로 다음에는 슬라이싱으로 리스트를 손보는것 방향으로 진행될듯.
// 당일 메뉴만 class명이 다른 사실로인해 인덱싱은 귀찮지만,, 나중에 봇이 크롤링 해올 때는 더 편할것 같다.
어차피 당일 메뉴 출력 기능이 필요할것이기 때문.
'App' 카테고리의 다른 글
카카오톡 인천대학교 학식봇 만들기(AWS Lambda) - 5 (0) 2021.07.05 카카오톡 인천대학교 학식봇 만들기(크롤링) - 4 (0) 2021.07.02 카카오톡 인천대학교 학식봇 만들기 (크롤링)- 2 (0) 2021.06.29 카카오톡 인천대학교 학식봇 만들기 - 1 (0) 2021.06.29 MVVM 아키텍쳐 (0) 2021.02.10