Ubuntu 16.04.3과 Python 3.5.2를 사용하였습니다.
(추후 이 파서를 사용하여 디스코드 봇을 만들때 사용되는 discord.py의 요구사항이 Python 3.4 이상이기 때문)
먼저, Beautifulsoup를 설치해 줍니다.
$pip3 install Beautifulsoup4
급식데이터를 추출할 페이지를 골라야 하는데요.
나이스 홈페이지 또는 해당 학교홈페이지에서 급식데이터를 가져올 수 있습니다.
그러나 학교홈페이지를 이용할 경우 학교홈페이지마다 구조가 약간씩 다르기 때문에,
나이스 홈페이지를 사용하여 진행하도록 하겠습니다.
그럼, 우리에게 필요한 URL을 구해보겠습니다.
(각자의 조건에 맞게 구하세요.)
1. 교육청 주소
나이스 학생서비스(https://stu.use.go.kr/) <----- 이동해 줍니다.
상단에 OOO교육청 이동하기를 통해 자신의 학교가 속한 교육청으로 이동해줍니다.
그리고 URL을 확인합니다. (ex 서울특별시교육청 : https://stu.sen.go.kr)
2. 학교고유코드
나의생활 > 학교안내 > 기본정보 에서 자신의 학교를 검색하고
해당 페이지의 쿠키값을 확인하면 우리에게 필요한 값들을 얻을 수 있습니다.
schulCode=B100000519 #우리가 검색한 학교의 고유 코드이다.
schulKndScCode=04 #01은 유치원, 02는 초등학교, 03은 중학교, 04는 고등학교를 의미한다.
schulCrseScCode=4 #1은 유치원, 2는 초등학교, 3은 중학교, 4는 고등학교를 의미한다.
쿠키값은 EditThisCookie 라는 크롬 확장프로그램을 사용하시면 됩니다.
3. 정확한 주소 구하기
우리는 주간식단 페이지에서 식단을 추출할 것이기에 주간식단 주소를 구해줍니다.
주간식단 주소 : /sts_sci_md01_001.do
이 주소 뒤에 쿼리값으로 위에서 구한 값들과, 아래 값을 담아 보내면 됩니다.
schMmealScCode=2 #1 조식, 2 중식, 3 석식
schYmd=2018.1.1 #2018년 1월 1일이 포함된 한 주(week), '.(점)'주의
4. 주소 확인하기
예시
http://stu.sen.go.kr/sts_sci_md01_001.do?schulCode=B100000519&schulCrseScCode=4&schulKndScCode=04&schMmealScCode=2&schYmd=2017.12.26
위와 같이 자신이 구한 주소를 요청하였을때, 자신이 적은 날짜(schYmd의 값)가 포함된 그 주의 식단이 표시되면 됩니다.
이제 코드를 작성해 봅시다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | import requests from bs4 import BeautifulSoup def get_html(url): _html = "" resp = requests.get(url) if resp.status_code == 200: _html = resp.text return _html def get_diet(code, ymd, weekday): schMmealScCode = code #int schYmd = ymd #str URL = ( "http://stu.sen.go.kr/sts_sci_md01_001.do?" "schulCode=B100000519&schulCrseScCode=4&schulKndScCode=04" "&schMmealScCode=%d&schYmd=%s" % (schMmealScCode, schYmd) ) html = get_html(URL) element = html return element
| cs |
나중에 사용하기 편하게 하기 위해 함수로 만들어 주었습니다.
get_html(url)은 해당 페이지의 html소스를 출력해 주는 함수입니다.
이 소스 하단에
28 29 | diet = get_diet(2, "2017.12.26") print(diet) | cs |
를 추가하면 2017년 12월 26일 중식에 대한 결과값을 출력해줍니다.
이 코드를 실행하면, 매우 긴 html소스를 볼 수 있습니다.
여기서 우리가 원하는 식단만을 추출해야 합니다.
나이스 홈페이지에 들어가서 소스를 확인하면,
식단이 3번째 tr 태그 안에, td 태그 안에 있는것을 알 수 있습니다.
이를 바탕으로 코드를 추가해 줍시다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | import requests from bs4 import BeautifulSoup import re def get_html(url): _html = "" resp = requests.get(url) if resp.status_code == 200: _html = resp.text return _html def get_diet(code, ymd, weekday): schMmealScCode = code #int schYmd = ymd #str num = weekday + 1 #int 0월1화2수3목4금5토6일 URL = ( "http://stu.sen.go.kr/sts_sci_md01_001.do?" "schulCode=B100000519&schulCrseScCode=4&schulKndScCode=04" "&schMmealScCode=%d&schYmd=%s" % (schMmealScCode, schYmd) ) html = get_html(URL) soup = BeautifulSoup(html, 'html.parser') element = soup.find_all("tr") element = element[2].find_all('td') try: element = element[num] #num element = str(element) element = element.replace('[', '') element = element.replace(']', '') element = element.replace('<br/>', '\n') element = element.replace('<td class="textC last">', '') element = element.replace('<td class="textC">', '') element = element.replace('</td>', '') element = element.replace('(h)', '') element = element.replace('.', '') element = re.sub(r"\d", "", element) except: element = " " return element | cs |
코드를 설명하면,
25~27: 아까 출력했던 html소스를 beautifulsoup에 넣어주고,
find_all()을 사용하여 tr태그를 추출하고, 추출한 tr태그들중 3번째에서 td태그를 추출합니다.
이렇게 하면 식단표를 추출해낼 수 있습니다. 여기서 우리가 필요한 것은 1주일 식단이 아닌 하루 식단이기 때문에
29:우리가 요청하는 날짜의 요일번째수의 td태그의 내용을 추출하면 됩다.
(datetime 모듈을 이용하여 요일값을 구하고 +1을 해주면 된다.)
30~39: 불필요한 문자열들이 포함되어 있으므로 모두 제거해 주면 됩니다.
Github : https://github.com/M4ndU/school_meal_parser_python
파서 활용하기 :
디스코드 챗봇 만들기
step1 바로가기 (http://mandu-mandu.tistory.com/64)
step2 바로가기 (http://mandu-mandu.tistory.com/65)
step3 바로가기 (http://mandu-mandu.tistory.com/66)
step4 바로가기 (http://mandu-mandu.tistory.com/91)
카카오톡 챗봇 만들기
step1 바로가기 (http://mandu-mandu.tistory.com/67)
step2 바로가기 (http://mandu-mandu.tistory.com/68)
디스코드 챗봇 소스 (https://github.com/M4ndU/inhun_discord_chat_bot_2)
카카오톡 챗봇 소스 (https://github.com/M4ndU/inhun_kakao_chat_bot_2)
'Project > Programming' 카테고리의 다른 글
[Python] Python으로 카카오톡 봇 만들기 (2) - 급식 파서 활용하기 (14) | 2018.02.22 |
---|---|
[Python] Python으로 카카오톡 봇 만들기 (1) - 봇 생성부터 테스트까지 (25) | 2018.02.21 |
[Python] Python으로 디스코드 봇 만들기 (3) - 부가적 기능 추가하기 (5) | 2018.02.19 |
[Python] Python으로 디스코드 봇 만들기 (2) - 급식 파서 활용하기 (0) | 2018.02.19 |
[Python] Python으로 디스코드 봇 만들기 (1) - 봇 생성부터 테스트까지 (76) | 2018.02.19 |