오랜만입니다!
요즘 온 나라가 코로나 바이러스 때문에 힘드네요 ㅠㅠ
저도 학교 개강이 미뤄지고 싸이버강의를 들으며 공부하고 있습니다. 원래는 개강하기 전에 완성하려고 했던 디스코드 학식봇을 지금 완성해서, 파이썬을 사용하여 학식을 크롤링하고, 디스코드로 데이터를 보내주는 방법에 대해 설명하고자 합니다.
왜 디스코드인가?
제가 전에 사용하던 카카오톡 자동응답 학식봇이 운영을 종료함에 따라, 제가 생각할 수 있는 최고의 플랫폼은 디스코드입니다. 디스코드는 리눅스, 윈도우, 안드로이드, 아이폰.. 등등 여러가지 OS에서 사용이 가능하며 하나의 프로젝트로 여러가지 플랫폼을 노릴 수 있는 가능성을 갖고 있습니다. 특히 제 경우에는 안드로이드랑 리눅스를 자주 쓰니깐 오히려 카카오톡보다도 가까울 수 있는 플랫폼이 디스코드가 아닐까 생각합니다.
일단 설명하기에 앞서, 제가 만든 학식봇을 사용해보실 수 있는 링크입니다.
https://discordapp.com/oauth2/authorize?client_id=686581468901802035&permissions=67584&scope=bot
Discord - Free voice and text chat for gamers
Step up your game with a modern voice & text chat app. Crystal clear voice, multiple server and channel support, mobile apps, and more. Get your free server now!
discordapp.com
또한 전체 코드도 공개해 두었으니,
깃헙에서 확인해주시면 됩니다!
https://github.com/sheepjin99/discord_DGUcafeteria
이와 같은 디스코드 봇을 생각보다 쉽게 만들 수 있습니다.
일단 디스코드 봇을 만들기 전에, 몇가지 순서를 생각했습니다.
첫 번째, 동국대학교 학식 메뉴를 크롤링하는 스크립트를 짜고, 모듈화하기
두 번째, 디스코드 봇의 틀을 만들고 명령어와 답장 메세지 구현하기
세 번째, 서버에서 디스코드 봇을 실행시키고 디스코드 봇 꾸미기
이번 포스트는 첫번째 단계에 대해 설명하겠습니다.
운이 좋게도, 학식페이지를 크롤링하는건 큰 문제가 아닙니다. 왜냐면 우리가 사용할 언어가 파이썬이기 때문이죠. 파이썬은 BeautifulSoup4라는 유명한 크롤링 패키지를 사용하면 웹페이지에서 무궁무진하게 데이터를 가져올 수 있답니다.
일단 데이터를 뽑아낼 타겟 페이지를 확인합니다. 여기서 주의하실 점은, 학교 학식 페이지의 모바일 버전이 존재하는지 여부를 확인하세요. 저같은 경우는 데스크톱 버전의 웹페이지에서 크롤링을 하다가, 코로나 바이러스 때문에 식당이 문을 닫자 식단표 테이블의 인덱스가 줄어들어 안정적이지 못한 스크립트를 만들었습니다.
그런데 모바일 페이지를 확인해보니 훨씬 세분화되어 있는 식단 테이블이 있어서 타겟 페이지를 모바일로 바꾸니 훨씬 안정적으로 데이터를 보낼 수 있는 스크립트를 짤 수 있었습니다.
https://github.com/sheepjin99/DonggukCafeteria
제가 삽질한 결과는 이 위의 깃헙 링크에서 확인하실 수 있습니다.
그럼, 지금부터 모바일 학식페이지 크롤링하는 법입니다.
구글 크롬을 키고, 설정 - 도구더보기 - 확장 프로그램에 들어갑니다. 이후 좌측 상단의 햄버거 버튼을 누르면 좌측 하단에 'Chrome 웹 스토어 열기'에 들어갑니다.
이후 웹 스토어에서 'user agent'라는 키워드로 검색을 하고, 아무거나 마음에 드는 확장 프로그램을 설치합니다
저는 세 번째 확장 프로그램을 사용했습니다.
이후 확장 프로그램을 실행시키고,
Chrome on Android Mobile을 선택하면, 앞으로 들어가는 모든 웹페이지가 모바일로 인식됩니다.
(Default로 바꾸면 해제됩니다.)
이후 웹 브라우저에서 자신의 학교 식당 데이터가 있는 홈페이지에 들어갑니다.
저희 동국대학교의 경우, http://dgucoop.dongguk.edu/mobile/
동국대생협
dgucoop.dongguk.edu
동국대학교 생협 홈페이지에 데이터가 올라옵니다.
이후 학식 정보가 올라오는 HTML <table>이 있을겁니다.
이제 파이썬으로 돌아와, 저 웹사이트와 비교해가며 간단하게 코드를 작성해봅니다.
일단 처음엔 패키지를 불러옵니다. 우리가 불러올 패키지는 두 가지네요.
from urllib.request import urlopen
from bs4 import BeautifulSoup
url을 열고, 데이터를 BeautifulSoup으로 가져오기 위한 절차입니다.
html = urlopen("http://dgucoop.dongguk.edu/mobile/menu.html?code=5")
source = html.read()
html.close()
html을 열고, 읽은 다음 닫습니다.
이후 파싱을 위한 함수를 작성합니다.
def sangrok_3f(tr,td):
tasty_soup = BeautifulSoup(source, "lxml")
tables = tasty_soup.find("table")
menu_table = tables
menu_tr = menu_table.find_all('tr')
cafeteria = menu_tr[tr]
for span in tasty_soup.find_all("span"):
span.replace_with("\n")
menu_td = cafeteria.find_all('td')
result = str(menu_td[td].text)
if result is "":
result = "데이터가 없습니다."
return result
tasty_soup 변수 안에 BeautifulSoup 모듈안에 html 소스와 파싱을 위해 필요한 파서를 넣어줍니다. 이후 table을 찾고, 그 table안의 tr을 모두 찾습니다. 그 이후 td를 찾아 tr과 td가 맞닿는 장소에 있는 데이터를 뽑아냅니다. (데이터가 없는 경우에는 아무것도 표시되지 않기 떄문에, 데이터가 없습니다 라고 우리가 알려줍시다.)
중간에 for span in tasty_soup.find_all("span")은, 파이썬이 크롤링을 할때 모든 데이터를 마구 가져오기 때문에, 인간이 보기에 좋은것은 알지 못합니다. 따라서 가독성을 높혀주기 위해 넣었습니다. (가격 데이터가 span 태그 안에 있었기에, span 태그를 '\n'으로 바꿔, 줄을 넘겼습니다.)
벌써 끝났습니다! 이제 남은건 우리가 원하는 데이터가 table의 어디에 위치하는지만 알아내면 끝이에요.
혹시, lxml이 설치되어 있지 않으면 오류가 날 수 있습니다.
cmd 혹은 터미널에서 pip install lxml을 해주세요!
다들 아시다시피, 컴퓨터의 배열은 무조건 0부터 시작이죠? 따라서 상록원 3층의 집밥코너의 중식메뉴는 (1,1), 그리고 현재는 없지만 원래라면 있었어야 할 상록원 3층의 한그릇코너의 석식메뉴는 (2,2)에 위치하고 있습니다. 그리고 동국대의 명물 채식당은 (3,1)입니다. 석식과 중식이 나뉘어있지 않아, 만약에 sangrok_3f(3,2)를 넣으면 index error를 볼 수 있을거에요.
그렇다고 매번 우리가 저 숫자를 기억하고 데이터를 불러오기에는 무리가 있겠죠?
알아보기 쉽게 상수에 저장을 해둡시다. (파이썬에는 상수 개념이 없지만 재사용하지 않으면 상수인걸로...)
sangrok_3f_jipbab_lunch = sangrok_3f(1,1)
sangrok_3f_jipbab_dinner = sangrok_3f(1,2)
sangrok_3f_hangurut_lunch = sangrok_3f(2,1)
sangrok_3f_hangurut_dinner = sangrok_3f(2,2)
sangrok_3f_vegeterian = sangrok_3f(3,1)
짜잔! 이런식으로 계~~~~~~~~속 데이터를 뽑아오면 됩니다.
파싱은 원래 노가다입니다 ㅎㅎ... 제가 이걸 처음배운게 고등학교때 동아리 담당 선생님께 배웠었거든요, 감회가 새롭네요.
마찬가지로 위와 같은 과정을 상록원2층, 상록원1층, 그루터기, 가든쿡, 기숙사식당 모두 해주면 됩니다. (아니면 제거 쓰셔도 되구요)
노가다를 마치셨으면, 이제 디스코드 봇을 만들어봐야겠죠? 디스코드 봇 만드는 방법은 다음 포스트로 이어집니다.
https://sheepjin99.tistory.com/22
학식 데이터를 크롤링하는 파이썬코드로 디스코드 학식 봇 만들기 (2/3)
https://sheepjin99.tistory.com/21 이 포스트를 읽기 이전에 읽어두시면 좋은 1편입니다. 학식 데이터를 크롤링하는 파이썬코드로 디스코드 학식 봇 만들기 (1/3) 오랜만입니다! 요즘 온 나라가 코로나 바이러스..
sheepjin99.tistory.com
읽어주셔서 감사합니다! ㅎㅎ 하트 눌러주시면 많은 도움이 됩니당
'소프트웨어 > Python' 카테고리의 다른 글
AI 모델 보안 강화 연구 (feat. Adversarial Robustness Toolbox) (1) | 2021.07.02 |
---|---|
학식 데이터를 크롤링하는 파이썬코드로 디스코드 학식 봇 만들기 (2/3) (0) | 2020.03.20 |